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