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