libstdc++
locale_facets_nonio.h
Go to the documentation of this file.
1 // Locale support -*- C++ -*-
2 
3 // Copyright (C) 2007-2017 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
string_type negative_sign() const
Return negative sign string.
string grouping() const
Return grouping specification.
virtual string do_grouping() const
Return grouping specification.
money_get(size_t __refs=0)
Constructor performs initialization.
_CharT char_type
Public typedefs.
_CharT char_type
Public typedefs.
static locale::id id
Numpunct facet id.
virtual ~time_get()
Destructor.
virtual ~moneypunct()
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
static locale::id id
Numpunct facet id.
Facet ID class.The ID class provides facets with an index used to identify them. Every facet class mu...
Primary class template time_put.This facet encapsulates the code to format and output dates and times...
Primary class template messages.This facet encapsulates the code to retrieve messages from message ca...
virtual pattern do_pos_format() const
Return pattern for money values.
pattern pos_format() const
Return pattern for money values.
_CharT char_type
Public typedefs.
virtual string_type do_positive_sign() const
Return positive sign string.
basic_string< _CharT > string_type
Public typedefs.
char_type thousands_sep() const
Return thousands separator character.
virtual char_type do_decimal_point() const
Return decimal point character.
moneypunct(__cache_type *__cache, size_t __refs=0)
Constructor performs initialization.
_OutIter iter_type
Public typedefs.
Primary class template money_get.This facet encapsulates the code to parse and return a monetary amou...
const _CharT * c_str() const noexcept
Return const pointer to null-terminated contents.
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.
time_put(size_t __refs=0)
Constructor performs initialization.
class moneypunct_byname [22.2.6.4].
_CharT char_type
Public typedefs.
class time_get_byname [22.2.5.2].
virtual ~time_put()
Destructor.
ISO C++ entities toplevel namespace is std.
virtual ~money_get()
Destructor.
moneypunct(size_t __refs=0)
Constructor performs initialization.
iter_type get_date(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input date string.
static locale::id id
Numpunct facet id.
Money format ordering data.This class contains an ordered array of 4 fields to represent the pattern ...
Localization functionality base class.The facet class is the base class for a localization feature...
_InIter iter_type
Public typedefs.
virtual string_type do_negative_sign() const
Return negative sign 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.
_CharT char_type
Public typedefs.
class messages_byname [22.2.7.2].
pattern neg_format() const
Return pattern for money values.
_InIter iter_type
Public typedefs.
_OutIter iter_type
Public typedefs.
char_type decimal_point() const
Return decimal point character.
Primary class template moneypunct.This facet encapsulates the punctuation, grouping and other formatt...
money_put(size_t __refs=0)
Constructor performs initialization.
Container class for localization functionality.The locale class is first a class wrapper for C librar...
Primary class template time_get.This facet encapsulates the code to parse and return a date or time f...
static locale::id id
Numpunct facet id.
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.
iter_type get_weekday(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input weekday string.
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.
basic_string< _CharT > string_type
Public typedefs.
static locale::id id
Numpunct facet id.
_CharT char_type
Public typedefs.
class time_put_byname [22.2.5.4].
moneypunct(__c_locale __cloc, const char *__s, size_t __refs=0)
Internal constructor. Not for general use.
Messages facet base class providing catalog typedef.
iter_type get_time(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input time string.
virtual string_type do_curr_symbol() const
Return currency symbol string.
virtual pattern do_neg_format() const
Return pattern for money values.
virtual int do_frac_digits() const
Return number of digits in fraction.
dateorder date_order() const
Return preferred order of month, day, and year.
basic_string< _CharT > string_type
Public typedefs.
string_type positive_sign() const
Return positive sign string.
static locale::id id
Numpunct facet id.
string_type curr_symbol() const
Return currency symbol string.
Primary class template money_put.This facet encapsulates the code to format and output a monetary amo...
iter_type get_year(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input year string.
Time format ordering data.This class provides an enum representing different orderings of time: day...
virtual char_type do_thousands_sep() const
Return thousands separator character.
int frac_digits() const
Return number of digits in fraction.
virtual ~money_put()
Destructor.