111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Locale support -*- C++ -*-
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (C) 2007-2014 Free Software Foundation, Inc.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is part of the GNU ISO C++ Library.  This library is free
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// software; you can redistribute it and/or modify it under the
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// terms of the GNU General Public License as published by the
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Free Software Foundation; either version 3, or (at your option)
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// any later version.
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This library is distributed in the hope that it will be useful,
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// but WITHOUT ANY WARRANTY; without even the implied warranty of
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// GNU General Public License for more details.
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Under Section 7 of GPL version 3, you are granted additional
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permissions described in the GCC Runtime Library Exception, version
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3.1, as published by the Free Software Foundation.
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You should have received a copy of the GNU General Public License and
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a copy of the GCC Runtime Library Exception along with this program;
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <http://www.gnu.org/licenses/>.
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/** @file bits/locale_facets_nonio.h
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  This is an internal header file, included by other library headers.
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  Do not attempt to use it directly. @headername{locale}
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// ISO C++ 14882: 22.1  Locales
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _LOCALE_FACETS_NONIO_H
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _LOCALE_FACETS_NONIO_H 1
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#pragma GCC system_header
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <ctime>	// For struct tm
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default)
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Time format ordering data.
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @ingroup locales
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  This class provides an enum representing different orderings of
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  time: day, month, and year.
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  */
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  class time_base
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  public:
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    enum dateorder { no_order, dmy, mdy, ymd, ydm };
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT>
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct __timepunct_cache : public locale::facet
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // List of all known timezones, with GMT first.
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static const _CharT*		_S_timezones[14];
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_date_format;
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_date_era_format;
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_time_format;
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_time_era_format;
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_date_time_format;
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_date_time_era_format;
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_am;
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_pm;
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_am_pm_format;
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Day names, starting with "C"'s Sunday.
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_day1;
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_day2;
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_day3;
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_day4;
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_day5;
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_day6;
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_day7;
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Abbreviated day names, starting with "C"'s Sun.
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_aday1;
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_aday2;
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_aday3;
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_aday4;
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_aday5;
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_aday6;
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_aday7;
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Month names, starting with "C"'s January.
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_month01;
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_month02;
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_month03;
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_month04;
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_month05;
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_month06;
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_month07;
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_month08;
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_month09;
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_month10;
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_month11;
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_month12;
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Abbreviated month names, starting with "C"'s Jan.
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_amonth01;
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_amonth02;
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_amonth03;
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_amonth04;
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_amonth05;
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_amonth06;
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_amonth07;
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_amonth08;
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_amonth09;
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_amonth10;
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_amonth11;
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_amonth12;
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool				_M_allocated;
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __timepunct_cache(size_t __refs = 0) : facet(__refs),
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_date_format(0), _M_date_era_format(0), _M_time_format(0),
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_time_era_format(0), _M_date_time_format(0),
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_date_time_era_format(0), _M_am(0), _M_pm(0),
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_am_pm_format(0), _M_day1(0), _M_day2(0), _M_day3(0),
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_day4(0), _M_day5(0), _M_day6(0), _M_day7(0),
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_aday1(0), _M_aday2(0), _M_aday3(0), _M_aday4(0),
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_aday5(0), _M_aday6(0), _M_aday7(0), _M_month01(0),
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_month02(0), _M_month03(0), _M_month04(0), _M_month05(0),
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_month06(0), _M_month07(0), _M_month08(0), _M_month09(0),
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_month10(0), _M_month11(0), _M_month12(0), _M_amonth01(0),
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_amonth02(0), _M_amonth03(0), _M_amonth04(0),
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_amonth05(0), _M_amonth06(0), _M_amonth07(0),
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_amonth08(0), _M_amonth09(0), _M_amonth10(0),
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_amonth11(0), _M_amonth12(0), _M_allocated(false)
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~__timepunct_cache();
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_cache(const locale& __loc);
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __timepunct_cache&
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator=(const __timepunct_cache&);
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __timepunct_cache(const __timepunct_cache&);
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT>
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __timepunct_cache<_CharT>::~__timepunct_cache()
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (_M_allocated)
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  // Unused.
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Specializations.
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const char*
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __timepunct_cache<char>::_S_timezones[14];
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_USE_WCHAR_T
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const wchar_t*
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __timepunct_cache<wchar_t>::_S_timezones[14];
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Generic.
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT>
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const _CharT* __timepunct_cache<_CharT>::_S_timezones[14];
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT>
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class __timepunct : public locale::facet
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Types:
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _CharT			__char_type;
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef basic_string<_CharT>	__string_type;
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __timepunct_cache<_CharT>	__cache_type;
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __cache_type*			_M_data;
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __c_locale			_M_c_locale_timepunct;
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const char*			_M_name_timepunct;
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Numpunct facet id.
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static locale::id			id;
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __timepunct(size_t __refs = 0);
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __timepunct(__cache_type* __cache, size_t __refs = 0);
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Internal constructor. Not for general use.
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This is a constructor for use by the library itself to set up new
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  locales.
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __cloc  The C locale.
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __s  The name of a locale.
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param refs  Passed to the base facet class.
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0);
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // FIXME: for error checking purposes _M_put should return the return
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // value of strftime/wcsftime.
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_put(_CharT* __s, size_t __maxlen, const _CharT* __format,
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     const tm* __tm) const throw ();
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_date_formats(const _CharT** __date) const
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	// Always have default first.
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__date[0] = _M_data->_M_date_format;
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__date[1] = _M_data->_M_date_era_format;
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_time_formats(const _CharT** __time) const
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	// Always have default first.
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__time[0] = _M_data->_M_time_format;
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__time[1] = _M_data->_M_time_era_format;
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_date_time_formats(const _CharT** __dt) const
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	// Always have default first.
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__dt[0] = _M_data->_M_date_time_format;
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__dt[1] = _M_data->_M_date_time_era_format;
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_am_pm_format(const _CharT* __ampm) const
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { __ampm = _M_data->_M_am_pm_format; }
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_am_pm(const _CharT** __ampm) const
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__ampm[0] = _M_data->_M_am;
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__ampm[1] = _M_data->_M_pm;
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_days(const _CharT** __days) const
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[0] = _M_data->_M_day1;
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[1] = _M_data->_M_day2;
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[2] = _M_data->_M_day3;
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[3] = _M_data->_M_day4;
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[4] = _M_data->_M_day5;
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[5] = _M_data->_M_day6;
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[6] = _M_data->_M_day7;
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_days_abbreviated(const _CharT** __days) const
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[0] = _M_data->_M_aday1;
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[1] = _M_data->_M_aday2;
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[2] = _M_data->_M_aday3;
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[3] = _M_data->_M_aday4;
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[4] = _M_data->_M_aday5;
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[5] = _M_data->_M_aday6;
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__days[6] = _M_data->_M_aday7;
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_months(const _CharT** __months) const
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[0] = _M_data->_M_month01;
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[1] = _M_data->_M_month02;
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[2] = _M_data->_M_month03;
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[3] = _M_data->_M_month04;
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[4] = _M_data->_M_month05;
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[5] = _M_data->_M_month06;
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[6] = _M_data->_M_month07;
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[7] = _M_data->_M_month08;
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[8] = _M_data->_M_month09;
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[9] = _M_data->_M_month10;
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[10] = _M_data->_M_month11;
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[11] = _M_data->_M_month12;
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_months_abbreviated(const _CharT** __months) const
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[0] = _M_data->_M_amonth01;
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[1] = _M_data->_M_amonth02;
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[2] = _M_data->_M_amonth03;
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[3] = _M_data->_M_amonth04;
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[4] = _M_data->_M_amonth05;
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[5] = _M_data->_M_amonth06;
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[6] = _M_data->_M_amonth07;
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[7] = _M_data->_M_amonth08;
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[8] = _M_data->_M_amonth09;
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[9] = _M_data->_M_amonth10;
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[10] = _M_data->_M_amonth11;
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__months[11] = _M_data->_M_amonth12;
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~__timepunct();
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // For use at construction time only.
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_initialize_timepunct(__c_locale __cloc = 0);
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT>
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    locale::id __timepunct<_CharT>::id;
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Specializations.
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc);
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __timepunct<char>::_M_put(char*, size_t, const char*, const tm*) const throw ();
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_USE_WCHAR_T
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc);
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __timepunct<wchar_t>::_M_put(wchar_t*, size_t, const wchar_t*,
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				 const tm*) const throw ();
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // Include host and configuration specific timepunct functions.
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  #include <bits/time_members.h>
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default)
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Primary class template time_get.
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @ingroup locales
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  This facet encapsulates the code to parse and return a date or
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  time from a string.  It is used by the istream numeric
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  extraction operators.
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The time_get template uses protected virtual functions to provide the
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  actual results.  The public accessors forward the call to the virtual
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  functions.  These virtual functions are hooks for developers to
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  implement the behavior they require from the time_get facet.
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  */
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, typename _InIter>
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class time_get : public locale::facet, public time_base
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Types:
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@{
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Public typedefs
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _CharT			char_type;
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _InIter			iter_type;
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@}
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef basic_string<_CharT>	__string_type;
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Numpunct facet id.
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static locale::id			id;
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Constructor performs initialization.
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This is the constructor provided by the standard.
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __refs  Passed to the base facet class.
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      time_get(size_t __refs = 0)
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : facet (__refs) { }
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return preferred order of month, day, and year.
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns an enum from timebase::dateorder giving the
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  preferred ordering if the format @a x given to time_put::put() only
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  uses month, day, and year.  If the format @a x for the associated
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  locale uses other fields, this function returns
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  timebase::dateorder::noorder.
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  NOTE: The library always returns noorder at the moment.
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  A member of timebase::dateorder.
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      dateorder
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      date_order()  const
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_date_order(); }
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Parse input time string.
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function parses a time according to the format @a X and puts the
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  results into a user-supplied struct tm.  The result is returned by
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  calling time_get::do_get_time().
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  If there is a valid time string according to format @a X, @a tm will
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  be filled in accordingly and the returned iterator will point to the
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  first character beyond the time string.  If an error occurs before
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  the end, err |= ios_base::failbit.  If parsing reads all the
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  characters, err |= ios_base::eofbit.
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __beg  Start of string to parse.
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __end  End of string to parse.
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of the locale.
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __err  Error flags to set.
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tm  Pointer to struct tm to fill in.
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator to first char beyond time string.
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      get_time(iter_type __beg, iter_type __end, ios_base& __io,
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       ios_base::iostate& __err, tm* __tm)  const
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_get_time(__beg, __end, __io, __err, __tm); }
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Parse input date string.
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function parses a date according to the format @a x and puts the
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  results into a user-supplied struct tm.  The result is returned by
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  calling time_get::do_get_date().
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  If there is a valid date string according to format @a x, @a tm will
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  be filled in accordingly and the returned iterator will point to the
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  first character beyond the date string.  If an error occurs before
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  the end, err |= ios_base::failbit.  If parsing reads all the
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  characters, err |= ios_base::eofbit.
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __beg  Start of string to parse.
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __end  End of string to parse.
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of the locale.
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __err  Error flags to set.
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tm  Pointer to struct tm to fill in.
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator to first char beyond date string.
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      get_date(iter_type __beg, iter_type __end, ios_base& __io,
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       ios_base::iostate& __err, tm* __tm)  const
45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_get_date(__beg, __end, __io, __err, __tm); }
45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Parse input weekday string.
46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function parses a weekday name and puts the results into a
46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  user-supplied struct tm.  The result is returned by calling
46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  time_get::do_get_weekday().
46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Parsing starts by parsing an abbreviated weekday name.  If a valid
46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  abbreviation is followed by a character that would lead to the full
46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  weekday name, parsing continues until the full name is found or an
47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  error occurs.  Otherwise parsing finishes at the end of the
47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  abbreviated name.
47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  If an error occurs before the end, err |= ios_base::failbit.  If
47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  parsing reads all the characters, err |= ios_base::eofbit.
47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __beg  Start of string to parse.
47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __end  End of string to parse.
47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of the locale.
47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __err  Error flags to set.
48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tm  Pointer to struct tm to fill in.
48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator to first char beyond weekday name.
48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      get_weekday(iter_type __beg, iter_type __end, ios_base& __io,
48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		  ios_base::iostate& __err, tm* __tm) const
48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_get_weekday(__beg, __end, __io, __err, __tm); }
48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Parse input month string.
49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function parses a month name and puts the results into a
49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  user-supplied struct tm.  The result is returned by calling
49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  time_get::do_get_monthname().
49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Parsing starts by parsing an abbreviated month name.  If a valid
49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  abbreviation is followed by a character that would lead to the full
49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  month name, parsing continues until the full name is found or an
49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  error occurs.  Otherwise parsing finishes at the end of the
49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  abbreviated name.
50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  If an error occurs before the end, err |= ios_base::failbit.  If
50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  parsing reads all the characters, err |=
50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  ios_base::eofbit.
50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __beg  Start of string to parse.
50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __end  End of string to parse.
50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of the locale.
50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __err  Error flags to set.
50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tm  Pointer to struct tm to fill in.
51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator to first char beyond month name.
51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      get_monthname(iter_type __beg, iter_type __end, ios_base& __io,
51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    ios_base::iostate& __err, tm* __tm) const
51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_get_monthname(__beg, __end, __io, __err, __tm); }
51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Parse input year string.
51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function reads up to 4 characters to parse a year string and
52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  puts the results into a user-supplied struct tm.  The result is
52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  returned by calling time_get::do_get_year().
52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  4 consecutive digits are interpreted as a full year.  If there are
52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  exactly 2 consecutive digits, the library interprets this as the
52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  number of years since 1900.
52711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  If an error occurs before the end, err |= ios_base::failbit.  If
52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  parsing reads all the characters, err |= ios_base::eofbit.
53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
53111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __beg  Start of string to parse.
53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __end  End of string to parse.
53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of the locale.
53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __err  Error flags to set.
53511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tm  Pointer to struct tm to fill in.
53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator to first char beyond year.
53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      get_year(iter_type __beg, iter_type __end, ios_base& __io,
54011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       ios_base::iostate& __err, tm* __tm) const
54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_get_year(__beg, __end, __io, __err, __tm); }
54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
54411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Destructor.
54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual
54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~time_get() { }
54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return preferred order of month, day, and year.
55011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns an enum from timebase::dateorder giving the
55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  preferred ordering if the format @a x given to time_put::put() only
55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  uses month, day, and year.  This function is a hook for derived
55411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  classes to change the value returned.
55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  A member of timebase::dateorder.
55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual dateorder
55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_date_order() const;
56011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
56111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Parse input time string.
56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function parses a time according to the format @a x and puts the
56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  results into a user-supplied struct tm.  This function is a hook for
56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  derived classes to change the value returned.  @see get_time() for
56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  details.
56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
56911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __beg  Start of string to parse.
57011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __end  End of string to parse.
57111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of the locale.
57211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __err  Error flags to set.
57311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tm  Pointer to struct tm to fill in.
57411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator to first char beyond time string.
57511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
57611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
57711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_get_time(iter_type __beg, iter_type __end, ios_base& __io,
57811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		  ios_base::iostate& __err, tm* __tm) const;
57911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
58011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
58111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Parse input date string.
58211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
58311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function parses a date according to the format @a X and puts the
58411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  results into a user-supplied struct tm.  This function is a hook for
58511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  derived classes to change the value returned.  @see get_date() for
58611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  details.
58711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
58811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __beg  Start of string to parse.
58911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __end  End of string to parse.
59011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of the locale.
59111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __err  Error flags to set.
59211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tm  Pointer to struct tm to fill in.
59311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator to first char beyond date string.
59411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
59511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
59611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_get_date(iter_type __beg, iter_type __end, ios_base& __io,
59711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		  ios_base::iostate& __err, tm* __tm) const;
59811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
59911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
60011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Parse input weekday string.
60111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
60211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function parses a weekday name and puts the results into a
60311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  user-supplied struct tm.  This function is a hook for derived
60411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  classes to change the value returned.  @see get_weekday() for
60511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  details.
60611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
60711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __beg  Start of string to parse.
60811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __end  End of string to parse.
60911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of the locale.
61011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __err  Error flags to set.
61111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tm  Pointer to struct tm to fill in.
61211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator to first char beyond weekday name.
61311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
61411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
61511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_get_weekday(iter_type __beg, iter_type __end, ios_base&,
61611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		     ios_base::iostate& __err, tm* __tm) const;
61711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
61811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
61911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Parse input month string.
62011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
62111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function parses a month name and puts the results into a
62211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  user-supplied struct tm.  This function is a hook for derived
62311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  classes to change the value returned.  @see get_monthname() for
62411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  details.
62511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
62611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __beg  Start of string to parse.
62711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __end  End of string to parse.
62811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of the locale.
62911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __err  Error flags to set.
63011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tm  Pointer to struct tm to fill in.
63111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator to first char beyond month name.
63211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
63311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
63411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_get_monthname(iter_type __beg, iter_type __end, ios_base&,
63511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		       ios_base::iostate& __err, tm* __tm) const;
63611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
63711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
63811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Parse input year string.
63911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
64011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function reads up to 4 characters to parse a year string and
64111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  puts the results into a user-supplied struct tm.  This function is a
64211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  hook for derived classes to change the value returned.  @see
64311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  get_year() for details.
64411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
64511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __beg  Start of string to parse.
64611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __end  End of string to parse.
64711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of the locale.
64811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __err  Error flags to set.
64911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tm  Pointer to struct tm to fill in.
65011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator to first char beyond year.
65111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
65211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
65311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_get_year(iter_type __beg, iter_type __end, ios_base& __io,
65411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		  ios_base::iostate& __err, tm* __tm) const;
65511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
65611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Extract numeric component of length __len.
65711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
65811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_extract_num(iter_type __beg, iter_type __end, int& __member,
65911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		     int __min, int __max, size_t __len,
66011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		     ios_base& __io, ios_base::iostate& __err) const;
66111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
66211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Extract any unique array of string literals in a const _CharT* array.
66311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
66411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_extract_name(iter_type __beg, iter_type __end, int& __member,
66511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		      const _CharT** __names, size_t __indexlen,
66611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		      ios_base& __io, ios_base::iostate& __err) const;
66711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
66811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Extract day or month name in a const _CharT* array.
66911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
67011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_extract_wday_or_month(iter_type __beg, iter_type __end, int& __member,
67111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			       const _CharT** __names, size_t __indexlen,
67211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			       ios_base& __io, ios_base::iostate& __err) const;
67311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
67411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Extract on a component-by-component basis, via __format argument.
67511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
67611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_extract_via_format(iter_type __beg, iter_type __end, ios_base& __io,
67711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			    ios_base::iostate& __err, tm* __tm,
67811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			    const _CharT* __format) const;
67911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
68011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
68111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, typename _InIter>
68211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    locale::id time_get<_CharT, _InIter>::id;
68311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
68411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// class time_get_byname [22.2.5.2].
68511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, typename _InIter>
68611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class time_get_byname : public time_get<_CharT, _InIter>
68711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
68811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
68911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Types:
69011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _CharT			char_type;
69111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _InIter			iter_type;
69211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
69311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
69411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      time_get_byname(const char*, size_t __refs = 0)
69511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : time_get<_CharT, _InIter>(__refs) { }
69611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
69711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
69811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual
69911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~time_get_byname() { }
70011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
70111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
70211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
70311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Primary class template time_put.
70411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @ingroup locales
70511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
70611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  This facet encapsulates the code to format and output dates and times
70711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  according to formats used by strftime().
70811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
70911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The time_put template uses protected virtual functions to provide the
71011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  actual results.  The public accessors forward the call to the virtual
71111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  functions.  These virtual functions are hooks for developers to
71211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  implement the behavior they require from the time_put facet.
71311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  */
71411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, typename _OutIter>
71511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class time_put : public locale::facet
71611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
71711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
71811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Types:
71911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@{
72011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Public typedefs
72111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _CharT			char_type;
72211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _OutIter			iter_type;
72311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@}
72411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
72511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Numpunct facet id.
72611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static locale::id			id;
72711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
72811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
72911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Constructor performs initialization.
73011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
73111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This is the constructor provided by the standard.
73211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
73311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __refs  Passed to the base facet class.
73411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
73511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
73611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      time_put(size_t __refs = 0)
73711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : facet(__refs) { }
73811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
73911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
74011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Format and output a time or date.
74111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
74211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function formats the data in struct tm according to the
74311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  provided format string.  The format string is interpreted as by
74411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  strftime().
74511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
74611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The stream to write to.
74711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of locale.
74811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __fill  char_type to use for padding.
74911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tm  Struct tm with date and time info to format.
75011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __beg  Start of format string.
75111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __end  End of format string.
75211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator after writing.
75311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
75411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
75511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
75611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  const _CharT* __beg, const _CharT* __end) const;
75711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
75811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
75911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Format and output a time or date.
76011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
76111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function formats the data in struct tm according to the
76211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  provided format char and optional modifier.  The format and modifier
76311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  are interpreted as by strftime().  It does so by returning
76411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  time_put::do_put().
76511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
76611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The stream to write to.
76711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of locale.
76811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __fill  char_type to use for padding.
76911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tm  Struct tm with date and time info to format.
77011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __format  Format char.
77111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __mod  Optional modifier char.
77211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator after writing.
77311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
77411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
77511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      put(iter_type __s, ios_base& __io, char_type __fill,
77611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  const tm* __tm, char __format, char __mod = 0) const
77711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_put(__s, __io, __fill, __tm, __format, __mod); }
77811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
77911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
78011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Destructor.
78111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual
78211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~time_put()
78311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
78411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
78511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
78611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Format and output a time or date.
78711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
78811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function formats the data in struct tm according to the
78911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  provided format char and optional modifier.  This function is a hook
79011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  for derived classes to change the value returned.  @see put() for
79111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  more details.
79211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
79311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The stream to write to.
79411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of locale.
79511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __fill  char_type to use for padding.
79611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __tm  Struct tm with date and time info to format.
79711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __format  Format char.
79811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __mod  Optional modifier char.
79911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator after writing.
80011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
80111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
80211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
80311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     char __format, char __mod) const;
80411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
80511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
80611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, typename _OutIter>
80711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    locale::id time_put<_CharT, _OutIter>::id;
80811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
80911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// class time_put_byname [22.2.5.4].
81011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, typename _OutIter>
81111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class time_put_byname : public time_put<_CharT, _OutIter>
81211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
81311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
81411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Types:
81511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _CharT			char_type;
81611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _OutIter			iter_type;
81711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
81811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
81911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      time_put_byname(const char*, size_t __refs = 0)
82011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : time_put<_CharT, _OutIter>(__refs)
82111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { };
82211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
82311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
82411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual
82511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~time_put_byname() { }
82611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
82711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
82811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
82911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
83011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Money format ordering data.
83111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @ingroup locales
83211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
83311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  This class contains an ordered array of 4 fields to represent the
83411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  pattern for formatting a money amount.  Each field may contain one entry
83511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  from the part enum.  symbol, sign, and value must be present and the
83611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  remaining field must contain either none or space.  @see
83711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  moneypunct::pos_format() and moneypunct::neg_format() for details of how
83811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  these fields are interpreted.
83911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  */
84011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  class money_base
84111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
84211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  public:
84311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    enum part { none, space, symbol, sign, value };
84411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct pattern { char field[4]; };
84511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
84611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static const pattern _S_default_pattern;
84711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
84811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    enum
84911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
85011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _S_minus,
85111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _S_zero,
85211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _S_end = 11
85311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
85411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
85511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // String literal of acceptable (narrow) input/output, for
85611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // money_get/money_put. "-0123456789"
85711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static const char* _S_atoms;
85811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
85911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // Construct and return valid pattern consisting of some combination of:
86011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // space none symbol sign value
86111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _GLIBCXX_CONST static pattern
86211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _S_construct_pattern(char __precedes, char __space, char __posn) throw ();
86311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
86411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
86511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, bool _Intl>
86611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct __moneypunct_cache : public locale::facet
86711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
86811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const char*			_M_grouping;
86911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_t                            _M_grouping_size;
87011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool				_M_use_grouping;
87111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _CharT				_M_decimal_point;
87211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _CharT				_M_thousands_sep;
87311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_curr_symbol;
87411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_t                            _M_curr_symbol_size;
87511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_positive_sign;
87611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_t                            _M_positive_sign_size;
87711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CharT*			_M_negative_sign;
87811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_t                            _M_negative_sign_size;
87911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      int				_M_frac_digits;
88011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      money_base::pattern		_M_pos_format;
88111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      money_base::pattern	        _M_neg_format;
88211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
88311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // A list of valid numeric literals for input and output: in the standard
88411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // "C" locale, this is "-0123456789". This array contains the chars after
88511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // having been passed through the current locale's ctype<_CharT>.widen().
88611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _CharT				_M_atoms[money_base::_S_end];
88711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
88811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool				_M_allocated;
88911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
89011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __moneypunct_cache(size_t __refs = 0) : facet(__refs),
89111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_grouping(0), _M_grouping_size(0), _M_use_grouping(false),
89211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_decimal_point(_CharT()), _M_thousands_sep(_CharT()),
89311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_curr_symbol(0), _M_curr_symbol_size(0),
89411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_positive_sign(0), _M_positive_sign_size(0),
89511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_negative_sign(0), _M_negative_sign_size(0),
89611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_frac_digits(0),
89711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_pos_format(money_base::pattern()),
89811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_neg_format(money_base::pattern()), _M_allocated(false)
89911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
90011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
90111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~__moneypunct_cache();
90211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
90311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
90411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_cache(const locale& __loc);
90511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
90611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
90711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __moneypunct_cache&
90811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator=(const __moneypunct_cache&);
90911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
91011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
91111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __moneypunct_cache(const __moneypunct_cache&);
91211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
91311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
91411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, bool _Intl>
91511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __moneypunct_cache<_CharT, _Intl>::~__moneypunct_cache()
91611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
91711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (_M_allocated)
91811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
91911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  delete [] _M_grouping;
92011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  delete [] _M_curr_symbol;
92111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  delete [] _M_positive_sign;
92211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  delete [] _M_negative_sign;
92311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
92411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
92511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
92611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
92711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Primary class template moneypunct.
92811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @ingroup locales
92911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
93011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  This facet encapsulates the punctuation, grouping and other formatting
93111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  features of money amount string representations.
93211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  */
93311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, bool _Intl>
93411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class moneypunct : public locale::facet, public money_base
93511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
93611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
93711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Types:
93811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@{
93911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Public typedefs
94011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _CharT			char_type;
94111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef basic_string<_CharT>	string_type;
94211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@}
94311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef __moneypunct_cache<_CharT, _Intl>     __cache_type;
94411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
94511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
94611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __cache_type*			_M_data;
94711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
94811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
94911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// This value is provided by the standard, but no reason for its
95011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// existence.
95111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static const bool			intl = _Intl;
95211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Numpunct facet id.
95311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static locale::id			id;
95411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
95511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
95611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Constructor performs initialization.
95711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
95811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This is the constructor provided by the standard.
95911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
96011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __refs  Passed to the base facet class.
96111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
96211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
96311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      moneypunct(size_t __refs = 0)
96411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : facet(__refs), _M_data(0)
96511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_initialize_moneypunct(); }
96611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
96711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
96811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Constructor performs initialization.
96911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
97011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This is an internal constructor.
97111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
97211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __cache  Cache for optimization.
97311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __refs  Passed to the base facet class.
97411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
97511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
97611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      moneypunct(__cache_type* __cache, size_t __refs = 0)
97711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : facet(__refs), _M_data(__cache)
97811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_initialize_moneypunct(); }
97911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
98011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
98111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Internal constructor. Not for general use.
98211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
98311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This is a constructor for use by the library itself to set up new
98411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  locales.
98511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
98611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __cloc  The C locale.
98711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __s  The name of a locale.
98811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __refs  Passed to the base facet class.
98911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
99011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
99111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      moneypunct(__c_locale __cloc, const char* __s, size_t __refs = 0)
99211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : facet(__refs), _M_data(0)
99311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_initialize_moneypunct(__cloc, __s); }
99411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
99511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
99611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return decimal point character.
99711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
99811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns a char_type to use as a decimal point.  It
99911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  does so by returning returning
100011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  moneypunct<char_type>::do_decimal_point().
100111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
100211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  @a char_type representing a decimal point.
100311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
100411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      char_type
100511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      decimal_point() const
100611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_decimal_point(); }
100711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
100811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
100911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return thousands separator character.
101011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
101111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns a char_type to use as a thousands
101211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  separator.  It does so by returning returning
101311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  moneypunct<char_type>::do_thousands_sep().
101411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
101511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  char_type representing a thousands separator.
101611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
101711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      char_type
101811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      thousands_sep() const
101911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_thousands_sep(); }
102011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
102111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
102211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return grouping specification.
102311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
102411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns a string representing groupings for the
102511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  integer part of an amount.  Groupings indicate where thousands
102611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  separators should be inserted.
102711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
102811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Each char in the return string is interpret as an integer rather
102911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  than a character.  These numbers represent the number of digits in a
103011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  group.  The first char in the string represents the number of digits
103111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  in the least significant group.  If a char is negative, it indicates
103211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  an unlimited number of digits for the group.  If more chars from the
103311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  string are required to group a number, the last char is used
103411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  repeatedly.
103511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
103611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  For example, if the grouping() returns <code>\003\002</code>
103711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  and is applied to the number 123456789, this corresponds to
103811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  12,34,56,789.  Note that if the string was <code>32</code>, this would
103911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  put more than 50 digits into the least significant group if
104011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  the character set is ASCII.
104111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
104211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  The string is returned by calling
104311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  moneypunct<char_type>::do_grouping().
104411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
104511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  string representing grouping specification.
104611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
104711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      string
104811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      grouping() const
104911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_grouping(); }
105011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
105111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
105211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return currency symbol string.
105311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
105411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns a string_type to use as a currency symbol.  It
105511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  does so by returning returning
105611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  moneypunct<char_type>::do_curr_symbol().
105711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
105811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  @a string_type representing a currency symbol.
105911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
106011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      string_type
106111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      curr_symbol() const
106211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_curr_symbol(); }
106311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
106411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
106511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return positive sign string.
106611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
106711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns a string_type to use as a sign for positive
106811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  amounts.  It does so by returning returning
106911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  moneypunct<char_type>::do_positive_sign().
107011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
107111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  If the return value contains more than one character, the first
107211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  character appears in the position indicated by pos_format() and the
107311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  remainder appear at the end of the formatted string.
107411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
107511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  @a string_type representing a positive sign.
107611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
107711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      string_type
107811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      positive_sign() const
107911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_positive_sign(); }
108011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
108111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
108211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return negative sign string.
108311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
108411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns a string_type to use as a sign for negative
108511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  amounts.  It does so by returning returning
108611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  moneypunct<char_type>::do_negative_sign().
108711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
108811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  If the return value contains more than one character, the first
108911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  character appears in the position indicated by neg_format() and the
109011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  remainder appear at the end of the formatted string.
109111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
109211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  @a string_type representing a negative sign.
109311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
109411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      string_type
109511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      negative_sign() const
109611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_negative_sign(); }
109711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
109811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
109911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return number of digits in fraction.
110011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
110111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns the exact number of digits that make up the
110211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  fractional part of a money amount.  It does so by returning
110311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  returning moneypunct<char_type>::do_frac_digits().
110411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
110511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  The fractional part of a money amount is optional.  But if it is
110611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  present, there must be frac_digits() digits.
110711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
110811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Number of digits in amount fraction.
110911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
111011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      int
111111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      frac_digits() const
111211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_frac_digits(); }
111311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
111411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@{
111511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
111611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return pattern for money values.
111711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
111811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns a pattern describing the formatting of a
111911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  positive or negative valued money amount.  It does so by returning
112011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  returning moneypunct<char_type>::do_pos_format() or
112111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  moneypunct<char_type>::do_neg_format().
112211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
112311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  The pattern has 4 fields describing the ordering of symbol, sign,
112411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  value, and none or space.  There must be one of each in the pattern.
112511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  The none and space enums may not appear in the first field and space
112611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  may not appear in the final field.
112711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
112811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  The parts of a money string must appear in the order indicated by
112911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  the fields of the pattern.  The symbol field indicates that the
113011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  value of curr_symbol() may be present.  The sign field indicates
113111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  that the value of positive_sign() or negative_sign() must be
113211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  present.  The value field indicates that the absolute value of the
113311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  money amount is present.  none indicates 0 or more whitespace
113411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  characters, except at the end, where it permits no whitespace.
113511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  space indicates that 1 or more whitespace characters must be
113611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  present.
113711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
113811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  For example, for the US locale and pos_format() pattern
113911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  {symbol,sign,value,none}, curr_symbol() == &apos;$&apos;
114011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  positive_sign() == &apos;+&apos;, and value 10.01, and
114111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  options set to force the symbol, the corresponding string is
114211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  <code>$+10.01</code>.
114311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
114411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Pattern for money values.
114511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
114611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      pattern
114711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      pos_format() const
114811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_pos_format(); }
114911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
115011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      pattern
115111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      neg_format() const
115211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_neg_format(); }
115311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@}
115411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
115511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
115611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Destructor.
115711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual
115811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~moneypunct();
115911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
116011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
116111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return decimal point character.
116211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
116311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns a char_type to use as a decimal point.  This function is a
116411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  hook for derived classes to change the value returned.
116511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
116611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  @a char_type representing a decimal point.
116711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
116811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual char_type
116911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_decimal_point() const
117011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_data->_M_decimal_point; }
117111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
117211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
117311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return thousands separator character.
117411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
117511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns a char_type to use as a thousands separator.  This function
117611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  is a hook for derived classes to change the value returned.
117711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
117811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  @a char_type representing a thousands separator.
117911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
118011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual char_type
118111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_thousands_sep() const
118211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_data->_M_thousands_sep; }
118311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
118411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
118511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return grouping specification.
118611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
118711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns a string representing groupings for the integer part of a
118811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  number.  This function is a hook for derived classes to change the
118911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  value returned.  @see grouping() for details.
119011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
119111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  String representing grouping specification.
119211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
119311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual string
119411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_grouping() const
119511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_data->_M_grouping; }
119611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
119711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
119811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return currency symbol string.
119911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
120011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns a string_type to use as a currency symbol.
120111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function is a hook for derived classes to change the value
120211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  returned.  @see curr_symbol() for details.
120311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
120411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  @a string_type representing a currency symbol.
120511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
120611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual string_type
120711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_curr_symbol()   const
120811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_data->_M_curr_symbol; }
120911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
121011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
121111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return positive sign string.
121211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
121311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns a string_type to use as a sign for positive
121411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  amounts.  This function is a hook for derived classes to change the
121511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  value returned.  @see positive_sign() for details.
121611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
121711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  @a string_type representing a positive sign.
121811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
121911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual string_type
122011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_positive_sign() const
122111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_data->_M_positive_sign; }
122211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
122311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
122411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return negative sign string.
122511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
122611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns a string_type to use as a sign for negative
122711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  amounts.  This function is a hook for derived classes to change the
122811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  value returned.  @see negative_sign() for details.
122911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
123011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  @a string_type representing a negative sign.
123111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
123211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual string_type
123311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_negative_sign() const
123411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_data->_M_negative_sign; }
123511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
123611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
123711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return number of digits in fraction.
123811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
123911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns the exact number of digits that make up the
124011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  fractional part of a money amount.  This function is a hook for
124111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  derived classes to change the value returned.  @see frac_digits()
124211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  for details.
124311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
124411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Number of digits in amount fraction.
124511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
124611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual int
124711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_frac_digits() const
124811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_data->_M_frac_digits; }
124911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
125011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
125111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return pattern for money values.
125211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
125311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns a pattern describing the formatting of a
125411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  positive valued money amount.  This function is a hook for derived
125511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  classes to change the value returned.  @see pos_format() for
125611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  details.
125711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
125811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Pattern for money values.
125911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
126011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual pattern
126111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_pos_format() const
126211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_data->_M_pos_format; }
126311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
126411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
126511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return pattern for money values.
126611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
126711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function returns a pattern describing the formatting of a
126811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  negative valued money amount.  This function is a hook for derived
126911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  classes to change the value returned.  @see neg_format() for
127011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  details.
127111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
127211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Pattern for money values.
127311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
127411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual pattern
127511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_neg_format() const
127611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_data->_M_neg_format; }
127711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
127811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // For use at construction time only.
127911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       void
128011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       _M_initialize_moneypunct(__c_locale __cloc = 0,
128111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				const char* __name = 0);
128211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
128311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
128411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, bool _Intl>
128511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    locale::id moneypunct<_CharT, _Intl>::id;
128611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
128711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, bool _Intl>
128811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const bool moneypunct<_CharT, _Intl>::intl;
128911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
129011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
129111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    moneypunct<char, true>::~moneypunct();
129211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
129311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
129411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    moneypunct<char, false>::~moneypunct();
129511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
129611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
129711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
129811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    moneypunct<char, true>::_M_initialize_moneypunct(__c_locale, const char*);
129911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
130011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
130111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
130211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    moneypunct<char, false>::_M_initialize_moneypunct(__c_locale, const char*);
130311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
130411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_USE_WCHAR_T
130511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
130611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    moneypunct<wchar_t, true>::~moneypunct();
130711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
130811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
130911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    moneypunct<wchar_t, false>::~moneypunct();
131011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
131111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
131211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
131311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale,
131411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert							const char*);
131511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
131611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
131711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void
131811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale,
131911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert							 const char*);
132011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
132111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
132211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// class moneypunct_byname [22.2.6.4].
132311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, bool _Intl>
132411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class moneypunct_byname : public moneypunct<_CharT, _Intl>
132511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
132611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
132711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _CharT			char_type;
132811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef basic_string<_CharT>	string_type;
132911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
133011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static const bool intl = _Intl;
133111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
133211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
133311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      moneypunct_byname(const char* __s, size_t __refs = 0)
133411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : moneypunct<_CharT, _Intl>(__refs)
133511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
133611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (__builtin_strcmp(__s, "C") != 0
133711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    && __builtin_strcmp(__s, "POSIX") != 0)
133811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  {
133911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    __c_locale __tmp;
134011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    this->_S_create_c_locale(__tmp, __s);
134111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    this->_M_initialize_moneypunct(__tmp);
134211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    this->_S_destroy_c_locale(__tmp);
134311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  }
134411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
134511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
134611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
134711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual
134811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~moneypunct_byname() { }
134911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
135011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
135111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, bool _Intl>
135211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const bool moneypunct_byname<_CharT, _Intl>::intl;
135311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
135411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_LDBL
135511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
135611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
135711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Primary class template money_get.
135811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @ingroup locales
135911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
136011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  This facet encapsulates the code to parse and return a monetary
136111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  amount from a string.
136211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
136311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The money_get template uses protected virtual functions to
136411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  provide the actual results.  The public accessors forward the
136511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  call to the virtual functions.  These virtual functions are
136611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  hooks for developers to implement the behavior they require from
136711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  the money_get facet.
136811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  */
136911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, typename _InIter>
137011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class money_get : public locale::facet
137111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
137211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
137311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Types:
137411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@{
137511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Public typedefs
137611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _CharT			char_type;
137711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _InIter			iter_type;
137811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef basic_string<_CharT>	string_type;
137911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@}
138011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
138111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Numpunct facet id.
138211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static locale::id			id;
138311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
138411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
138511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Constructor performs initialization.
138611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
138711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This is the constructor provided by the standard.
138811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
138911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __refs  Passed to the base facet class.
139011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
139111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
139211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      money_get(size_t __refs = 0) : facet(__refs) { }
139311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
139411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
139511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Read and parse a monetary value.
139611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
139711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function reads characters from @a __s, interprets them as a
139811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  monetary value according to moneypunct and ctype facets retrieved
139911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  from io.getloc(), and returns the result in @a units as an integral
140011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  value moneypunct::frac_digits() * the actual amount.  For example,
140111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  the string $10.01 in a US locale would store 1001 in @a units.
140211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
140311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Any characters not part of a valid money amount are not consumed.
140411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
140511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  If a money value cannot be parsed from the input stream, sets
140611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  err=(err|io.failbit).  If the stream is consumed before finishing
140711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  parsing,  sets err=(err|io.failbit|io.eofbit).  @a units is
140811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  unchanged if parsing fails.
140911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
141011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function works by returning the result of do_get().
141111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
141211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  Start of characters to parse.
141311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __end  End of characters to parse.
141411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __intl  Parameter to use_facet<moneypunct<CharT,intl> >.
141511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of facets and io state.
141611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __err  Error field to set if parsing fails.
141711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __units  Place to store result of parsing.
141811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator referencing first character beyond valid money
141911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *	   amount.
142011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
142111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
142211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
142311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  ios_base::iostate& __err, long double& __units) const
142411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_get(__s, __end, __intl, __io, __err, __units); }
142511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
142611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
142711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Read and parse a monetary value.
142811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
142911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function reads characters from @a __s, interprets them as
143011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  a monetary value according to moneypunct and ctype facets
143111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  retrieved from io.getloc(), and returns the result in @a
143211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  digits.  For example, the string $10.01 in a US locale would
143311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  store <code>1001</code> in @a digits.
143411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
143511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Any characters not part of a valid money amount are not consumed.
143611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
143711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  If a money value cannot be parsed from the input stream, sets
143811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  err=(err|io.failbit).  If the stream is consumed before finishing
143911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  parsing,  sets err=(err|io.failbit|io.eofbit).
144011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
144111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function works by returning the result of do_get().
144211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
144311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  Start of characters to parse.
144411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __end  End of characters to parse.
144511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __intl  Parameter to use_facet<moneypunct<CharT,intl> >.
144611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of facets and io state.
144711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __err  Error field to set if parsing fails.
144811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __digits  Place to store result of parsing.
144911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator referencing first character beyond valid money
145011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *	   amount.
145111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
145211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
145311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
145411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  ios_base::iostate& __err, string_type& __digits) const
145511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_get(__s, __end, __intl, __io, __err, __digits); }
145611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
145711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
145811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Destructor.
145911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual
146011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~money_get() { }
146111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
146211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
146311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Read and parse a monetary value.
146411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
146511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function reads and parses characters representing a monetary
146611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  value.  This function is a hook for derived classes to change the
146711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  value returned.  @see get() for details.
146811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
146911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // XXX GLIBCXX_ABI Deprecated
147011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
147111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
147211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
147311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       ios_base::iostate& __err, double& __units) const;
147411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
147511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
147611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
147711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     ios_base::iostate& __err, long double& __units) const;
147811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
147911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
148011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
148111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Read and parse a monetary value.
148211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
148311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function reads and parses characters representing a monetary
148411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  value.  This function is a hook for derived classes to change the
148511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  value returned.  @see get() for details.
148611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
148711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
148811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
148911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     ios_base::iostate& __err, string_type& __digits) const;
149011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
149111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // XXX GLIBCXX_ABI Deprecated
149211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
149311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
149411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
149511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     ios_base::iostate& __err, long double& __units) const;
149611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
149711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
149811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<bool _Intl>
149911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        iter_type
150011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _M_extract(iter_type __s, iter_type __end, ios_base& __io,
150111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		   ios_base::iostate& __err, string& __digits) const;
150211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
150311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
150411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, typename _InIter>
150511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    locale::id money_get<_CharT, _InIter>::id;
150611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
150711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
150811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Primary class template money_put.
150911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @ingroup locales
151011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
151111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  This facet encapsulates the code to format and output a monetary
151211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  amount.
151311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
151411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The money_put template uses protected virtual functions to
151511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  provide the actual results.  The public accessors forward the
151611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  call to the virtual functions.  These virtual functions are
151711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  hooks for developers to implement the behavior they require from
151811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  the money_put facet.
151911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  */
152011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, typename _OutIter>
152111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class money_put : public locale::facet
152211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
152311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
152411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@{
152511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Public typedefs
152611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _CharT			char_type;
152711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _OutIter			iter_type;
152811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef basic_string<_CharT>	string_type;
152911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@}
153011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
153111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Numpunct facet id.
153211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static locale::id			id;
153311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
153411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
153511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Constructor performs initialization.
153611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
153711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This is the constructor provided by the standard.
153811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
153911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __refs  Passed to the base facet class.
154011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
154111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
154211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      money_put(size_t __refs = 0) : facet(__refs) { }
154311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
154411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
154511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Format and output a monetary value.
154611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
154711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function formats @a units as a monetary value according to
154811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  moneypunct and ctype facets retrieved from io.getloc(), and writes
154911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  the resulting characters to @a __s.  For example, the value 1001 in a
155011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  US locale would write <code>$10.01</code> to @a __s.
155111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
155211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function works by returning the result of do_put().
155311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
155411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The stream to write to.
155511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __intl  Parameter to use_facet<moneypunct<CharT,intl> >.
155611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of facets and io state.
155711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __fill  char_type to use for padding.
155811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __units  Place to store result of parsing.
155911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator after writing.
156011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
156111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
156211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      put(iter_type __s, bool __intl, ios_base& __io,
156311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  char_type __fill, long double __units) const
156411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_put(__s, __intl, __io, __fill, __units); }
156511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
156611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
156711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Format and output a monetary value.
156811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
156911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function formats @a digits as a monetary value
157011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  according to moneypunct and ctype facets retrieved from
157111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  io.getloc(), and writes the resulting characters to @a __s.
157211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  For example, the string <code>1001</code> in a US locale
157311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  would write <code>$10.01</code> to @a __s.
157411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
157511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function works by returning the result of do_put().
157611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
157711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The stream to write to.
157811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __intl  Parameter to use_facet<moneypunct<CharT,intl> >.
157911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of facets and io state.
158011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __fill  char_type to use for padding.
158111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __digits  Place to store result of parsing.
158211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator after writing.
158311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
158411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iter_type
158511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      put(iter_type __s, bool __intl, ios_base& __io,
158611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  char_type __fill, const string_type& __digits) const
158711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_put(__s, __intl, __io, __fill, __digits); }
158811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
158911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
159011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Destructor.
159111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual
159211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~money_put() { }
159311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
159411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
159511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Format and output a monetary value.
159611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
159711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function formats @a units as a monetary value according to
159811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  moneypunct and ctype facets retrieved from io.getloc(), and writes
159911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  the resulting characters to @a __s.  For example, the value 1001 in a
160011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  US locale would write <code>$10.01</code> to @a __s.
160111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
160211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function is a hook for derived classes to change the value
160311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  returned.  @see put().
160411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
160511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The stream to write to.
160611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __intl  Parameter to use_facet<moneypunct<CharT,intl> >.
160711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of facets and io state.
160811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __fill  char_type to use for padding.
160911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __units  Place to store result of parsing.
161011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator after writing.
161111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
161211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // XXX GLIBCXX_ABI Deprecated
161311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
161411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
161511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
161611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	       double __units) const;
161711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
161811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
161911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
162011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     long double __units) const;
162111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
162211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
162311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
162411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Format and output a monetary value.
162511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
162611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function formats @a digits as a monetary value
162711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  according to moneypunct and ctype facets retrieved from
162811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  io.getloc(), and writes the resulting characters to @a __s.
162911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  For example, the string <code>1001</code> in a US locale
163011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  would write <code>$10.01</code> to @a __s.
163111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
163211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function is a hook for derived classes to change the value
163311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  returned.  @see put().
163411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
163511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The stream to write to.
163611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __intl  Parameter to use_facet<moneypunct<CharT,intl> >.
163711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __io  Source of facets and io state.
163811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __fill  char_type to use for padding.
163911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __digits  Place to store result of parsing.
164011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Iterator after writing.
164111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
164211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
164311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
164411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     const string_type& __digits) const;
164511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
164611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // XXX GLIBCXX_ABI Deprecated
164711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
164811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual iter_type
164911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
165011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     long double __units) const;
165111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
165211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
165311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<bool _Intl>
165411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        iter_type
165511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _M_insert(iter_type __s, ios_base& __io, char_type __fill,
165611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		  const string_type& __digits) const;
165711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
165811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
165911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT, typename _OutIter>
166011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    locale::id money_put<_CharT, _OutIter>::id;
166111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
166211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_LDBL
166311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
166411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
166511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Messages facet base class providing catalog typedef.
166611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @ingroup locales
166711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
166811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct messages_base
166911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
167011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef int catalog;
167111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
167211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
167311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
167411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Primary class template messages.
167511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @ingroup locales
167611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
167711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  This facet encapsulates the code to retrieve messages from
167811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  message catalogs.  The only thing defined by the standard for this facet
167911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  is the interface.  All underlying functionality is
168011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  implementation-defined.
168111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
168211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  This library currently implements 3 versions of the message facet.  The
168311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  first version (gnu) is a wrapper around gettext, provided by libintl.
168411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The second version (ieee) is a wrapper around catgets.  The final
168511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  version (default) does no actual translation.  These implementations are
168611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  only provided for char and wchar_t instantiations.
168711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
168811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  The messages template uses protected virtual functions to
168911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  provide the actual results.  The public accessors forward the
169011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  call to the virtual functions.  These virtual functions are
169111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  hooks for developers to implement the behavior they require from
169211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  the messages facet.
169311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  */
169411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT>
169511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class messages : public locale::facet, public messages_base
169611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
169711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
169811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Types:
169911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@{
170011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Public typedefs
170111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _CharT			char_type;
170211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef basic_string<_CharT>	string_type;
170311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      //@}
170411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
170511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
170611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Underlying "C" library locale information saved from
170711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // initialization, needed by messages_byname as well.
170811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __c_locale			_M_c_locale_messages;
170911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const char*			_M_name_messages;
171011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
171111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
171211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Numpunct facet id.
171311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      static locale::id			id;
171411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
171511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
171611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Constructor performs initialization.
171711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
171811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This is the constructor provided by the standard.
171911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
172011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __refs  Passed to the base facet class.
172111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
172211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
172311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      messages(size_t __refs = 0);
172411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
172511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Non-standard.
172611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
172711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Internal constructor.  Not for general use.
172811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
172911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This is a constructor for use by the library itself to set up new
173011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  locales.
173111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
173211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __cloc  The C locale.
173311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The name of a locale.
173411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __refs  Refcount to pass to the base class.
173511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
173611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
173711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      messages(__c_locale __cloc, const char* __s, size_t __refs = 0);
173811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
173911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /*
174011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Open a message catalog.
174111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
174211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function opens and returns a handle to a message catalog by
174311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  returning do_open(__s, __loc).
174411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
174511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The catalog to open.
174611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __loc  Locale to use for character set conversions.
174711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Handle to the catalog or value < 0 if open fails.
174811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
174911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      catalog
175011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      open(const basic_string<char>& __s, const locale& __loc) const
175111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_open(__s, __loc); }
175211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
175311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Non-standard and unorthodox, yet effective.
175411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /*
175511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Open a message catalog.
175611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
175711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This non-standard function opens and returns a handle to a message
175811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  catalog by returning do_open(s, loc).  The third argument provides a
175911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  message catalog root directory for gnu gettext and is ignored
176011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  otherwise.
176111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
176211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The catalog to open.
176311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __loc  Locale to use for character set conversions.
176411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __dir  Message catalog root directory.
176511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Handle to the catalog or value < 0 if open fails.
176611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
176711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      catalog
176811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      open(const basic_string<char>&, const locale&, const char*) const;
176911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
177011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /*
177111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Look up a string in a message catalog.
177211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
177311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function retrieves and returns a message from a catalog by
177411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  returning do_get(c, set, msgid, s).
177511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
177611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  For gnu, @a __set and @a msgid are ignored.  Returns gettext(s).
177711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  For default, returns s. For ieee, returns catgets(c,set,msgid,s).
177811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
177911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __c  The catalog to access.
178011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __set  Implementation-defined.
178111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __msgid  Implementation-defined.
178211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  Default return value if retrieval fails.
178311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Retrieved message or @a __s if get fails.
178411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
178511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      string_type
178611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      get(catalog __c, int __set, int __msgid, const string_type& __s) const
178711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_get(__c, __set, __msgid, __s); }
178811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
178911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /*
179011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Close a message catalog.
179111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
179211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Closes catalog @a c by calling do_close(c).
179311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
179411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __c  The catalog to close.
179511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
179611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
179711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      close(catalog __c) const
179811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return this->do_close(__c); }
179911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
180011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
180111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /// Destructor.
180211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual
180311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~messages();
180411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
180511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /*
180611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Open a message catalog.
180711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
180811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function opens and returns a handle to a message catalog in an
180911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  implementation-defined manner.  This function is a hook for derived
181011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  classes to change the value returned.
181111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
181211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The catalog to open.
181311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __loc  Locale to use for character set conversions.
181411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Handle to the opened catalog, value < 0 if open failed.
181511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
181611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual catalog
181711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_open(const basic_string<char>&, const locale&) const;
181811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
181911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /*
182011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Look up a string in a message catalog.
182111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
182211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  This function retrieves and returns a message from a catalog in an
182311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  implementation-defined manner.  This function is a hook for derived
182411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  classes to change the value returned.
182511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
182611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  For gnu, @a __set and @a __msgid are ignored.  Returns gettext(s).
182711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  For default, returns s. For ieee, returns catgets(c,set,msgid,s).
182811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
182911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __c  The catalog to access.
183011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __set  Implementation-defined.
183111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __msgid  Implementation-defined.
183211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  Default return value if retrieval fails.
183311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Retrieved message or @a __s if get fails.
183411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
183511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual string_type
183611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_get(catalog, int, int, const string_type& __dfault) const;
183711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
183811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /*
183911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Close a message catalog.
184011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
184111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __c  The catalog to close.
184211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      */
184311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual void
184411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      do_close(catalog) const;
184511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
184611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Returns a locale and codeset-converted string, given a char* message.
184711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      char*
184811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_convert_to_char(const string_type& __msg) const
184911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
185011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	// XXX
185111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return reinterpret_cast<char*>(const_cast<_CharT*>(__msg.c_str()));
185211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
185311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
185411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // Returns a locale and codeset-converted string, given a char* message.
185511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      string_type
185611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_convert_from_char(char*) const
185711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
185811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	// XXX
185911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return string_type();
186011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
186111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     };
186211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
186311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _CharT>
186411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    locale::id messages<_CharT>::id;
186511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
186611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// Specializations for required instantiations.
186711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
186811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    string
186911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    messages<char>::do_get(catalog, int, int, const string&) const;
187011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
187111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_USE_WCHAR_T
187211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<>
187311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    wstring
187411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    messages<wchar_t>::do_get(catalog, int, int, const wstring&) const;
187511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
187611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
187711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   /// class messages_byname [22.2.7.2].
187811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   template<typename _CharT>
187911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class messages_byname : public messages<_CharT>
188011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
188111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
188211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _CharT			char_type;
188311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef basic_string<_CharT>	string_type;
188411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
188511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
188611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      messages_byname(const char* __s, size_t __refs = 0);
188711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
188811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    protected:
188911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      virtual
189011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~messages_byname()
189111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
189211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
189311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
189411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION
189511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace
189611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
189711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Include host and configuration specific messages functions.
189811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/messages_members.h>
189911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
190011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 22.2.1.5  Template class codecvt
190111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/codecvt.h>
190211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
190311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/locale_facets_nonio.tcc>
190411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
190511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
1906