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