libstdc++
locale_facets_nonio.h
Go to the documentation of this file.
1 // Locale support -*- C++ -*-
2 
3 // Copyright (C) 2007-2025 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 #ifdef _GLIBCXX_SYSHDR
38 #pragma GCC system_header
39 #endif
40 
41 #include <ctime> // For struct tm
42 
43 namespace std _GLIBCXX_VISIBILITY(default)
44 {
45 _GLIBCXX_BEGIN_NAMESPACE_VERSION
46 
47  /**
48  * @brief Time format ordering data.
49  * @ingroup locales
50  *
51  * This class provides an enum representing different orderings of
52  * time: day, month, and year.
53  */
54  class time_base
55  {
56  public:
57  enum dateorder { no_order, dmy, mdy, ymd, ydm };
58  };
59 
60  template<typename _CharT>
61  struct __timepunct_cache : public locale::facet
62  {
63  // List of all known timezones, with GMT first.
64  static const _CharT* _S_timezones[14];
65 
66  const _CharT* _M_date_format;
67  const _CharT* _M_date_era_format;
68  const _CharT* _M_time_format;
69  const _CharT* _M_time_era_format;
70  const _CharT* _M_date_time_format;
71  const _CharT* _M_date_time_era_format;
72  const _CharT* _M_am;
73  const _CharT* _M_pm;
74  const _CharT* _M_am_pm_format;
75 
76  // Day names, starting with "C"'s Sunday.
77  const _CharT* _M_day1;
78  const _CharT* _M_day2;
79  const _CharT* _M_day3;
80  const _CharT* _M_day4;
81  const _CharT* _M_day5;
82  const _CharT* _M_day6;
83  const _CharT* _M_day7;
84 
85  // Abbreviated day names, starting with "C"'s Sun.
86  const _CharT* _M_aday1;
87  const _CharT* _M_aday2;
88  const _CharT* _M_aday3;
89  const _CharT* _M_aday4;
90  const _CharT* _M_aday5;
91  const _CharT* _M_aday6;
92  const _CharT* _M_aday7;
93 
94  // Month names, starting with "C"'s January.
95  const _CharT* _M_month01;
96  const _CharT* _M_month02;
97  const _CharT* _M_month03;
98  const _CharT* _M_month04;
99  const _CharT* _M_month05;
100  const _CharT* _M_month06;
101  const _CharT* _M_month07;
102  const _CharT* _M_month08;
103  const _CharT* _M_month09;
104  const _CharT* _M_month10;
105  const _CharT* _M_month11;
106  const _CharT* _M_month12;
107 
108  // Abbreviated month names, starting with "C"'s Jan.
109  const _CharT* _M_amonth01;
110  const _CharT* _M_amonth02;
111  const _CharT* _M_amonth03;
112  const _CharT* _M_amonth04;
113  const _CharT* _M_amonth05;
114  const _CharT* _M_amonth06;
115  const _CharT* _M_amonth07;
116  const _CharT* _M_amonth08;
117  const _CharT* _M_amonth09;
118  const _CharT* _M_amonth10;
119  const _CharT* _M_amonth11;
120  const _CharT* _M_amonth12;
121 
122  bool _M_allocated;
123 
124  __timepunct_cache(size_t __refs = 0) : facet(__refs),
125  _M_date_format(0), _M_date_era_format(0), _M_time_format(0),
126  _M_time_era_format(0), _M_date_time_format(0),
127  _M_date_time_era_format(0), _M_am(0), _M_pm(0),
128  _M_am_pm_format(0), _M_day1(0), _M_day2(0), _M_day3(0),
129  _M_day4(0), _M_day5(0), _M_day6(0), _M_day7(0),
130  _M_aday1(0), _M_aday2(0), _M_aday3(0), _M_aday4(0),
131  _M_aday5(0), _M_aday6(0), _M_aday7(0), _M_month01(0),
132  _M_month02(0), _M_month03(0), _M_month04(0), _M_month05(0),
133  _M_month06(0), _M_month07(0), _M_month08(0), _M_month09(0),
134  _M_month10(0), _M_month11(0), _M_month12(0), _M_amonth01(0),
135  _M_amonth02(0), _M_amonth03(0), _M_amonth04(0),
136  _M_amonth05(0), _M_amonth06(0), _M_amonth07(0),
137  _M_amonth08(0), _M_amonth09(0), _M_amonth10(0),
138  _M_amonth11(0), _M_amonth12(0), _M_allocated(false)
139  { }
140 
141  ~__timepunct_cache();
142 
143  private:
144  __timepunct_cache&
145  operator=(const __timepunct_cache&);
146 
147  explicit
148  __timepunct_cache(const __timepunct_cache&);
149  };
150 
151  template<typename _CharT>
152  __timepunct_cache<_CharT>::~__timepunct_cache()
153  {
154  if (_M_allocated)
155  {
156  // Unused.
157  }
158  }
159 
160  // Specializations.
161  template<>
162  const char*
163  __timepunct_cache<char>::_S_timezones[14];
164 
165 #ifdef _GLIBCXX_USE_WCHAR_T
166  template<>
167  const wchar_t*
168  __timepunct_cache<wchar_t>::_S_timezones[14];
169 #endif
170 
171  // Generic.
172  template<typename _CharT>
173  const _CharT* __timepunct_cache<_CharT>::_S_timezones[14];
174 
175  template<typename _CharT>
176  class __timepunct : public locale::facet
177  {
178  public:
179  // Types:
180  typedef _CharT __char_type;
181  typedef __timepunct_cache<_CharT> __cache_type;
182 
183  protected:
184  __cache_type* _M_data;
185  __c_locale _M_c_locale_timepunct;
186  const char* _M_name_timepunct;
187 
188  public:
189  /// Numpunct facet id.
190  static locale::id id;
191 
192  explicit
193  __timepunct(size_t __refs = 0);
194 
195  explicit
196  __timepunct(__cache_type* __cache, size_t __refs = 0);
197 
198  /**
199  * @brief Internal constructor. Not for general use.
200  *
201  * This is a constructor for use by the library itself to set up new
202  * locales.
203  *
204  * @param __cloc The C locale.
205  * @param __s The name of a locale.
206  * @param refs Passed to the base facet class.
207  */
208  explicit
209  __timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0);
210 
211  // FIXME: for error checking purposes _M_put should return the return
212  // value of strftime/wcsftime.
213  void
214  _M_put(_CharT* __s, size_t __maxlen, const _CharT* __format,
215  const tm* __tm) const throw ();
216 
217  void
218  _M_date_formats(const _CharT** __date) const
219  {
220  // Always have default first.
221  __date[0] = _M_data->_M_date_format;
222  __date[1] = _M_data->_M_date_era_format;
223  }
224 
225  void
226  _M_time_formats(const _CharT** __time) const
227  {
228  // Always have default first.
229  __time[0] = _M_data->_M_time_format;
230  __time[1] = _M_data->_M_time_era_format;
231  }
232 
233  void
234  _M_date_time_formats(const _CharT** __dt) const
235  {
236  // Always have default first.
237  __dt[0] = _M_data->_M_date_time_format;
238  __dt[1] = _M_data->_M_date_time_era_format;
239  }
240 
241 #if !_GLIBCXX_INLINE_VERSION
242  void
243  _M_am_pm_format(const _CharT*) const
244  { /* Kept for ABI compatibility, see PR65927 */ }
245 #endif
246 
247  void
248  _M_am_pm_format(const _CharT** __ampm_format) const
249  {
250  __ampm_format[0] = _M_data->_M_am_pm_format;
251  }
252 
253  void
254  _M_am_pm(const _CharT** __ampm) const
255  {
256  __ampm[0] = _M_data->_M_am;
257  __ampm[1] = _M_data->_M_pm;
258  }
259 
260  void
261  _M_days(const _CharT** __days) const
262  {
263  __days[0] = _M_data->_M_day1;
264  __days[1] = _M_data->_M_day2;
265  __days[2] = _M_data->_M_day3;
266  __days[3] = _M_data->_M_day4;
267  __days[4] = _M_data->_M_day5;
268  __days[5] = _M_data->_M_day6;
269  __days[6] = _M_data->_M_day7;
270  }
271 
272  void
273  _M_days_abbreviated(const _CharT** __days) const
274  {
275  __days[0] = _M_data->_M_aday1;
276  __days[1] = _M_data->_M_aday2;
277  __days[2] = _M_data->_M_aday3;
278  __days[3] = _M_data->_M_aday4;
279  __days[4] = _M_data->_M_aday5;
280  __days[5] = _M_data->_M_aday6;
281  __days[6] = _M_data->_M_aday7;
282  }
283 
284  void
285  _M_months(const _CharT** __months) const
286  {
287  __months[0] = _M_data->_M_month01;
288  __months[1] = _M_data->_M_month02;
289  __months[2] = _M_data->_M_month03;
290  __months[3] = _M_data->_M_month04;
291  __months[4] = _M_data->_M_month05;
292  __months[5] = _M_data->_M_month06;
293  __months[6] = _M_data->_M_month07;
294  __months[7] = _M_data->_M_month08;
295  __months[8] = _M_data->_M_month09;
296  __months[9] = _M_data->_M_month10;
297  __months[10] = _M_data->_M_month11;
298  __months[11] = _M_data->_M_month12;
299  }
300 
301  void
302  _M_months_abbreviated(const _CharT** __months) const
303  {
304  __months[0] = _M_data->_M_amonth01;
305  __months[1] = _M_data->_M_amonth02;
306  __months[2] = _M_data->_M_amonth03;
307  __months[3] = _M_data->_M_amonth04;
308  __months[4] = _M_data->_M_amonth05;
309  __months[5] = _M_data->_M_amonth06;
310  __months[6] = _M_data->_M_amonth07;
311  __months[7] = _M_data->_M_amonth08;
312  __months[8] = _M_data->_M_amonth09;
313  __months[9] = _M_data->_M_amonth10;
314  __months[10] = _M_data->_M_amonth11;
315  __months[11] = _M_data->_M_amonth12;
316  }
317 
318  protected:
319  virtual
320  ~__timepunct();
321 
322  // For use at construction time only.
323  void
324  _M_initialize_timepunct(__c_locale __cloc = 0);
325  };
326 
327  template<typename _CharT>
328  locale::id __timepunct<_CharT>::id;
329 
330  // Specializations.
331  template<>
332  void
333  __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc);
334 
335  template<>
336  void
337  __timepunct<char>::_M_put(char*, size_t, const char*, const tm*) const throw ();
338 
339 #ifdef _GLIBCXX_USE_WCHAR_T
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 
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
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
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
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
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>
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
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>
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)
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  */
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;
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
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
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
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
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
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
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
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
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
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
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
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
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>
1419 
1420  template<>
1422 
1423  template<>
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<>
1437 
1438  template<>
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;
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>
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;
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
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;
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
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>
1819 
1820 _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11
1821 
1822  /**
1823  * @brief Messages facet base class providing catalog typedef.
1824  * @ingroup locales
1825  */
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;
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;
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 
2072 
2073 #endif
virtual ~moneypunct()
Destructor.
virtual iter_type do_get_time(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input time string.
basic_string< _CharT > string_type
Public typedefs.
Primary class template messages.This facet encapsulates the code to retrieve messages from message ca...
_InIter iter_type
Public typedefs.
static locale::id id
Numpunct facet id.
static locale::id id
Numpunct facet id.
time_get(size_t __refs=0)
Constructor performs initialization.
char_type thousands_sep() const
Return thousands separator character.
static locale::id id
Numpunct facet id.
virtual iter_type do_get_weekday(iter_type __beg, iter_type __end, ios_base &, ios_base::iostate &__err, tm *__tm) const
Parse input weekday string.
virtual char_type do_thousands_sep() const
Return thousands separator character.
virtual string_type do_curr_symbol() const
Return currency symbol string.
Money format ordering data.This class contains an ordered array of 4 fields to represent the pattern ...
static locale::id id
Numpunct facet id.
virtual iter_type do_get_year(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input year string.
_InIter iter_type
Public typedefs.
class time_get_byname [22.2.5.2].
iter_type get_weekday(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input weekday string.
virtual iter_type do_get(iter_type __s, iter_type __end, bool __intl, ios_base &__io, ios_base::iostate &__err, long double &__units) const
Read and parse a monetary value.
string_type negative_sign() const
Return negative sign string.
moneypunct(size_t __refs=0)
Constructor performs initialization.
basic_string< _CharT > string_type
Public typedefs.
virtual char_type do_decimal_point() const
Return decimal point character.
string grouping() const
Return grouping specification.
static locale::id id
Numpunct facet id.
Primary class template money_get.This facet encapsulates the code to parse and return a monetary amou...
iter_type put(iter_type __s, bool __intl, ios_base &__io, char_type __fill, long double __units) const
Format and output a monetary value.
basic_string< _CharT > string_type
Public typedefs.
class time_put_byname [22.2.5.4].
virtual iter_type do_get_date(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input date string.
basic_string< _CharT > string_type
Public typedefs.
moneypunct(__c_locale __cloc, const char *__s, size_t __refs=0)
Internal constructor. Not for general use.
The base of the I/O class hierarchy.This class defines everything that can be defined about I/O that ...
Definition: ios_base.h:265
Messages facet base class providing catalog typedef.
_CharT char_type
Public typedefs.
int frac_digits() const
Return number of digits in fraction.
class moneypunct_byname [22.2.6.4].
pattern pos_format() const
Return pattern for money values.
virtual iter_type do_get_monthname(iter_type __beg, iter_type __end, ios_base &, ios_base::iostate &__err, tm *__tm) const
Parse input month string.
_OutIter iter_type
Public typedefs.
virtual iter_type do_put(iter_type __s, bool __intl, ios_base &__io, char_type __fill, long double __units) const
Format and output a monetary value.
iter_type put(iter_type __s, bool __intl, ios_base &__io, char_type __fill, const string_type &__digits) const
Format and output a monetary value.
pattern neg_format() const
Return pattern for money values.
virtual ~messages()
Destructor.
virtual string do_grouping() const
Return grouping specification.
class messages_byname [22.2.7.2].
virtual dateorder do_date_order() const
Return preferred order of month, day, and year.
time_put(size_t __refs=0)
Constructor performs initialization.
_CharT char_type
Public typedefs.
Time format ordering data.This class provides an enum representing different orderings of time: day...
_OutIter iter_type
Public typedefs.
Localization functionality base class.The facet class is the base class for a localization feature...
iter_type get_time(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input time string.
virtual pattern do_pos_format() const
Return pattern for money values.
moneypunct(__cache_type *__cache, size_t __refs=0)
Constructor performs initialization.
iter_type put(iter_type __s, ios_base &__io, char_type __fill, const tm *__tm, const _CharT *__beg, const _CharT *__end) const
Format and output a time or date.
char_type decimal_point() const
Return decimal point character.
virtual int do_frac_digits() const
Return number of digits in fraction.
messages(size_t __refs=0)
Constructor performs initialization.
iter_type get_year(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input year string.
_CharT char_type
Public typedefs.
virtual iter_type do_put(iter_type __s, ios_base &__io, char_type __fill, const tm *__tm, char __format, char __mod) const
Format and output a time or date.
iter_type get_date(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input date string.
money_put(size_t __refs=0)
Constructor performs initialization.
ISO C++ entities toplevel namespace is std.
string_type curr_symbol() const
Return currency symbol string.
virtual ~time_get()
Destructor.
string_type positive_sign() const
Return positive sign string.
Primary class template time_get.This facet encapsulates the code to parse and return a date or time f...
iter_type put(iter_type __s, ios_base &__io, char_type __fill, const tm *__tm, char __format, char __mod=0) const
Format and output a time or date.
_CharT char_type
Public typedefs.
virtual string_type do_negative_sign() const
Return negative sign string.
money_get(size_t __refs=0)
Constructor performs initialization.
static locale::id id
Numpunct facet id.
iter_type get_monthname(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input month string.
basic_string< wchar_t > wstring
A string of wchar_t.
Definition: stringfwd.h:82
const _CharT * c_str() const noexcept
Return const pointer to null-terminated contents.
Definition: cow_string.h:2376
Container class for localization functionality.The locale class is first a class wrapper for C librar...
virtual ~money_put()
Destructor.
facet(size_t __refs=0)
Facet constructor.
Primary class template time_put.This facet encapsulates the code to format and output dates and times...
virtual pattern do_neg_format() const
Return pattern for money values.
static const bool intl
This value is provided by the standard, but no reason for its existence.
virtual ~money_get()
Destructor.
dateorder date_order() const
Return preferred order of month, day, and year.
_CharT char_type
Public typedefs.
_CharT char_type
Public typedefs.
Primary class template money_put.This facet encapsulates the code to format and output a monetary amo...
Facet ID class.The ID class provides facets with an index used to identify them. Every facet class mu...
Primary class template moneypunct.This facet encapsulates the punctuation, grouping and other formatt...
virtual string_type do_positive_sign() const
Return positive sign string.
virtual ~time_put()
Destructor.
iter_type do_get(iter_type __s, iter_type __end, ios_base &__f, ios_base::iostate &__err, tm *__tm, char __format, char __modifier) const
Parse input string according to format.