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
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>
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>
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
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>
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>
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
ISO C++ entities toplevel namespace is std.
const _CharT * c_str() const noexcept
Return const pointer to null-terminated contents.
Definition: cow_string.h:2206
The base of the I/O class hierarchy.
Definition: ios_base.h:230
Container class for localization functionality.
Localization functionality base class.
facet(size_t __refs=0)
Facet constructor.
Facet ID class.
Time format ordering data.
Primary class template time_get.
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.
iter_type get_year(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input year string.
iter_type get_time(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input time string.
static locale::id id
Numpunct facet id.
_InIter iter_type
Public typedefs.
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.
dateorder date_order() const
Return preferred order of month, day, and year.
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.
_CharT char_type
Public typedefs.
virtual ~time_get()
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.
iter_type get(iter_type __s, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm, char __format, char __modifier=0) const
Parse input string according to format.
iter_type get_date(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input date string.
virtual dateorder do_date_order() const
Return preferred order of month, day, and year.
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.
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.
time_get(size_t __refs=0)
Constructor performs initialization.
iter_type get_monthname(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input month string.
iter_type get_weekday(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input weekday string.
class time_get_byname [22.2.5.2].
Primary class template time_put.
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.
_CharT char_type
Public typedefs.
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.
virtual ~time_put()
Destructor.
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.
_OutIter iter_type
Public typedefs.
static locale::id id
Numpunct facet id.
time_put(size_t __refs=0)
Constructor performs initialization.
class time_put_byname [22.2.5.4].
Money format ordering data.
Primary class template moneypunct.
virtual ~moneypunct()
Destructor.
string_type curr_symbol() const
Return currency symbol string.
moneypunct(__c_locale __cloc, const char *__s, size_t __refs=0)
Internal constructor. Not for general use.
static locale::id id
Numpunct facet id.
virtual string_type do_negative_sign() const
Return negative sign string.
string_type positive_sign() const
Return positive sign string.
virtual int do_frac_digits() const
Return number of digits in fraction.
basic_string< _CharT > string_type
Public typedefs.
char_type thousands_sep() const
Return thousands separator character.
char_type decimal_point() const
Return decimal point character.
moneypunct(size_t __refs=0)
Constructor performs initialization.
virtual string_type do_positive_sign() const
Return positive sign string.
virtual string_type do_curr_symbol() const
Return currency symbol string.
string_type negative_sign() const
Return negative sign string.
moneypunct(__cache_type *__cache, size_t __refs=0)
Constructor performs initialization.
pattern neg_format() const
Return pattern for money values.
virtual pattern do_neg_format() const
Return pattern for money values.
int frac_digits() const
Return number of digits in fraction.
virtual char_type do_decimal_point() const
Return decimal point character.
virtual char_type do_thousands_sep() const
Return thousands separator character.
virtual string do_grouping() const
Return grouping specification.
virtual pattern do_pos_format() const
Return pattern for money values.
string grouping() const
Return grouping specification.
pattern pos_format() const
Return pattern for money values.
_CharT char_type
Public typedefs.
static const bool intl
This value is provided by the standard, but no reason for its existence.
class moneypunct_byname [22.2.6.4].
Primary class template money_get.
basic_string< _CharT > string_type
Public typedefs.
_CharT char_type
Public typedefs.
money_get(size_t __refs=0)
Constructor performs initialization.
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.
iter_type 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.
virtual ~money_get()
Destructor.
iter_type get(iter_type __s, iter_type __end, bool __intl, ios_base &__io, ios_base::iostate &__err, string_type &__digits) const
Read and parse a monetary value.
_InIter iter_type
Public typedefs.
Primary class template money_put.
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.
static locale::id id
Numpunct facet id.
basic_string< _CharT > string_type
Public typedefs.
iter_type 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.
money_put(size_t __refs=0)
Constructor performs initialization.
_OutIter iter_type
Public typedefs.
_CharT char_type
Public typedefs.
virtual ~money_put()
Destructor.
Messages facet base class providing catalog typedef.
Primary class template messages.
_CharT char_type
Public typedefs.
messages(size_t __refs=0)
Constructor performs initialization.
virtual ~messages()
Destructor.
static locale::id id
Numpunct facet id.
basic_string< _CharT > string_type
Public typedefs.
class messages_byname [22.2.7.2].