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