Import pre-release gcc-5.0 to new vendor branch
[dragonfly.git] / contrib / gcc-5.0 / libstdc++-v3 / include / bits / locale_facets_nonio.h
1 // Locale support -*- C++ -*-
2
3 // Copyright (C) 2007-2015 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
41 namespace 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_order, dmy, mdy, ymd, ydm };
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* __cache, size_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 __cloc, const char* __s, size_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* __s, size_t __maxlen, const _CharT* __format,
213              const tm* __tm) const throw ();
214
215       void
216       _M_date_formats(const _CharT** __date) const
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** __time) const
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** __dt) const
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* __ampm) const
241       { __ampm = _M_data->_M_am_pm_format; }
242
243       void
244       _M_am_pm(const _CharT** __ampm) const
245       {
246         __ampm[0] = _M_data->_M_am;
247         __ampm[1] = _M_data->_M_pm;
248       }
249
250       void
251       _M_days(const _CharT** __days) const
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** __days) const
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** __months) const
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** __months) const
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_t, const 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_t, const 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
346 namespace 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::facet, public 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 __beg, iter_type __end, ios_base& __io,
429                ios_base::iostate& __err, tm* __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 __beg, iter_type __end, ios_base& __io,
454                ios_base::iostate& __err, tm* __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 __beg, iter_type __end, ios_base& __io,
482                   ios_base::iostate& __err, tm* __tm) const
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 __beg, iter_type __end, ios_base& __io,
511                     ios_base::iostate& __err, tm* __tm) const
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 __beg, iter_type __end, ios_base& __io,
537                ios_base::iostate& __err, tm* __tm) const
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 __s, iter_type __end, ios_base& __io,
558                     ios_base::iostate& __err, tm* __tm, char __format,
559                     char __modifier = 0) const
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 __s, iter_type __end, ios_base& __io,
584                     ios_base::iostate& __err, tm* __tm, const char_type* __fmt,
585                     const char_type* __fmtend) const;
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 __beg, iter_type __end, ios_base& __io,
623                   ios_base::iostate& __err, tm* __tm) const;
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 __beg, iter_type __end, ios_base& __io,
642                   ios_base::iostate& __err, tm* __tm) const;
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 __beg, iter_type __end, ios_base&,
661                      ios_base::iostate& __err, tm* __tm) const;
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 __beg, iter_type __end, ios_base&,
680                        ios_base::iostate& __err, tm* __tm) const;
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 __beg, iter_type __end, ios_base& __io,
699                   ios_base::iostate& __err, tm* __tm) const;
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 __io       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 __s, iter_type __end, ios_base& __f,
724              ios_base::iostate& __err, tm* __tm,
725              char __format, char __modifier) const;
726 #endif // __cplusplus >= 201103L
727
728       // Extract numeric component of length __len.
729       iter_type
730       _M_extract_num(iter_type __beg, iter_type __end, int& __member,
731                      int __min, int __max, size_t __len,
732                      ios_base& __io, ios_base::iostate& __err) const;
733
734       // Extract any unique array of string literals in a const _CharT* array.
735       iter_type
736       _M_extract_name(iter_type __beg, iter_type __end, int& __member,
737                       const _CharT** __names, size_t __indexlen,
738                       ios_base& __io, ios_base::iostate& __err) const;
739
740       // Extract day or month name in a const _CharT* array.
741       iter_type
742       _M_extract_wday_or_month(iter_type __beg, iter_type __end, int& __member,
743                                const _CharT** __names, size_t __indexlen,
744                                ios_base& __io, ios_base::iostate& __err) const;
745
746       // Extract on a component-by-component basis, via __format argument.
747       iter_type
748       _M_extract_via_format(iter_type __beg, iter_type __end, ios_base& __io,
749                             ios_base::iostate& __err, tm* __tm,
750                             const _CharT* __format) const;
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& __s, size_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 __s, ios_base& __io, char_type __fill, const tm* __tm,
836           const _CharT* __beg, const _CharT* __end) const;
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 __s, ios_base& __io, char_type __fill,
856           const tm* __tm, char __format, char __mod = 0) const
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 __s, ios_base& __io, char_type __fill, const tm* __tm,
883              char __format, char __mod) const;
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& __s, size_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 { none, space, symbol, sign, value };
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 __precedes, char __space, char __posn) throw ();
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::facet, public 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* __cache, size_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 __cloc, const char* __s, size_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<char, true>::~moneypunct();
1380
1381   template<>
1382     moneypunct<char, false>::~moneypunct();
1383
1384   template<>
1385     void
1386     moneypunct<char, true>::_M_initialize_moneypunct(__c_locale, const char*);
1387
1388   template<>
1389     void
1390     moneypunct<char, false>::_M_initialize_moneypunct(__c_locale, const char*);
1391
1392 #ifdef _GLIBCXX_USE_WCHAR_T
1393   template<>
1394     moneypunct<wchar_t, true>::~moneypunct();
1395
1396   template<>
1397     moneypunct<wchar_t, false>::~moneypunct();
1398
1399   template<>
1400     void
1401     moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale,
1402                                                         const char*);
1403
1404   template<>
1405     void
1406     moneypunct<wchar_t, false>::_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* __s, size_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& __s, size_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 __s, iter_type __end, bool __intl, ios_base& __io,
1519           ios_base::iostate& __err, long double& __units) const
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 __s, iter_type __end, bool __intl, ios_base& __io,
1550           ios_base::iostate& __err, string_type& __digits) const
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 __s, iter_type __end, bool __intl, ios_base& __io,
1574              ios_base::iostate& __err, long double& __units) const;
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 __s, iter_type __end, bool __intl, ios_base& __io,
1586              ios_base::iostate& __err, string_type& __digits) const;
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 __s, iter_type __end, ios_base& __io,
1599                    ios_base::iostate& __err, string& __digits) const;     
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 __s, bool __intl, ios_base& __io,
1661           char_type __fill, long double __units) const
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 __s, bool __intl, ios_base& __io,
1684           char_type __fill, const string_type& __digits) const
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 __s, bool __intl, ios_base& __io, char_type __fill,
1719              long double __units) const;
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 __s, bool __intl, ios_base& __io, char_type __fill,
1743              const string_type& __digits) const;
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 __s, ios_base& __io, char_type __fill,
1756                   const string_type& __digits) const;
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::facet, public 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 __cloc, const char* __s, size_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>& __s, const locale& __loc) const
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 __c, int __set, int __msgid, const string_type& __s) const
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 __c) const
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(catalog, int, int, const string_type& __dfault) const;
1939
1940       /*
1941        *  @brief  Close a message catalog.
1942        *
1943        *  @param  __c  The catalog to close.
1944       */
1945       virtual void
1946       do_close(catalog) const;
1947
1948       // Returns a locale and codeset-converted string, given a char* message.
1949       char*
1950       _M_convert_to_char(const string_type& __msg) const
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(catalog, int, int, const string&) const;
1972
1973 #ifdef _GLIBCXX_USE_WCHAR_T
1974   template<>
1975     wstring
1976     messages<wchar_t>::do_get(catalog, int, int, const 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* __s, size_t __refs = 0);
1989
1990 #if __cplusplus >= 201103L
1991       explicit
1992       messages_byname(const string& __s, size_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