Clang Project

include/c++/7/bits/locale_facets_nonio.h
1// Locale support -*- C++ -*-
2
3// Copyright (C) 2007-2017 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file bits/locale_facets_nonio.h
26 *  This is an internal header file, included by other library headers.
27 *  Do not attempt to use it directly. @headername{locale}
28 */
29
30//
31// ISO C++ 14882: 22.1  Locales
32//
33
34#ifndef _LOCALE_FACETS_NONIO_H
35#define _LOCALE_FACETS_NONIO_H 1
36
37#pragma GCC system_header
38
39#include <ctime> // For struct tm
40
41namespace std _GLIBCXX_VISIBILITY(default)
42{
43_GLIBCXX_BEGIN_NAMESPACE_VERSION
44
45  /**
46   *  @brief  Time format ordering data.
47   *  @ingroup locales
48   *
49   *  This class provides an enum representing different orderings of
50   *  time: day, month, and year.
51  */
52  class time_base
53  {
54  public:
55    enum dateorder { no_orderdmymdyymdydm };
56  };
57
58  template<typename _CharT>
59    struct __timepunct_cache : public locale::facet
60    {
61      // List of all known timezones, with GMT first.
62      static const _CharT* _S_timezones[14];
63
64      const _CharT* _M_date_format;
65      const _CharT* _M_date_era_format;
66      const _CharT* _M_time_format;
67      const _CharT* _M_time_era_format;
68      const _CharT* _M_date_time_format;
69      const _CharT* _M_date_time_era_format;
70      const _CharT* _M_am;
71      const _CharT* _M_pm;
72      const _CharT* _M_am_pm_format;
73
74      // Day names, starting with "C"'s Sunday.
75      const _CharT* _M_day1;
76      const _CharT* _M_day2;
77      const _CharT* _M_day3;
78      const _CharT* _M_day4;
79      const _CharT* _M_day5;
80      const _CharT* _M_day6;
81      const _CharT* _M_day7;
82
83      // Abbreviated day names, starting with "C"'s Sun.
84      const _CharT* _M_aday1;
85      const _CharT* _M_aday2;
86      const _CharT* _M_aday3;
87      const _CharT* _M_aday4;
88      const _CharT* _M_aday5;
89      const _CharT* _M_aday6;
90      const _CharT* _M_aday7;
91
92      // Month names, starting with "C"'s January.
93      const _CharT* _M_month01;
94      const _CharT* _M_month02;
95      const _CharT* _M_month03;
96      const _CharT* _M_month04;
97      const _CharT* _M_month05;
98      const _CharT* _M_month06;
99      const _CharT* _M_month07;
100      const _CharT* _M_month08;
101      const _CharT* _M_month09;
102      const _CharT* _M_month10;
103      const _CharT* _M_month11;
104      const _CharT* _M_month12;
105
106      // Abbreviated month names, starting with "C"'s Jan.
107      const _CharT* _M_amonth01;
108      const _CharT* _M_amonth02;
109      const _CharT* _M_amonth03;
110      const _CharT* _M_amonth04;
111      const _CharT* _M_amonth05;
112      const _CharT* _M_amonth06;
113      const _CharT* _M_amonth07;
114      const _CharT* _M_amonth08;
115      const _CharT* _M_amonth09;
116      const _CharT* _M_amonth10;
117      const _CharT* _M_amonth11;
118      const _CharT* _M_amonth12;
119
120      bool _M_allocated;
121
122      __timepunct_cache(size_t __refs = 0) : facet(__refs),
123      _M_date_format(0), _M_date_era_format(0), _M_time_format(0),
124      _M_time_era_format(0), _M_date_time_format(0),
125      _M_date_time_era_format(0), _M_am(0), _M_pm(0),
126      _M_am_pm_format(0), _M_day1(0), _M_day2(0), _M_day3(0),
127      _M_day4(0), _M_day5(0), _M_day6(0), _M_day7(0),
128      _M_aday1(0), _M_aday2(0), _M_aday3(0), _M_aday4(0),
129      _M_aday5(0), _M_aday6(0), _M_aday7(0), _M_month01(0),
130      _M_month02(0), _M_month03(0), _M_month04(0), _M_month05(0),
131      _M_month06(0), _M_month07(0), _M_month08(0), _M_month09(0),
132      _M_month10(0), _M_month11(0), _M_month12(0), _M_amonth01(0),
133      _M_amonth02(0), _M_amonth03(0), _M_amonth04(0),
134      _M_amonth05(0), _M_amonth06(0), _M_amonth07(0),
135      _M_amonth08(0), _M_amonth09(0), _M_amonth10(0),
136      _M_amonth11(0), _M_amonth12(0), _M_allocated(false)
137      { }
138
139      ~__timepunct_cache();
140
141    private:
142      __timepunct_cache&
143      operator=(const __timepunct_cache&);
144      
145      explicit
146      __timepunct_cache(const __timepunct_cache&);
147    };
148
149  template<typename _CharT>
150    __timepunct_cache<_CharT>::~__timepunct_cache()
151    {
152      if (_M_allocated)
153 {
154   // Unused.
155 }
156    }
157
158  // Specializations.
159  template<>
160    const char*
161    __timepunct_cache<char>::_S_timezones[14];
162
163#ifdef _GLIBCXX_USE_WCHAR_T
164  template<>
165    const wchar_t*
166    __timepunct_cache<wchar_t>::_S_timezones[14];
167#endif
168
169  // Generic.
170  template<typename _CharT>
171    const _CharT* __timepunct_cache<_CharT>::_S_timezones[14];
172
173  template<typename _CharT>
174    class __timepunct : public locale::facet
175    {
176    public:
177      // Types:
178      typedef _CharT __char_type;
179      typedef __timepunct_cache<_CharT> __cache_type;
180
181    protected:
182      __cache_type* _M_data;
183      __c_locale _M_c_locale_timepunct;
184      const char* _M_name_timepunct;
185
186    public:
187      /// Numpunct facet id.
188      static locale::id id;
189
190      explicit
191      __timepunct(size_t __refs = 0);
192
193      explicit
194      __timepunct(__cache_type__cachesize_t __refs = 0);
195
196      /**
197       *  @brief  Internal constructor. Not for general use.
198       *
199       *  This is a constructor for use by the library itself to set up new
200       *  locales.
201       *
202       *  @param __cloc  The C locale.
203       *  @param __s  The name of a locale.
204       *  @param refs  Passed to the base facet class.
205      */
206      explicit
207      __timepunct(__c_locale __clocconst char__ssize_t __refs = 0);
208
209      // FIXME: for error checking purposes _M_put should return the return
210      // value of strftime/wcsftime.
211      void
212      _M_put(_CharT* __ssize_t __maxlenconst _CharT* __format,
213      const tm__tmconst throw ();
214
215      void
216      _M_date_formats(const _CharT** __dateconst
217      {
218 // Always have default first.
219 __date[0] = _M_data->_M_date_format;
220 __date[1] = _M_data->_M_date_era_format;
221      }
222
223      void
224      _M_time_formats(const _CharT** __timeconst
225      {
226 // Always have default first.
227 __time[0] = _M_data->_M_time_format;
228 __time[1] = _M_data->_M_time_era_format;
229      }
230
231      void
232      _M_date_time_formats(const _CharT** __dtconst
233      {
234 // Always have default first.
235 __dt[0] = _M_data->_M_date_time_format;
236 __dt[1] = _M_data->_M_date_time_era_format;
237      }
238
239      void
240      _M_am_pm_format(const _CharT* __ampmconst
241      { __ampm = _M_data->_M_am_pm_format; }
242
243      void
244      _M_am_pm(const _CharT** __ampmconst
245      {
246 __ampm[0] = _M_data->_M_am;
247 __ampm[1] = _M_data->_M_pm;
248      }
249
250      void
251      _M_days(const _CharT** __daysconst
252      {
253 __days[0] = _M_data->_M_day1;
254 __days[1] = _M_data->_M_day2;
255 __days[2] = _M_data->_M_day3;
256 __days[3] = _M_data->_M_day4;
257 __days[4] = _M_data->_M_day5;
258 __days[5] = _M_data->_M_day6;
259 __days[6] = _M_data->_M_day7;
260      }
261
262      void
263      _M_days_abbreviated(const _CharT** __daysconst
264      {
265 __days[0] = _M_data->_M_aday1;
266 __days[1] = _M_data->_M_aday2;
267 __days[2] = _M_data->_M_aday3;
268 __days[3] = _M_data->_M_aday4;
269 __days[4] = _M_data->_M_aday5;
270 __days[5] = _M_data->_M_aday6;
271 __days[6] = _M_data->_M_aday7;
272      }
273
274      void
275      _M_months(const _CharT** __monthsconst
276      {
277 __months[0] = _M_data->_M_month01;
278 __months[1] = _M_data->_M_month02;
279 __months[2] = _M_data->_M_month03;
280 __months[3] = _M_data->_M_month04;
281 __months[4] = _M_data->_M_month05;
282 __months[5] = _M_data->_M_month06;
283 __months[6] = _M_data->_M_month07;
284 __months[7] = _M_data->_M_month08;
285 __months[8] = _M_data->_M_month09;
286 __months[9] = _M_data->_M_month10;
287 __months[10] = _M_data->_M_month11;
288 __months[11] = _M_data->_M_month12;
289      }
290
291      void
292      _M_months_abbreviated(const _CharT** __monthsconst
293      {
294 __months[0] = _M_data->_M_amonth01;
295 __months[1] = _M_data->_M_amonth02;
296 __months[2] = _M_data->_M_amonth03;
297 __months[3] = _M_data->_M_amonth04;
298 __months[4] = _M_data->_M_amonth05;
299 __months[5] = _M_data->_M_amonth06;
300 __months[6] = _M_data->_M_amonth07;
301 __months[7] = _M_data->_M_amonth08;
302 __months[8] = _M_data->_M_amonth09;
303 __months[9] = _M_data->_M_amonth10;
304 __months[10] = _M_data->_M_amonth11;
305 __months[11] = _M_data->_M_amonth12;
306      }
307
308    protected:
309      virtual
310      ~__timepunct();
311
312      // For use at construction time only.
313      void
314      _M_initialize_timepunct(__c_locale __cloc = 0);
315    };
316
317  template<typename _CharT>
318    locale::id __timepunct<_CharT>::id;
319
320  // Specializations.
321  template<>
322    void
323    __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc);
324
325  template<>
326    void
327    __timepunct<char>::_M_put(char*, size_tconst char*, const tm*) const throw ();
328
329#ifdef _GLIBCXX_USE_WCHAR_T
330  template<>
331    void
332    __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc);
333
334  template<>
335    void
336    __timepunct<wchar_t>::_M_put(wchar_t*, size_tconst wchar_t*,
337  const tm*) const throw ();
338#endif
339
340_GLIBCXX_END_NAMESPACE_VERSION
341// namespace
342
343  // Include host and configuration specific timepunct functions.
344  #include <bits/time_members.h>
345
346namespace std _GLIBCXX_VISIBILITY(default)
347{
348_GLIBCXX_BEGIN_NAMESPACE_VERSION
349
350_GLIBCXX_BEGIN_NAMESPACE_CXX11
351
352  /**
353   *  @brief  Primary class template time_get.
354   *  @ingroup locales
355   *
356   *  This facet encapsulates the code to parse and return a date or
357   *  time from a string.  It is used by the istream numeric
358   *  extraction operators.
359   *
360   *  The time_get template uses protected virtual functions to provide the
361   *  actual results.  The public accessors forward the call to the virtual
362   *  functions.  These virtual functions are hooks for developers to
363   *  implement the behavior they require from the time_get facet.
364  */
365  template<typename _CharT, typename _InIter>
366    class time_get : public locale::facetpublic time_base
367    {
368    public:
369      // Types:
370      //@{
371      /// Public typedefs
372      typedef _CharT char_type;
373      typedef _InIter iter_type;
374      //@}
375
376      /// Numpunct facet id.
377      static locale::id id;
378
379      /**
380       *  @brief  Constructor performs initialization.
381       *
382       *  This is the constructor provided by the standard.
383       *
384       *  @param __refs  Passed to the base facet class.
385      */
386      explicit
387      time_get(size_t __refs = 0)
388      : facet (__refs) { }
389
390      /**
391       *  @brief  Return preferred order of month, day, and year.
392       *
393       *  This function returns an enum from time_base::dateorder giving the
394       *  preferred ordering if the format @a x given to time_put::put() only
395       *  uses month, day, and year.  If the format @a x for the associated
396       *  locale uses other fields, this function returns
397       *  time_base::dateorder::noorder.
398       *
399       *  NOTE: The library always returns noorder at the moment.
400       *
401       *  @return  A member of time_base::dateorder.
402      */
403      dateorder
404      date_order()  const
405      { return this->do_date_order(); }
406
407      /**
408       *  @brief  Parse input time string.
409       *
410       *  This function parses a time according to the format @a X and puts the
411       *  results into a user-supplied struct tm.  The result is returned by
412       *  calling time_get::do_get_time().
413       *
414       *  If there is a valid time string according to format @a X, @a tm will
415       *  be filled in accordingly and the returned iterator will point to the
416       *  first character beyond the time string.  If an error occurs before
417       *  the end, err |= ios_base::failbit.  If parsing reads all the
418       *  characters, err |= ios_base::eofbit.
419       *
420       *  @param  __beg  Start of string to parse.
421       *  @param  __end  End of string to parse.
422       *  @param  __io  Source of the locale.
423       *  @param  __err  Error flags to set.
424       *  @param  __tm  Pointer to struct tm to fill in.
425       *  @return  Iterator to first char beyond time string.
426      */
427      iter_type
428      get_time(iter_type __begiter_type __endios_base__io,
429        ios_base::iostate__errtm__tm)  const
430      { return this->do_get_time(__beg__end__io__err__tm); }
431
432      /**
433       *  @brief  Parse input date string.
434       *
435       *  This function parses a date according to the format @a x and puts the
436       *  results into a user-supplied struct tm.  The result is returned by
437       *  calling time_get::do_get_date().
438       *
439       *  If there is a valid date string according to format @a x, @a tm will
440       *  be filled in accordingly and the returned iterator will point to the
441       *  first character beyond the date string.  If an error occurs before
442       *  the end, err |= ios_base::failbit.  If parsing reads all the
443       *  characters, err |= ios_base::eofbit.
444       *
445       *  @param  __beg  Start of string to parse.
446       *  @param  __end  End of string to parse.
447       *  @param  __io  Source of the locale.
448       *  @param  __err  Error flags to set.
449       *  @param  __tm  Pointer to struct tm to fill in.
450       *  @return  Iterator to first char beyond date string.
451      */
452      iter_type
453      get_date(iter_type __begiter_type __endios_base__io,
454        ios_base::iostate__errtm__tm)  const
455      { return this->do_get_date(__beg__end__io__err__tm); }
456
457      /**
458       *  @brief  Parse input weekday string.
459       *
460       *  This function parses a weekday name and puts the results into a
461       *  user-supplied struct tm.  The result is returned by calling
462       *  time_get::do_get_weekday().
463       *
464       *  Parsing starts by parsing an abbreviated weekday name.  If a valid
465       *  abbreviation is followed by a character that would lead to the full
466       *  weekday name, parsing continues until the full name is found or an
467       *  error occurs.  Otherwise parsing finishes at the end of the
468       *  abbreviated name.
469       *
470       *  If an error occurs before the end, err |= ios_base::failbit.  If
471       *  parsing reads all the characters, err |= ios_base::eofbit.
472       *
473       *  @param  __beg  Start of string to parse.
474       *  @param  __end  End of string to parse.
475       *  @param  __io  Source of the locale.
476       *  @param  __err  Error flags to set.
477       *  @param  __tm  Pointer to struct tm to fill in.
478       *  @return  Iterator to first char beyond weekday name.
479      */
480      iter_type
481      get_weekday(iter_type __begiter_type __endios_base__io,
482   ios_base::iostate__errtm__tmconst
483      { return this->do_get_weekday(__beg__end__io__err__tm); }
484
485      /**
486       *  @brief  Parse input month string.
487       *
488       *  This function parses a month name and puts the results into a
489       *  user-supplied struct tm.  The result is returned by calling
490       *  time_get::do_get_monthname().
491       *
492       *  Parsing starts by parsing an abbreviated month name.  If a valid
493       *  abbreviation is followed by a character that would lead to the full
494       *  month name, parsing continues until the full name is found or an
495       *  error occurs.  Otherwise parsing finishes at the end of the
496       *  abbreviated name.
497       *
498       *  If an error occurs before the end, err |= ios_base::failbit.  If
499       *  parsing reads all the characters, err |=
500       *  ios_base::eofbit.
501       *
502       *  @param  __beg  Start of string to parse.
503       *  @param  __end  End of string to parse.
504       *  @param  __io  Source of the locale.
505       *  @param  __err  Error flags to set.
506       *  @param  __tm  Pointer to struct tm to fill in.
507       *  @return  Iterator to first char beyond month name.
508      */
509      iter_type
510      get_monthname(iter_type __begiter_type __endios_base__io,
511     ios_base::iostate__errtm__tmconst
512      { return this->do_get_monthname(__beg__end__io__err__tm); }
513
514      /**
515       *  @brief  Parse input year string.
516       *
517       *  This function reads up to 4 characters to parse a year string and
518       *  puts the results into a user-supplied struct tm.  The result is
519       *  returned by calling time_get::do_get_year().
520       *
521       *  4 consecutive digits are interpreted as a full year.  If there are
522       *  exactly 2 consecutive digits, the library interprets this as the
523       *  number of years since 1900.
524       *
525       *  If an error occurs before the end, err |= ios_base::failbit.  If
526       *  parsing reads all the characters, err |= ios_base::eofbit.
527       *
528       *  @param  __beg  Start of string to parse.
529       *  @param  __end  End of string to parse.
530       *  @param  __io  Source of the locale.
531       *  @param  __err  Error flags to set.
532       *  @param  __tm  Pointer to struct tm to fill in.
533       *  @return  Iterator to first char beyond year.
534      */
535      iter_type
536      get_year(iter_type __begiter_type __endios_base__io,
537        ios_base::iostate__errtm__tmconst
538      { return this->do_get_year(__beg__end__io__err__tm); }
539
540#if __cplusplus >= 201103L
541      /**
542       *  @brief  Parse input string according to format.
543       *
544       *  This function calls time_get::do_get with the provided
545       *  parameters.  @see do_get() and get().
546       *
547       *  @param __s        Start of string to parse.
548       *  @param __end      End of string to parse.
549       *  @param __io       Source of the locale.
550       *  @param __err      Error flags to set.
551       *  @param __tm       Pointer to struct tm to fill in.
552       *  @param __format   Format specifier.
553       *  @param __modifier Format modifier.
554       *  @return  Iterator to first char not parsed.
555       */
556      inline
557      iter_type get(iter_type __siter_type __endios_base__io,
558                    ios_base::iostate__errtm__tmchar __format,
559                    char __modifier = 0const
560      {
561        return this->do_get(__s__end__io__err__tm__format,
562                            __modifier);
563      }
564
565      /**
566       *  @brief  Parse input string according to format.
567       *
568       *  This function parses the input string according to a
569       *  provided format string.  It does the inverse of
570       *  time_put::put.  The format string follows the format
571       *  specified for strftime(3)/strptime(3).  The actual parsing
572       *  is done by time_get::do_get.
573       *
574       *  @param __s        Start of string to parse.
575       *  @param __end      End of string to parse.
576       *  @param __io       Source of the locale.
577       *  @param __err      Error flags to set.
578       *  @param __tm       Pointer to struct tm to fill in.
579       *  @param __fmt      Start of the format string.
580       *  @param __fmtend   End of the format string.
581       *  @return  Iterator to first char not parsed.
582       */
583      iter_type get(iter_type __siter_type __endios_base__io,
584                    ios_base::iostate__errtm__tmconst char_type__fmt,
585                    const char_type__fmtendconst;
586#endif // __cplusplus >= 201103L
587
588    protected:
589      /// Destructor.
590      virtual
591      ~time_get() { }
592
593      /**
594       *  @brief  Return preferred order of month, day, and year.
595       *
596       *  This function returns an enum from time_base::dateorder giving the
597       *  preferred ordering if the format @a x given to time_put::put() only
598       *  uses month, day, and year.  This function is a hook for derived
599       *  classes to change the value returned.
600       *
601       *  @return  A member of time_base::dateorder.
602      */
603      virtual dateorder
604      do_date_order() const;
605
606      /**
607       *  @brief  Parse input time string.
608       *
609       *  This function parses a time according to the format @a x and puts the
610       *  results into a user-supplied struct tm.  This function is a hook for
611       *  derived classes to change the value returned.  @see get_time() for
612       *  details.
613       *
614       *  @param  __beg  Start of string to parse.
615       *  @param  __end  End of string to parse.
616       *  @param  __io  Source of the locale.
617       *  @param  __err  Error flags to set.
618       *  @param  __tm  Pointer to struct tm to fill in.
619       *  @return  Iterator to first char beyond time string.
620      */
621      virtual iter_type
622      do_get_time(iter_type __begiter_type __endios_base__io,
623   ios_base::iostate__errtm__tmconst;
624
625      /**
626       *  @brief  Parse input date string.
627       *
628       *  This function parses a date according to the format @a X and puts the
629       *  results into a user-supplied struct tm.  This function is a hook for
630       *  derived classes to change the value returned.  @see get_date() for
631       *  details.
632       *
633       *  @param  __beg  Start of string to parse.
634       *  @param  __end  End of string to parse.
635       *  @param  __io  Source of the locale.
636       *  @param  __err  Error flags to set.
637       *  @param  __tm  Pointer to struct tm to fill in.
638       *  @return  Iterator to first char beyond date string.
639      */
640      virtual iter_type
641      do_get_date(iter_type __begiter_type __endios_base__io,
642   ios_base::iostate__errtm__tmconst;
643
644      /**
645       *  @brief  Parse input weekday string.
646       *
647       *  This function parses a weekday name and puts the results into a
648       *  user-supplied struct tm.  This function is a hook for derived
649       *  classes to change the value returned.  @see get_weekday() for
650       *  details.
651       *
652       *  @param  __beg  Start of string to parse.
653       *  @param  __end  End of string to parse.
654       *  @param  __io  Source of the locale.
655       *  @param  __err  Error flags to set.
656       *  @param  __tm  Pointer to struct tm to fill in.
657       *  @return  Iterator to first char beyond weekday name.
658      */
659      virtual iter_type
660      do_get_weekday(iter_type __begiter_type __endios_base&,
661      ios_base::iostate__errtm__tmconst;
662
663      /**
664       *  @brief  Parse input month string.
665       *
666       *  This function parses a month name and puts the results into a
667       *  user-supplied struct tm.  This function is a hook for derived
668       *  classes to change the value returned.  @see get_monthname() for
669       *  details.
670       *
671       *  @param  __beg  Start of string to parse.
672       *  @param  __end  End of string to parse.
673       *  @param  __io  Source of the locale.
674       *  @param  __err  Error flags to set.
675       *  @param  __tm  Pointer to struct tm to fill in.
676       *  @return  Iterator to first char beyond month name.
677      */
678      virtual iter_type
679      do_get_monthname(iter_type __begiter_type __endios_base&,
680        ios_base::iostate__errtm__tmconst;
681
682      /**
683       *  @brief  Parse input year string.
684       *
685       *  This function reads up to 4 characters to parse a year string and
686       *  puts the results into a user-supplied struct tm.  This function is a
687       *  hook for derived classes to change the value returned.  @see
688       *  get_year() for details.
689       *
690       *  @param  __beg  Start of string to parse.
691       *  @param  __end  End of string to parse.
692       *  @param  __io  Source of the locale.
693       *  @param  __err  Error flags to set.
694       *  @param  __tm  Pointer to struct tm to fill in.
695       *  @return  Iterator to first char beyond year.
696      */
697      virtual iter_type
698      do_get_year(iter_type __begiter_type __endios_base__io,
699   ios_base::iostate__errtm__tmconst;
700
701#if __cplusplus >= 201103L
702      /**
703       *  @brief  Parse input string according to format.
704       *
705       *  This function parses the string according to the provided
706       *  format and optional modifier.  This function is a hook for
707       *  derived classes to change the value returned.  @see get()
708       *  for more details.
709       *
710       *  @param __s        Start of string to parse.
711       *  @param __end      End of string to parse.
712       *  @param __f        Source of the locale.
713       *  @param __err      Error flags to set.
714       *  @param __tm       Pointer to struct tm to fill in.
715       *  @param __format   Format specifier.
716       *  @param __modifier Format modifier.
717       *  @return  Iterator to first char not parsed.
718       */
719#if _GLIBCXX_USE_CXX11_ABI
720      virtual
721#endif
722      iter_type
723      do_get(iter_type __siter_type __endios_base__f,
724             ios_base::iostate__errtm__tm,
725             char __formatchar __modifierconst;
726#endif // __cplusplus >= 201103L
727
728      // Extract numeric component of length __len.
729      iter_type
730      _M_extract_num(iter_type __begiter_type __endint__member,
731      int __minint __maxsize_t __len,
732      ios_base__ioios_base::iostate__errconst;
733
734      // Extract any unique array of string literals in a const _CharT* array.
735      iter_type
736      _M_extract_name(iter_type __begiter_type __endint__member,
737       const _CharT** __namessize_t __indexlen,
738       ios_base__ioios_base::iostate__errconst;
739
740      // Extract day or month name in a const _CharT* array.
741      iter_type
742      _M_extract_wday_or_month(iter_type __begiter_type __endint__member,
743        const _CharT** __namessize_t __indexlen,
744        ios_base__ioios_base::iostate__errconst;
745
746      // Extract on a component-by-component basis, via __format argument.
747      iter_type
748      _M_extract_via_format(iter_type __begiter_type __endios_base__io,
749     ios_base::iostate__errtm__tm,
750     const _CharT* __formatconst;
751    };
752
753  template<typename _CharT, typename _InIter>
754    locale::id time_get<_CharT, _InIter>::id;
755
756  /// class time_get_byname [22.2.5.2].
757  template<typename _CharT, typename _InIter>
758    class time_get_byname : public time_get<_CharT, _InIter>
759    {
760    public:
761      // Types:
762      typedef _CharT char_type;
763      typedef _InIter iter_type;
764
765      explicit
766      time_get_byname(const char*, size_t __refs = 0)
767      : time_get<_CharT, _InIter>(__refs) { }
768
769#if __cplusplus >= 201103L
770      explicit
771      time_get_byname(const string__ssize_t __refs = 0)
772      : time_get_byname(__s.c_str(), __refs) { }
773#endif
774
775    protected:
776      virtual
777      ~time_get_byname() { }
778    };
779
780_GLIBCXX_END_NAMESPACE_CXX11
781
782  /**
783   *  @brief  Primary class template time_put.
784   *  @ingroup locales
785   *
786   *  This facet encapsulates the code to format and output dates and times
787   *  according to formats used by strftime().
788   *
789   *  The time_put template uses protected virtual functions to provide the
790   *  actual results.  The public accessors forward the call to the virtual
791   *  functions.  These virtual functions are hooks for developers to
792   *  implement the behavior they require from the time_put facet.
793  */
794  template<typename _CharT, typename _OutIter>
795    class time_put : public locale::facet
796    {
797    public:
798      // Types:
799      //@{
800      /// Public typedefs
801      typedef _CharT char_type;
802      typedef _OutIter iter_type;
803      //@}
804
805      /// Numpunct facet id.
806      static locale::id id;
807
808      /**
809       *  @brief  Constructor performs initialization.
810       *
811       *  This is the constructor provided by the standard.
812       *
813       *  @param __refs  Passed to the base facet class.
814      */
815      explicit
816      time_put(size_t __refs = 0)
817      : facet(__refs) { }
818
819      /**
820       *  @brief  Format and output a time or date.
821       *
822       *  This function formats the data in struct tm according to the
823       *  provided format string.  The format string is interpreted as by
824       *  strftime().
825       *
826       *  @param  __s  The stream to write to.
827       *  @param  __io  Source of locale.
828       *  @param  __fill  char_type to use for padding.
829       *  @param  __tm  Struct tm with date and time info to format.
830       *  @param  __beg  Start of format string.
831       *  @param  __end  End of format string.
832       *  @return  Iterator after writing.
833       */
834      iter_type
835      put(iter_type __sios_base__iochar_type __fillconst tm__tm,
836   const _CharT* __begconst _CharT* __endconst;
837
838      /**
839       *  @brief  Format and output a time or date.
840       *
841       *  This function formats the data in struct tm according to the
842       *  provided format char and optional modifier.  The format and modifier
843       *  are interpreted as by strftime().  It does so by returning
844       *  time_put::do_put().
845       *
846       *  @param  __s  The stream to write to.
847       *  @param  __io  Source of locale.
848       *  @param  __fill  char_type to use for padding.
849       *  @param  __tm  Struct tm with date and time info to format.
850       *  @param  __format  Format char.
851       *  @param  __mod  Optional modifier char.
852       *  @return  Iterator after writing.
853       */
854      iter_type
855      put(iter_type __sios_base__iochar_type __fill,
856   const tm__tmchar __formatchar __mod = 0const
857      { return this->do_put(__s__io__fill__tm__format__mod); }
858
859    protected:
860      /// Destructor.
861      virtual
862      ~time_put()
863      { }
864
865      /**
866       *  @brief  Format and output a time or date.
867       *
868       *  This function formats the data in struct tm according to the
869       *  provided format char and optional modifier.  This function is a hook
870       *  for derived classes to change the value returned.  @see put() for
871       *  more details.
872       *
873       *  @param  __s  The stream to write to.
874       *  @param  __io  Source of locale.
875       *  @param  __fill  char_type to use for padding.
876       *  @param  __tm  Struct tm with date and time info to format.
877       *  @param  __format  Format char.
878       *  @param  __mod  Optional modifier char.
879       *  @return  Iterator after writing.
880       */
881      virtual iter_type
882      do_put(iter_type __sios_base__iochar_type __fillconst tm__tm,
883      char __formatchar __modconst;
884    };
885
886  template<typename _CharT, typename _OutIter>
887    locale::id time_put<_CharT, _OutIter>::id;
888
889  /// class time_put_byname [22.2.5.4].
890  template<typename _CharT, typename _OutIter>
891    class time_put_byname : public time_put<_CharT, _OutIter>
892    {
893    public:
894      // Types:
895      typedef _CharT char_type;
896      typedef _OutIter iter_type;
897
898      explicit
899      time_put_byname(const char*, size_t __refs = 0)
900      : time_put<_CharT, _OutIter>(__refs)
901      { };
902
903#if __cplusplus >= 201103L
904      explicit
905      time_put_byname(const string__ssize_t __refs = 0)
906      : time_put_byname(__s.c_str(), __refs) { }
907#endif
908
909    protected:
910      virtual
911      ~time_put_byname() { }
912    };
913
914
915  /**
916   *  @brief  Money format ordering data.
917   *  @ingroup locales
918   *
919   *  This class contains an ordered array of 4 fields to represent the
920   *  pattern for formatting a money amount.  Each field may contain one entry
921   *  from the part enum.  symbol, sign, and value must be present and the
922   *  remaining field must contain either none or space.  @see
923   *  moneypunct::pos_format() and moneypunct::neg_format() for details of how
924   *  these fields are interpreted.
925  */
926  class money_base
927  {
928  public:
929    enum part { nonespacesymbolsignvalue };
930    struct pattern { char field[4]; };
931
932    static const pattern _S_default_pattern;
933
934    enum
935    {
936      _S_minus,
937      _S_zero,
938      _S_end = 11
939    };
940
941    // String literal of acceptable (narrow) input/output, for
942    // money_get/money_put. "-0123456789"
943    static const char_S_atoms;
944
945    // Construct and return valid pattern consisting of some combination of:
946    // space none symbol sign value
947    _GLIBCXX_CONST static pattern
948    _S_construct_pattern(char __precedeschar __spacechar __posnthrow ();
949  };
950
951  template<typename _CharT, bool _Intl>
952    struct __moneypunct_cache : public locale::facet
953    {
954      const char* _M_grouping;
955      size_t                            _M_grouping_size;
956      bool _M_use_grouping;
957      _CharT _M_decimal_point;
958      _CharT _M_thousands_sep;
959      const _CharT* _M_curr_symbol;
960      size_t                            _M_curr_symbol_size;
961      const _CharT* _M_positive_sign;
962      size_t                            _M_positive_sign_size;
963      const _CharT* _M_negative_sign;
964      size_t                            _M_negative_sign_size;
965      int _M_frac_digits;
966      money_base::pattern _M_pos_format;
967      money_base::pattern         _M_neg_format;
968
969      // A list of valid numeric literals for input and output: in the standard
970      // "C" locale, this is "-0123456789". This array contains the chars after
971      // having been passed through the current locale's ctype<_CharT>.widen().
972      _CharT _M_atoms[money_base::_S_end];
973
974      bool _M_allocated;
975
976      __moneypunct_cache(size_t __refs = 0) : facet(__refs),
977      _M_grouping(0), _M_grouping_size(0), _M_use_grouping(false),
978      _M_decimal_point(_CharT()), _M_thousands_sep(_CharT()),
979      _M_curr_symbol(0), _M_curr_symbol_size(0),
980      _M_positive_sign(0), _M_positive_sign_size(0),
981      _M_negative_sign(0), _M_negative_sign_size(0),
982      _M_frac_digits(0),
983      _M_pos_format(money_base::pattern()),
984      _M_neg_format(money_base::pattern()), _M_allocated(false)
985      { }
986
987      ~__moneypunct_cache();
988
989      void
990      _M_cache(const locale__loc);
991
992    private:
993      __moneypunct_cache&
994      operator=(const __moneypunct_cache&);
995      
996      explicit
997      __moneypunct_cache(const __moneypunct_cache&);
998    };
999
1000  template<typename _CharT, bool _Intl>
1001    __moneypunct_cache<_CharT, _Intl>::~__moneypunct_cache()
1002    {
1003      if (_M_allocated)
1004 {
1005   delete [] _M_grouping;
1006   delete [] _M_curr_symbol;
1007   delete [] _M_positive_sign;
1008   delete [] _M_negative_sign;
1009 }
1010    }
1011
1012_GLIBCXX_BEGIN_NAMESPACE_CXX11
1013
1014  /**
1015   *  @brief  Primary class template moneypunct.
1016   *  @ingroup locales
1017   *
1018   *  This facet encapsulates the punctuation, grouping and other formatting
1019   *  features of money amount string representations.
1020  */
1021  template<typename _CharT, bool _Intl>
1022    class moneypunct : public locale::facetpublic money_base
1023    {
1024    public:
1025      // Types:
1026      //@{
1027      /// Public typedefs
1028      typedef _CharT char_type;
1029      typedef basic_string<_CharT> string_type;
1030      //@}
1031      typedef __moneypunct_cache<_CharT, _Intl>     __cache_type;
1032
1033    private:
1034      __cache_type* _M_data;
1035
1036    public:
1037      /// This value is provided by the standard, but no reason for its
1038      /// existence.
1039      static const bool intl = _Intl;
1040      /// Numpunct facet id.
1041      static locale::id id;
1042
1043      /**
1044       *  @brief  Constructor performs initialization.
1045       *
1046       *  This is the constructor provided by the standard.
1047       *
1048       *  @param __refs  Passed to the base facet class.
1049      */
1050      explicit
1051      moneypunct(size_t __refs = 0)
1052      : facet(__refs), _M_data(0)
1053      { _M_initialize_moneypunct(); }
1054
1055      /**
1056       *  @brief  Constructor performs initialization.
1057       *
1058       *  This is an internal constructor.
1059       *
1060       *  @param __cache  Cache for optimization.
1061       *  @param __refs  Passed to the base facet class.
1062      */
1063      explicit
1064      moneypunct(__cache_type__cachesize_t __refs = 0)
1065      : facet(__refs), _M_data(__cache)
1066      { _M_initialize_moneypunct(); }
1067
1068      /**
1069       *  @brief  Internal constructor. Not for general use.
1070       *
1071       *  This is a constructor for use by the library itself to set up new
1072       *  locales.
1073       *
1074       *  @param __cloc  The C locale.
1075       *  @param __s  The name of a locale.
1076       *  @param __refs  Passed to the base facet class.
1077      */
1078      explicit
1079      moneypunct(__c_locale __clocconst char__ssize_t __refs = 0)
1080      : facet(__refs), _M_data(0)
1081      { _M_initialize_moneypunct(__cloc__s); }
1082
1083      /**
1084       *  @brief  Return decimal point character.
1085       *
1086       *  This function returns a char_type to use as a decimal point.  It
1087       *  does so by returning returning
1088       *  moneypunct<char_type>::do_decimal_point().
1089       *
1090       *  @return  @a char_type representing a decimal point.
1091      */
1092      char_type
1093      decimal_point() const
1094      { return this->do_decimal_point(); }
1095
1096      /**
1097       *  @brief  Return thousands separator character.
1098       *
1099       *  This function returns a char_type to use as a thousands
1100       *  separator.  It does so by returning returning
1101       *  moneypunct<char_type>::do_thousands_sep().
1102       *
1103       *  @return  char_type representing a thousands separator.
1104      */
1105      char_type
1106      thousands_sep() const
1107      { return this->do_thousands_sep(); }
1108
1109      /**
1110       *  @brief  Return grouping specification.
1111       *
1112       *  This function returns a string representing groupings for the
1113       *  integer part of an amount.  Groupings indicate where thousands
1114       *  separators should be inserted.
1115       *
1116       *  Each char in the return string is interpret as an integer rather
1117       *  than a character.  These numbers represent the number of digits in a
1118       *  group.  The first char in the string represents the number of digits
1119       *  in the least significant group.  If a char is negative, it indicates
1120       *  an unlimited number of digits for the group.  If more chars from the
1121       *  string are required to group a number, the last char is used
1122       *  repeatedly.
1123       *
1124       *  For example, if the grouping() returns <code>\003\002</code>
1125       *  and is applied to the number 123456789, this corresponds to
1126       *  12,34,56,789.  Note that if the string was <code>32</code>, this would
1127       *  put more than 50 digits into the least significant group if
1128       *  the character set is ASCII.
1129       *
1130       *  The string is returned by calling
1131       *  moneypunct<char_type>::do_grouping().
1132       *
1133       *  @return  string representing grouping specification.
1134      */
1135      string
1136      grouping() const
1137      { return this->do_grouping(); }
1138
1139      /**
1140       *  @brief  Return currency symbol string.
1141       *
1142       *  This function returns a string_type to use as a currency symbol.  It
1143       *  does so by returning returning
1144       *  moneypunct<char_type>::do_curr_symbol().
1145       *
1146       *  @return  @a string_type representing a currency symbol.
1147      */
1148      string_type
1149      curr_symbol() const
1150      { return this->do_curr_symbol(); }
1151
1152      /**
1153       *  @brief  Return positive sign string.
1154       *
1155       *  This function returns a string_type to use as a sign for positive
1156       *  amounts.  It does so by returning returning
1157       *  moneypunct<char_type>::do_positive_sign().
1158       *
1159       *  If the return value contains more than one character, the first
1160       *  character appears in the position indicated by pos_format() and the
1161       *  remainder appear at the end of the formatted string.
1162       *
1163       *  @return  @a string_type representing a positive sign.
1164      */
1165      string_type
1166      positive_sign() const
1167      { return this->do_positive_sign(); }
1168
1169      /**
1170       *  @brief  Return negative sign string.
1171       *
1172       *  This function returns a string_type to use as a sign for negative
1173       *  amounts.  It does so by returning returning
1174       *  moneypunct<char_type>::do_negative_sign().
1175       *
1176       *  If the return value contains more than one character, the first
1177       *  character appears in the position indicated by neg_format() and the
1178       *  remainder appear at the end of the formatted string.
1179       *
1180       *  @return  @a string_type representing a negative sign.
1181      */
1182      string_type
1183      negative_sign() const
1184      { return this->do_negative_sign(); }
1185
1186      /**
1187       *  @brief  Return number of digits in fraction.
1188       *
1189       *  This function returns the exact number of digits that make up the
1190       *  fractional part of a money amount.  It does so by returning
1191       *  returning moneypunct<char_type>::do_frac_digits().
1192       *
1193       *  The fractional part of a money amount is optional.  But if it is
1194       *  present, there must be frac_digits() digits.
1195       *
1196       *  @return  Number of digits in amount fraction.
1197      */
1198      int
1199      frac_digits() const
1200      { return this->do_frac_digits(); }
1201
1202      //@{
1203      /**
1204       *  @brief  Return pattern for money values.
1205       *
1206       *  This function returns a pattern describing the formatting of a
1207       *  positive or negative valued money amount.  It does so by returning
1208       *  returning moneypunct<char_type>::do_pos_format() or
1209       *  moneypunct<char_type>::do_neg_format().
1210       *
1211       *  The pattern has 4 fields describing the ordering of symbol, sign,
1212       *  value, and none or space.  There must be one of each in the pattern.
1213       *  The none and space enums may not appear in the first field and space
1214       *  may not appear in the final field.
1215       *
1216       *  The parts of a money string must appear in the order indicated by
1217       *  the fields of the pattern.  The symbol field indicates that the
1218       *  value of curr_symbol() may be present.  The sign field indicates
1219       *  that the value of positive_sign() or negative_sign() must be
1220       *  present.  The value field indicates that the absolute value of the
1221       *  money amount is present.  none indicates 0 or more whitespace
1222       *  characters, except at the end, where it permits no whitespace.
1223       *  space indicates that 1 or more whitespace characters must be
1224       *  present.
1225       *
1226       *  For example, for the US locale and pos_format() pattern
1227       *  {symbol,sign,value,none}, curr_symbol() == &apos;$&apos;
1228       *  positive_sign() == &apos;+&apos;, and value 10.01, and
1229       *  options set to force the symbol, the corresponding string is
1230       *  <code>$+10.01</code>.
1231       *
1232       *  @return  Pattern for money values.
1233      */
1234      pattern
1235      pos_format() const
1236      { return this->do_pos_format(); }
1237
1238      pattern
1239      neg_format() const
1240      { return this->do_neg_format(); }
1241      //@}
1242
1243    protected:
1244      /// Destructor.
1245      virtual
1246      ~moneypunct();
1247
1248      /**
1249       *  @brief  Return decimal point character.
1250       *
1251       *  Returns a char_type to use as a decimal point.  This function is a
1252       *  hook for derived classes to change the value returned.
1253       *
1254       *  @return  @a char_type representing a decimal point.
1255      */
1256      virtual char_type
1257      do_decimal_point() const
1258      { return _M_data->_M_decimal_point; }
1259
1260      /**
1261       *  @brief  Return thousands separator character.
1262       *
1263       *  Returns a char_type to use as a thousands separator.  This function
1264       *  is a hook for derived classes to change the value returned.
1265       *
1266       *  @return  @a char_type representing a thousands separator.
1267      */
1268      virtual char_type
1269      do_thousands_sep() const
1270      { return _M_data->_M_thousands_sep; }
1271
1272      /**
1273       *  @brief  Return grouping specification.
1274       *
1275       *  Returns a string representing groupings for the integer part of a
1276       *  number.  This function is a hook for derived classes to change the
1277       *  value returned.  @see grouping() for details.
1278       *
1279       *  @return  String representing grouping specification.
1280      */
1281      virtual string
1282      do_grouping() const
1283      { return _M_data->_M_grouping; }
1284
1285      /**
1286       *  @brief  Return currency symbol string.
1287       *
1288       *  This function returns a string_type to use as a currency symbol.
1289       *  This function is a hook for derived classes to change the value
1290       *  returned.  @see curr_symbol() for details.
1291       *
1292       *  @return  @a string_type representing a currency symbol.
1293      */
1294      virtual string_type
1295      do_curr_symbol()   const
1296      { return _M_data->_M_curr_symbol; }
1297
1298      /**
1299       *  @brief  Return positive sign string.
1300       *
1301       *  This function returns a string_type to use as a sign for positive
1302       *  amounts.  This function is a hook for derived classes to change the
1303       *  value returned.  @see positive_sign() for details.
1304       *
1305       *  @return  @a string_type representing a positive sign.
1306      */
1307      virtual string_type
1308      do_positive_sign() const
1309      { return _M_data->_M_positive_sign; }
1310
1311      /**
1312       *  @brief  Return negative sign string.
1313       *
1314       *  This function returns a string_type to use as a sign for negative
1315       *  amounts.  This function is a hook for derived classes to change the
1316       *  value returned.  @see negative_sign() for details.
1317       *
1318       *  @return  @a string_type representing a negative sign.
1319      */
1320      virtual string_type
1321      do_negative_sign() const
1322      { return _M_data->_M_negative_sign; }
1323
1324      /**
1325       *  @brief  Return number of digits in fraction.
1326       *
1327       *  This function returns the exact number of digits that make up the
1328       *  fractional part of a money amount.  This function is a hook for
1329       *  derived classes to change the value returned.  @see frac_digits()
1330       *  for details.
1331       *
1332       *  @return  Number of digits in amount fraction.
1333      */
1334      virtual int
1335      do_frac_digits() const
1336      { return _M_data->_M_frac_digits; }
1337
1338      /**
1339       *  @brief  Return pattern for money values.
1340       *
1341       *  This function returns a pattern describing the formatting of a
1342       *  positive valued money amount.  This function is a hook for derived
1343       *  classes to change the value returned.  @see pos_format() for
1344       *  details.
1345       *
1346       *  @return  Pattern for money values.
1347      */
1348      virtual pattern
1349      do_pos_format() const
1350      { return _M_data->_M_pos_format; }
1351
1352      /**
1353       *  @brief  Return pattern for money values.
1354       *
1355       *  This function returns a pattern describing the formatting of a
1356       *  negative valued money amount.  This function is a hook for derived
1357       *  classes to change the value returned.  @see neg_format() for
1358       *  details.
1359       *
1360       *  @return  Pattern for money values.
1361      */
1362      virtual pattern
1363      do_neg_format() const
1364      { return _M_data->_M_neg_format; }
1365
1366      // For use at construction time only.
1367       void
1368       _M_initialize_moneypunct(__c_locale __cloc = 0,
1369 const char__name = 0);
1370    };
1371
1372  template<typename _CharT, bool _Intl>
1373    locale::id moneypunct<_CharT, _Intl>::id;
1374
1375  template<typename _CharT, bool _Intl>
1376    const bool moneypunct<_CharT, _Intl>::intl;
1377
1378  template<>
1379    moneypunct<chartrue>::~moneypunct();
1380
1381  template<>
1382    moneypunct<charfalse>::~moneypunct();
1383
1384  template<>
1385    void
1386    moneypunct<chartrue>::_M_initialize_moneypunct(__c_localeconst char*);
1387
1388  template<>
1389    void
1390    moneypunct<charfalse>::_M_initialize_moneypunct(__c_localeconst char*);
1391
1392#ifdef _GLIBCXX_USE_WCHAR_T
1393  template<>
1394    moneypunct<wchar_ttrue>::~moneypunct();
1395
1396  template<>
1397    moneypunct<wchar_tfalse>::~moneypunct();
1398
1399  template<>
1400    void
1401    moneypunct<wchar_ttrue>::_M_initialize_moneypunct(__c_locale,
1402 const char*);
1403
1404  template<>
1405    void
1406    moneypunct<wchar_tfalse>::_M_initialize_moneypunct(__c_locale,
1407  const char*);
1408#endif
1409
1410  /// class moneypunct_byname [22.2.6.4].
1411  template<typename _CharT, bool _Intl>
1412    class moneypunct_byname : public moneypunct<_CharT, _Intl>
1413    {
1414    public:
1415      typedef _CharT char_type;
1416      typedef basic_string<_CharT> string_type;
1417
1418      static const bool intl = _Intl;
1419
1420      explicit
1421      moneypunct_byname(const char__ssize_t __refs = 0)
1422      : moneypunct<_CharT, _Intl>(__refs)
1423      {
1424 if (__builtin_strcmp(__s"C") != 0
1425     && __builtin_strcmp(__s"POSIX") != 0)
1426   {
1427     __c_locale __tmp;
1428     this->_S_create_c_locale(__tmp__s);
1429     this->_M_initialize_moneypunct(__tmp);
1430     this->_S_destroy_c_locale(__tmp);
1431   }
1432      }
1433
1434#if __cplusplus >= 201103L
1435      explicit
1436      moneypunct_byname(const string__ssize_t __refs = 0)
1437      : moneypunct_byname(__s.c_str(), __refs) { }
1438#endif
1439
1440    protected:
1441      virtual
1442      ~moneypunct_byname() { }
1443    };
1444
1445  template<typename _CharT, bool _Intl>
1446    const bool moneypunct_byname<_CharT, _Intl>::intl;
1447
1448_GLIBCXX_END_NAMESPACE_CXX11
1449
1450_GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11
1451
1452  /**
1453   *  @brief  Primary class template money_get.
1454   *  @ingroup locales
1455   *
1456   *  This facet encapsulates the code to parse and return a monetary
1457   *  amount from a string.
1458   *
1459   *  The money_get template uses protected virtual functions to
1460   *  provide the actual results.  The public accessors forward the
1461   *  call to the virtual functions.  These virtual functions are
1462   *  hooks for developers to implement the behavior they require from
1463   *  the money_get facet.
1464  */
1465  template<typename _CharT, typename _InIter>
1466    class money_get : public locale::facet
1467    {
1468    public:
1469      // Types:
1470      //@{
1471      /// Public typedefs
1472      typedef _CharT char_type;
1473      typedef _InIter iter_type;
1474      typedef basic_string<_CharT> string_type;
1475      //@}
1476
1477      /// Numpunct facet id.
1478      static locale::id id;
1479
1480      /**
1481       *  @brief  Constructor performs initialization.
1482       *
1483       *  This is the constructor provided by the standard.
1484       *
1485       *  @param __refs  Passed to the base facet class.
1486      */
1487      explicit
1488      money_get(size_t __refs = 0) : facet(__refs) { }
1489
1490      /**
1491       *  @brief  Read and parse a monetary value.
1492       *
1493       *  This function reads characters from @a __s, interprets them as a
1494       *  monetary value according to moneypunct and ctype facets retrieved
1495       *  from io.getloc(), and returns the result in @a units as an integral
1496       *  value moneypunct::frac_digits() * the actual amount.  For example,
1497       *  the string $10.01 in a US locale would store 1001 in @a units.
1498       *
1499       *  Any characters not part of a valid money amount are not consumed.
1500       *
1501       *  If a money value cannot be parsed from the input stream, sets
1502       *  err=(err|io.failbit).  If the stream is consumed before finishing
1503       *  parsing,  sets err=(err|io.failbit|io.eofbit).  @a units is
1504       *  unchanged if parsing fails.
1505       *
1506       *  This function works by returning the result of do_get().
1507       *
1508       *  @param  __s  Start of characters to parse.
1509       *  @param  __end  End of characters to parse.
1510       *  @param  __intl  Parameter to use_facet<moneypunct<CharT,intl> >.
1511       *  @param  __io  Source of facets and io state.
1512       *  @param  __err  Error field to set if parsing fails.
1513       *  @param  __units  Place to store result of parsing.
1514       *  @return  Iterator referencing first character beyond valid money
1515       *    amount.
1516       */
1517      iter_type
1518      get(iter_type __siter_type __endbool __intlios_base__io,
1519   ios_base::iostate__errlong double__unitsconst
1520      { return this->do_get(__s__end__intl__io__err__units); }
1521
1522      /**
1523       *  @brief  Read and parse a monetary value.
1524       *
1525       *  This function reads characters from @a __s, interprets them as
1526       *  a monetary value according to moneypunct and ctype facets
1527       *  retrieved from io.getloc(), and returns the result in @a
1528       *  digits.  For example, the string $10.01 in a US locale would
1529       *  store <code>1001</code> in @a digits.
1530       *
1531       *  Any characters not part of a valid money amount are not consumed.
1532       *
1533       *  If a money value cannot be parsed from the input stream, sets
1534       *  err=(err|io.failbit).  If the stream is consumed before finishing
1535       *  parsing,  sets err=(err|io.failbit|io.eofbit).
1536       *
1537       *  This function works by returning the result of do_get().
1538       *
1539       *  @param  __s  Start of characters to parse.
1540       *  @param  __end  End of characters to parse.
1541       *  @param  __intl  Parameter to use_facet<moneypunct<CharT,intl> >.
1542       *  @param  __io  Source of facets and io state.
1543       *  @param  __err  Error field to set if parsing fails.
1544       *  @param  __digits  Place to store result of parsing.
1545       *  @return  Iterator referencing first character beyond valid money
1546       *    amount.
1547       */
1548      iter_type
1549      get(iter_type __siter_type __endbool __intlios_base__io,
1550   ios_base::iostate__errstring_type__digitsconst
1551      { return this->do_get(__s__end__intl__io__err__digits); }
1552
1553    protected:
1554      /// Destructor.
1555      virtual
1556      ~money_get() { }
1557
1558      /**
1559       *  @brief  Read and parse a monetary value.
1560       *
1561       *  This function reads and parses characters representing a monetary
1562       *  value.  This function is a hook for derived classes to change the
1563       *  value returned.  @see get() for details.
1564       */
1565      // XXX GLIBCXX_ABI Deprecated
1566#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \
1567      && _GLIBCXX_USE_CXX11_ABI == 0
1568      virtual iter_type
1569      __do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1570        ios_base::iostate& __err, double& __units) const;
1571#else
1572      virtual iter_type
1573      do_get(iter_type __siter_type __endbool __intlios_base__io,
1574      ios_base::iostate__errlong double__unitsconst;
1575#endif
1576
1577      /**
1578       *  @brief  Read and parse a monetary value.
1579       *
1580       *  This function reads and parses characters representing a monetary
1581       *  value.  This function is a hook for derived classes to change the
1582       *  value returned.  @see get() for details.
1583       */
1584      virtual iter_type
1585      do_get(iter_type __siter_type __endbool __intlios_base__io,
1586      ios_base::iostate__errstring_type__digitsconst;
1587
1588      // XXX GLIBCXX_ABI Deprecated
1589#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \
1590      && _GLIBCXX_USE_CXX11_ABI == 0
1591      virtual iter_type
1592      do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1593      ios_base::iostate& __err, long double& __units) const;
1594#endif
1595
1596      template<bool _Intl>
1597        iter_type
1598        _M_extract(iter_type __siter_type __endios_base__io,
1599    ios_base::iostate__errstring__digitsconst;     
1600    };
1601
1602  template<typename _CharT, typename _InIter>
1603    locale::id money_get<_CharT, _InIter>::id;
1604
1605  /**
1606   *  @brief  Primary class template money_put.
1607   *  @ingroup locales
1608   *
1609   *  This facet encapsulates the code to format and output a monetary
1610   *  amount.
1611   *
1612   *  The money_put template uses protected virtual functions to
1613   *  provide the actual results.  The public accessors forward the
1614   *  call to the virtual functions.  These virtual functions are
1615   *  hooks for developers to implement the behavior they require from
1616   *  the money_put facet.
1617  */
1618  template<typename _CharT, typename _OutIter>
1619    class money_put : public locale::facet
1620    {
1621    public:
1622      //@{
1623      /// Public typedefs
1624      typedef _CharT char_type;
1625      typedef _OutIter iter_type;
1626      typedef basic_string<_CharT> string_type;
1627      //@}
1628
1629      /// Numpunct facet id.
1630      static locale::id id;
1631
1632      /**
1633       *  @brief  Constructor performs initialization.
1634       *
1635       *  This is the constructor provided by the standard.
1636       *
1637       *  @param __refs  Passed to the base facet class.
1638      */
1639      explicit
1640      money_put(size_t __refs = 0) : facet(__refs) { }
1641
1642      /**
1643       *  @brief  Format and output a monetary value.
1644       *
1645       *  This function formats @a units as a monetary value according to
1646       *  moneypunct and ctype facets retrieved from io.getloc(), and writes
1647       *  the resulting characters to @a __s.  For example, the value 1001 in a
1648       *  US locale would write <code>$10.01</code> to @a __s.
1649       *
1650       *  This function works by returning the result of do_put().
1651       *
1652       *  @param  __s  The stream to write to.
1653       *  @param  __intl  Parameter to use_facet<moneypunct<CharT,intl> >.
1654       *  @param  __io  Source of facets and io state.
1655       *  @param  __fill  char_type to use for padding.
1656       *  @param  __units  Place to store result of parsing.
1657       *  @return  Iterator after writing.
1658       */
1659      iter_type
1660      put(iter_type __sbool __intlios_base__io,
1661   char_type __filllong double __unitsconst
1662      { return this->do_put(__s__intl__io__fill__units); }
1663
1664      /**
1665       *  @brief  Format and output a monetary value.
1666       *
1667       *  This function formats @a digits as a monetary value
1668       *  according to moneypunct and ctype facets retrieved from
1669       *  io.getloc(), and writes the resulting characters to @a __s.
1670       *  For example, the string <code>1001</code> in a US locale
1671       *  would write <code>$10.01</code> to @a __s.
1672       *
1673       *  This function works by returning the result of do_put().
1674       *
1675       *  @param  __s  The stream to write to.
1676       *  @param  __intl  Parameter to use_facet<moneypunct<CharT,intl> >.
1677       *  @param  __io  Source of facets and io state.
1678       *  @param  __fill  char_type to use for padding.
1679       *  @param  __digits  Place to store result of parsing.
1680       *  @return  Iterator after writing.
1681       */
1682      iter_type
1683      put(iter_type __sbool __intlios_base__io,
1684   char_type __fillconst string_type__digitsconst
1685      { return this->do_put(__s__intl__io__fill__digits); }
1686
1687    protected:
1688      /// Destructor.
1689      virtual
1690      ~money_put() { }
1691
1692      /**
1693       *  @brief  Format and output a monetary value.
1694       *
1695       *  This function formats @a units as a monetary value according to
1696       *  moneypunct and ctype facets retrieved from io.getloc(), and writes
1697       *  the resulting characters to @a __s.  For example, the value 1001 in a
1698       *  US locale would write <code>$10.01</code> to @a __s.
1699       *
1700       *  This function is a hook for derived classes to change the value
1701       *  returned.  @see put().
1702       *
1703       *  @param  __s  The stream to write to.
1704       *  @param  __intl  Parameter to use_facet<moneypunct<CharT,intl> >.
1705       *  @param  __io  Source of facets and io state.
1706       *  @param  __fill  char_type to use for padding.
1707       *  @param  __units  Place to store result of parsing.
1708       *  @return  Iterator after writing.
1709       */
1710      // XXX GLIBCXX_ABI Deprecated
1711#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \
1712      && _GLIBCXX_USE_CXX11_ABI == 0
1713      virtual iter_type
1714      __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1715        double __units) const;
1716#else
1717      virtual iter_type
1718      do_put(iter_type __sbool __intlios_base__iochar_type __fill,
1719      long double __unitsconst;
1720#endif
1721
1722      /**
1723       *  @brief  Format and output a monetary value.
1724       *
1725       *  This function formats @a digits as a monetary value
1726       *  according to moneypunct and ctype facets retrieved from
1727       *  io.getloc(), and writes the resulting characters to @a __s.
1728       *  For example, the string <code>1001</code> in a US locale
1729       *  would write <code>$10.01</code> to @a __s.
1730       *
1731       *  This function is a hook for derived classes to change the value
1732       *  returned.  @see put().
1733       *
1734       *  @param  __s  The stream to write to.
1735       *  @param  __intl  Parameter to use_facet<moneypunct<CharT,intl> >.
1736       *  @param  __io  Source of facets and io state.
1737       *  @param  __fill  char_type to use for padding.
1738       *  @param  __digits  Place to store result of parsing.
1739       *  @return  Iterator after writing.
1740       */
1741      virtual iter_type
1742      do_put(iter_type __sbool __intlios_base__iochar_type __fill,
1743      const string_type__digitsconst;
1744
1745      // XXX GLIBCXX_ABI Deprecated
1746#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \
1747      && _GLIBCXX_USE_CXX11_ABI == 0
1748      virtual iter_type
1749      do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1750      long double __units) const;
1751#endif
1752
1753      template<bool _Intl>
1754        iter_type
1755        _M_insert(iter_type __sios_base__iochar_type __fill,
1756   const string_type__digitsconst;
1757    };
1758
1759  template<typename _CharT, typename _OutIter>
1760    locale::id money_put<_CharT, _OutIter>::id;
1761
1762_GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11
1763
1764  /**
1765   *  @brief  Messages facet base class providing catalog typedef.
1766   *  @ingroup locales
1767   */
1768  struct messages_base
1769  {
1770    typedef int catalog;
1771  };
1772
1773_GLIBCXX_BEGIN_NAMESPACE_CXX11
1774
1775  /**
1776   *  @brief  Primary class template messages.
1777   *  @ingroup locales
1778   *
1779   *  This facet encapsulates the code to retrieve messages from
1780   *  message catalogs.  The only thing defined by the standard for this facet
1781   *  is the interface.  All underlying functionality is
1782   *  implementation-defined.
1783   *
1784   *  This library currently implements 3 versions of the message facet.  The
1785   *  first version (gnu) is a wrapper around gettext, provided by libintl.
1786   *  The second version (ieee) is a wrapper around catgets.  The final
1787   *  version (default) does no actual translation.  These implementations are
1788   *  only provided for char and wchar_t instantiations.
1789   *
1790   *  The messages template uses protected virtual functions to
1791   *  provide the actual results.  The public accessors forward the
1792   *  call to the virtual functions.  These virtual functions are
1793   *  hooks for developers to implement the behavior they require from
1794   *  the messages facet.
1795  */
1796  template<typename _CharT>
1797    class messages : public locale::facetpublic messages_base
1798    {
1799    public:
1800      // Types:
1801      //@{
1802      /// Public typedefs
1803      typedef _CharT char_type;
1804      typedef basic_string<_CharT> string_type;
1805      //@}
1806
1807    protected:
1808      // Underlying "C" library locale information saved from
1809      // initialization, needed by messages_byname as well.
1810      __c_locale _M_c_locale_messages;
1811      const char* _M_name_messages;
1812
1813    public:
1814      /// Numpunct facet id.
1815      static locale::id id;
1816
1817      /**
1818       *  @brief  Constructor performs initialization.
1819       *
1820       *  This is the constructor provided by the standard.
1821       *
1822       *  @param __refs  Passed to the base facet class.
1823      */
1824      explicit
1825      messages(size_t __refs = 0);
1826
1827      // Non-standard.
1828      /**
1829       *  @brief  Internal constructor.  Not for general use.
1830       *
1831       *  This is a constructor for use by the library itself to set up new
1832       *  locales.
1833       *
1834       *  @param  __cloc  The C locale.
1835       *  @param  __s  The name of a locale.
1836       *  @param  __refs  Refcount to pass to the base class.
1837       */
1838      explicit
1839      messages(__c_locale __clocconst char__ssize_t __refs = 0);
1840
1841      /*
1842       *  @brief  Open a message catalog.
1843       *
1844       *  This function opens and returns a handle to a message catalog by
1845       *  returning do_open(__s, __loc).
1846       *
1847       *  @param  __s  The catalog to open.
1848       *  @param  __loc  Locale to use for character set conversions.
1849       *  @return  Handle to the catalog or value < 0 if open fails.
1850      */
1851      catalog
1852      open(const basic_string<char>& __sconst locale__locconst
1853      { return this->do_open(__s__loc); }
1854
1855      // Non-standard and unorthodox, yet effective.
1856      /*
1857       *  @brief  Open a message catalog.
1858       *
1859       *  This non-standard function opens and returns a handle to a message
1860       *  catalog by returning do_open(s, loc).  The third argument provides a
1861       *  message catalog root directory for gnu gettext and is ignored
1862       *  otherwise.
1863       *
1864       *  @param  __s  The catalog to open.
1865       *  @param  __loc  Locale to use for character set conversions.
1866       *  @param  __dir  Message catalog root directory.
1867       *  @return  Handle to the catalog or value < 0 if open fails.
1868      */
1869      catalog
1870      open(const basic_string<char>&, const locale&, const char*) const;
1871
1872      /*
1873       *  @brief  Look up a string in a message catalog.
1874       *
1875       *  This function retrieves and returns a message from a catalog by
1876       *  returning do_get(c, set, msgid, s).
1877       *
1878       *  For gnu, @a __set and @a msgid are ignored.  Returns gettext(s).
1879       *  For default, returns s. For ieee, returns catgets(c,set,msgid,s).
1880       *
1881       *  @param  __c  The catalog to access.
1882       *  @param  __set  Implementation-defined.
1883       *  @param  __msgid  Implementation-defined.
1884       *  @param  __s  Default return value if retrieval fails.
1885       *  @return  Retrieved message or @a __s if get fails.
1886      */
1887      string_type
1888      get(catalog __cint __setint __msgidconst string_type__sconst
1889      { return this->do_get(__c__set__msgid__s); }
1890
1891      /*
1892       *  @brief  Close a message catalog.
1893       *
1894       *  Closes catalog @a c by calling do_close(c).
1895       *
1896       *  @param  __c  The catalog to close.
1897      */
1898      void
1899      close(catalog __cconst
1900      { return this->do_close(__c); }
1901
1902    protected:
1903      /// Destructor.
1904      virtual
1905      ~messages();
1906
1907      /*
1908       *  @brief  Open a message catalog.
1909       *
1910       *  This function opens and returns a handle to a message catalog in an
1911       *  implementation-defined manner.  This function is a hook for derived
1912       *  classes to change the value returned.
1913       *
1914       *  @param  __s  The catalog to open.
1915       *  @param  __loc  Locale to use for character set conversions.
1916       *  @return  Handle to the opened catalog, value < 0 if open failed.
1917      */
1918      virtual catalog
1919      do_open(const basic_string<char>&, const locale&) const;
1920
1921      /*
1922       *  @brief  Look up a string in a message catalog.
1923       *
1924       *  This function retrieves and returns a message from a catalog in an
1925       *  implementation-defined manner.  This function is a hook for derived
1926       *  classes to change the value returned.
1927       *
1928       *  For gnu, @a __set and @a __msgid are ignored.  Returns gettext(s).
1929       *  For default, returns s. For ieee, returns catgets(c,set,msgid,s).
1930       *
1931       *  @param  __c  The catalog to access.
1932       *  @param  __set  Implementation-defined.
1933       *  @param  __msgid  Implementation-defined.
1934       *  @param  __s  Default return value if retrieval fails.
1935       *  @return  Retrieved message or @a __s if get fails.
1936      */
1937      virtual string_type
1938      do_get(catalogintintconst string_type__dfaultconst;
1939
1940      /*
1941       *  @brief  Close a message catalog.
1942       *
1943       *  @param  __c  The catalog to close.
1944      */
1945      virtual void
1946      do_close(catalogconst;
1947
1948      // Returns a locale and codeset-converted string, given a char* message.
1949      char*
1950      _M_convert_to_char(const string_type__msgconst
1951      {
1952 // XXX
1953 return reinterpret_cast<char*>(const_cast<_CharT*>(__msg.c_str()));
1954      }
1955
1956      // Returns a locale and codeset-converted string, given a char* message.
1957      string_type
1958      _M_convert_from_char(char*) const
1959      {
1960 // XXX
1961 return string_type();
1962      }
1963     };
1964
1965  template<typename _CharT>
1966    locale::id messages<_CharT>::id;
1967
1968  /// Specializations for required instantiations.
1969  template<>
1970    string
1971    messages<char>::do_get(catalogintintconst string&) const;
1972
1973#ifdef _GLIBCXX_USE_WCHAR_T
1974  template<>
1975    wstring
1976    messages<wchar_t>::do_get(catalogintintconst wstring&) const;
1977#endif
1978
1979   /// class messages_byname [22.2.7.2].
1980   template<typename _CharT>
1981    class messages_byname : public messages<_CharT>
1982    {
1983    public:
1984      typedef _CharT char_type;
1985      typedef basic_string<_CharT> string_type;
1986
1987      explicit
1988      messages_byname(const char__ssize_t __refs = 0);
1989
1990#if __cplusplus >= 201103L
1991      explicit
1992      messages_byname(const string__ssize_t __refs = 0)
1993      : messages_byname(__s.c_str(), __refs) { }
1994#endif
1995
1996    protected:
1997      virtual
1998      ~messages_byname()
1999      { }
2000    };
2001
2002_GLIBCXX_END_NAMESPACE_CXX11
2003
2004_GLIBCXX_END_NAMESPACE_VERSION
2005// namespace
2006
2007// Include host and configuration specific messages functions.
2008#include <bits/messages_members.h>
2009
2010// 22.2.1.5  Template class codecvt
2011#include <bits/codecvt.h>
2012
2013#include <bits/locale_facets_nonio.tcc>
2014
2015#endif
2016
std::time_base::dateorder
std::__timepunct_cache::_S_timezones
std::__timepunct_cache::_M_date_format
std::__timepunct_cache::_M_date_era_format
std::__timepunct_cache::_M_time_format
std::__timepunct_cache::_M_time_era_format
std::__timepunct_cache::_M_date_time_format
std::__timepunct_cache::_M_date_time_era_format
std::__timepunct_cache::_M_am
std::__timepunct_cache::_M_pm
std::__timepunct_cache::_M_am_pm_format
std::__timepunct_cache::_M_day1
std::__timepunct_cache::_M_day2
std::__timepunct_cache::_M_day3
std::__timepunct_cache::_M_day4
std::__timepunct_cache::_M_day5
std::__timepunct_cache::_M_day6
std::__timepunct_cache::_M_day7
std::__timepunct_cache::_M_aday1
std::__timepunct_cache::_M_aday2
std::__timepunct_cache::_M_aday3
std::__timepunct_cache::_M_aday4
std::__timepunct_cache::_M_aday5
std::__timepunct_cache::_M_aday6
std::__timepunct_cache::_M_aday7
std::__timepunct_cache::_M_month01
std::__timepunct_cache::_M_month02
std::__timepunct_cache::_M_month03
std::__timepunct_cache::_M_month04
std::__timepunct_cache::_M_month05
std::__timepunct_cache::_M_month06
std::__timepunct_cache::_M_month07
std::__timepunct_cache::_M_month08
std::__timepunct_cache::_M_month09
std::__timepunct_cache::_M_month10
std::__timepunct_cache::_M_month11
std::__timepunct_cache::_M_month12
std::__timepunct_cache::_M_amonth01
std::__timepunct_cache::_M_amonth02
std::__timepunct_cache::_M_amonth03
std::__timepunct_cache::_M_amonth04
std::__timepunct_cache::_M_amonth05
std::__timepunct_cache::_M_amonth06
std::__timepunct_cache::_M_amonth07
std::__timepunct_cache::_M_amonth08
std::__timepunct_cache::_M_amonth09
std::__timepunct_cache::_M_amonth10
std::__timepunct_cache::_M_amonth11
std::__timepunct_cache::_M_amonth12
std::__timepunct_cache::_M_allocated
std::__timepunct_cache::_S_timezones
std::__timepunct::_M_data
std::__timepunct::_M_c_locale_timepunct
std::__timepunct::_M_name_timepunct
std::__timepunct::id
std::__timepunct::_M_put
std::__timepunct::_M_date_formats
std::__timepunct::_M_time_formats
std::__timepunct::_M_date_time_formats
std::__timepunct::_M_am_pm_format
std::__timepunct::_M_am_pm
std::__timepunct::_M_days
std::__timepunct::_M_days_abbreviated
std::__timepunct::_M_months
std::__timepunct::_M_months_abbreviated
std::__timepunct::_M_initialize_timepunct
std::__timepunct::id
std::time_get::id
std::time_get::date_order
std::time_get::get_time
std::time_get::get_date
std::time_get::get_weekday
std::time_get::get_monthname
std::time_get::get_year
std::time_get::get
std::time_get::get
std::time_get::do_date_order
std::time_get::do_get_time
std::time_get::do_get_date
std::time_get::do_get_weekday
std::time_get::do_get_monthname
std::time_get::do_get_year
std::time_get::do_get
std::time_get::_M_extract_num
std::time_get::_M_extract_name
std::time_get::_M_extract_wday_or_month
std::time_get::_M_extract_via_format
std::time_get::id
std::time_put::id
std::time_put::put
std::time_put::put
std::time_put::do_put
std::time_put::id
std::money_base::part
std::money_base::pattern
std::money_base::pattern::field
std::money_base::_S_default_pattern
std::money_base::_S_atoms
std::money_base::_S_construct_pattern
std::__moneypunct_cache::_M_grouping
std::__moneypunct_cache::_M_grouping_size
std::__moneypunct_cache::_M_use_grouping
std::__moneypunct_cache::_M_decimal_point
std::__moneypunct_cache::_M_thousands_sep
std::__moneypunct_cache::_M_curr_symbol
std::__moneypunct_cache::_M_curr_symbol_size
std::__moneypunct_cache::_M_positive_sign
std::__moneypunct_cache::_M_positive_sign_size
std::__moneypunct_cache::_M_negative_sign
std::__moneypunct_cache::_M_negative_sign_size
std::__moneypunct_cache::_M_frac_digits
std::__moneypunct_cache::_M_pos_format
std::__moneypunct_cache::_M_neg_format
std::__moneypunct_cache::_M_atoms
std::__moneypunct_cache::_M_allocated
std::__moneypunct_cache::_M_cache
std::moneypunct::_M_data
std::moneypunct::intl
std::moneypunct::id
std::moneypunct::decimal_point
std::moneypunct::thousands_sep
std::moneypunct::grouping
std::moneypunct::curr_symbol
std::moneypunct::positive_sign
std::moneypunct::negative_sign
std::moneypunct::frac_digits
std::moneypunct::pos_format
std::moneypunct::neg_format
std::moneypunct::do_decimal_point
std::moneypunct::do_thousands_sep
std::moneypunct::do_grouping
std::moneypunct::do_curr_symbol
std::moneypunct::do_positive_sign
std::moneypunct::do_negative_sign
std::moneypunct::do_frac_digits
std::moneypunct::do_pos_format
std::moneypunct::do_neg_format
std::moneypunct::_M_initialize_moneypunct
std::moneypunct::id
std::moneypunct::intl
std::moneypunct_byname::intl
std::moneypunct_byname::intl
std::money_get::id
std::money_get::get
std::money_get::get
std::money_get::do_get
std::money_get::do_get
std::money_get::_M_extract
std::money_get::id
std::money_put::id
std::money_put::put
std::money_put::put
std::money_put::do_put
std::money_put::do_put
std::money_put::_M_insert
std::money_put::id
std::messages::_M_c_locale_messages
std::messages::_M_name_messages
std::messages::id
std::messages::open
std::messages::open
std::messages::get
std::messages::close
std::messages::do_open
std::messages::do_get
std::messages::do_close
std::messages::_M_convert_to_char
std::messages::_M_convert_from_char
std::messages::id