STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
locale_facets_nonio.h
Go to the documentation of this file.
1 // Locale support -*- C++ -*-
2 
3 // Copyright (C) 2007-2013 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 
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 
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  void
142  _M_cache(const locale& __loc);
143 
144  private:
145  __timepunct_cache&
146  operator=(const __timepunct_cache&);
147 
148  explicit
149  __timepunct_cache(const __timepunct_cache&);
150  };
151 
152  template<typename _CharT>
153  __timepunct_cache<_CharT>::~__timepunct_cache()
154  {
155  if (_M_allocated)
156  {
157  // Unused.
158  }
159  }
160 
161  // Specializations.
162  template<>
163  const char*
164  __timepunct_cache<char>::_S_timezones[14];
165 
166 #ifdef _GLIBCXX_USE_WCHAR_T
167  template<>
168  const wchar_t*
169  __timepunct_cache<wchar_t>::_S_timezones[14];
170 #endif
171 
172  // Generic.
173  template<typename _CharT>
174  const _CharT* __timepunct_cache<_CharT>::_S_timezones[14];
175 
176  template<typename _CharT>
177  class __timepunct : public locale::facet
178  {
179  public:
180  // Types:
181  typedef _CharT __char_type;
182  typedef basic_string<_CharT> __string_type;
183  typedef __timepunct_cache<_CharT> __cache_type;
184 
185  protected:
186  __cache_type* _M_data;
187  __c_locale _M_c_locale_timepunct;
188  const char* _M_name_timepunct;
189 
190  public:
192  static locale::id id;
193 
194  explicit
195  __timepunct(size_t __refs = 0);
196 
197  explicit
198  __timepunct(__cache_type* __cache, size_t __refs = 0);
199 
210  explicit
211  __timepunct(__c_locale __cloc, const char* __s, size_t __refs = 0);
212 
213  // FIXME: for error checking purposes _M_put should return the return
214  // value of strftime/wcsftime.
215  void
216  _M_put(_CharT* __s, size_t __maxlen, const _CharT* __format,
217  const tm* __tm) const throw ();
218 
219  void
220  _M_date_formats(const _CharT** __date) const
221  {
222  // Always have default first.
223  __date[0] = _M_data->_M_date_format;
224  __date[1] = _M_data->_M_date_era_format;
225  }
226 
227  void
228  _M_time_formats(const _CharT** __time) const
229  {
230  // Always have default first.
231  __time[0] = _M_data->_M_time_format;
232  __time[1] = _M_data->_M_time_era_format;
233  }
234 
235  void
236  _M_date_time_formats(const _CharT** __dt) const
237  {
238  // Always have default first.
239  __dt[0] = _M_data->_M_date_time_format;
240  __dt[1] = _M_data->_M_date_time_era_format;
241  }
242 
243  void
244  _M_am_pm_format(const _CharT* __ampm) const
245  { __ampm = _M_data->_M_am_pm_format; }
246 
247  void
248  _M_am_pm(const _CharT** __ampm) const
249  {
250  __ampm[0] = _M_data->_M_am;
251  __ampm[1] = _M_data->_M_pm;
252  }
253 
254  void
255  _M_days(const _CharT** __days) const
256  {
257  __days[0] = _M_data->_M_day1;
258  __days[1] = _M_data->_M_day2;
259  __days[2] = _M_data->_M_day3;
260  __days[3] = _M_data->_M_day4;
261  __days[4] = _M_data->_M_day5;
262  __days[5] = _M_data->_M_day6;
263  __days[6] = _M_data->_M_day7;
264  }
265 
266  void
267  _M_days_abbreviated(const _CharT** __days) const
268  {
269  __days[0] = _M_data->_M_aday1;
270  __days[1] = _M_data->_M_aday2;
271  __days[2] = _M_data->_M_aday3;
272  __days[3] = _M_data->_M_aday4;
273  __days[4] = _M_data->_M_aday5;
274  __days[5] = _M_data->_M_aday6;
275  __days[6] = _M_data->_M_aday7;
276  }
277 
278  void
279  _M_months(const _CharT** __months) const
280  {
281  __months[0] = _M_data->_M_month01;
282  __months[1] = _M_data->_M_month02;
283  __months[2] = _M_data->_M_month03;
284  __months[3] = _M_data->_M_month04;
285  __months[4] = _M_data->_M_month05;
286  __months[5] = _M_data->_M_month06;
287  __months[6] = _M_data->_M_month07;
288  __months[7] = _M_data->_M_month08;
289  __months[8] = _M_data->_M_month09;
290  __months[9] = _M_data->_M_month10;
291  __months[10] = _M_data->_M_month11;
292  __months[11] = _M_data->_M_month12;
293  }
294 
295  void
296  _M_months_abbreviated(const _CharT** __months) const
297  {
298  __months[0] = _M_data->_M_amonth01;
299  __months[1] = _M_data->_M_amonth02;
300  __months[2] = _M_data->_M_amonth03;
301  __months[3] = _M_data->_M_amonth04;
302  __months[4] = _M_data->_M_amonth05;
303  __months[5] = _M_data->_M_amonth06;
304  __months[6] = _M_data->_M_amonth07;
305  __months[7] = _M_data->_M_amonth08;
306  __months[8] = _M_data->_M_amonth09;
307  __months[9] = _M_data->_M_amonth10;
308  __months[10] = _M_data->_M_amonth11;
309  __months[11] = _M_data->_M_amonth12;
310  }
311 
312  protected:
313  virtual
314  ~__timepunct();
315 
316  // For use at construction time only.
317  void
318  _M_initialize_timepunct(__c_locale __cloc = 0);
319  };
320 
321  template<typename _CharT>
323 
324  // Specializations.
325  template<>
326  void
327  __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc);
328 
329  template<>
330  void
331  __timepunct<char>::_M_put(char*, size_t, const char*, const tm*) const throw ();
332 
333 #ifdef _GLIBCXX_USE_WCHAR_T
334  template<>
335  void
336  __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc);
337 
338  template<>
339  void
340  __timepunct<wchar_t>::_M_put(wchar_t*, size_t, const wchar_t*,
341  const tm*) const throw ();
342 #endif
343 
344 _GLIBCXX_END_NAMESPACE_VERSION
345 } // namespace
346 
347  // Include host and configuration specific timepunct functions.
348  #include <bits/time_members.h>
349 
350 namespace std _GLIBCXX_VISIBILITY(default)
351 {
352 _GLIBCXX_BEGIN_NAMESPACE_VERSION
353 
367  template<typename _CharT, typename _InIter>
368  class time_get : public locale::facet, public time_base
369  {
370  public:
371  // Types:
373  typedef _CharT char_type;
375  typedef _InIter iter_type;
377  typedef basic_string<_CharT> __string_type;
378 
380  static locale::id id;
381 
389  explicit
390  time_get(size_t __refs = 0)
391  : facet (__refs) { }
392 
406  dateorder
407  date_order() const
408  { return this->do_date_order(); }
409 
430  iter_type
431  get_time(iter_type __beg, iter_type __end, ios_base& __io,
432  ios_base::iostate& __err, tm* __tm) const
433  { return this->do_get_time(__beg, __end, __io, __err, __tm); }
434 
455  iter_type
456  get_date(iter_type __beg, iter_type __end, ios_base& __io,
457  ios_base::iostate& __err, tm* __tm) const
458  { return this->do_get_date(__beg, __end, __io, __err, __tm); }
459 
483  iter_type
484  get_weekday(iter_type __beg, iter_type __end, ios_base& __io,
485  ios_base::iostate& __err, tm* __tm) const
486  { return this->do_get_weekday(__beg, __end, __io, __err, __tm); }
487 
512  iter_type
513  get_monthname(iter_type __beg, iter_type __end, ios_base& __io,
514  ios_base::iostate& __err, tm* __tm) const
515  { return this->do_get_monthname(__beg, __end, __io, __err, __tm); }
516 
538  iter_type
539  get_year(iter_type __beg, iter_type __end, ios_base& __io,
540  ios_base::iostate& __err, tm* __tm) const
541  { return this->do_get_year(__beg, __end, __io, __err, __tm); }
542 
543  protected:
545  virtual
546  ~time_get() { }
547 
558  virtual dateorder
559  do_date_order() const;
560 
576  virtual iter_type
577  do_get_time(iter_type __beg, iter_type __end, ios_base& __io,
578  ios_base::iostate& __err, tm* __tm) const;
579 
595  virtual iter_type
596  do_get_date(iter_type __beg, iter_type __end, ios_base& __io,
597  ios_base::iostate& __err, tm* __tm) const;
598 
614  virtual iter_type
615  do_get_weekday(iter_type __beg, iter_type __end, ios_base&,
616  ios_base::iostate& __err, tm* __tm) const;
617 
633  virtual iter_type
634  do_get_monthname(iter_type __beg, iter_type __end, ios_base&,
635  ios_base::iostate& __err, tm* __tm) const;
636 
652  virtual iter_type
653  do_get_year(iter_type __beg, iter_type __end, ios_base& __io,
654  ios_base::iostate& __err, tm* __tm) const;
655 
656  // Extract numeric component of length __len.
657  iter_type
658  _M_extract_num(iter_type __beg, iter_type __end, int& __member,
659  int __min, int __max, size_t __len,
660  ios_base& __io, ios_base::iostate& __err) const;
661 
662  // Extract any unique array of string literals in a const _CharT* array.
663  iter_type
664  _M_extract_name(iter_type __beg, iter_type __end, int& __member,
665  const _CharT** __names, size_t __indexlen,
666  ios_base& __io, ios_base::iostate& __err) const;
667 
668  // Extract day or month name in a const _CharT* array.
669  iter_type
670  _M_extract_wday_or_month(iter_type __beg, iter_type __end, int& __member,
671  const _CharT** __names, size_t __indexlen,
672  ios_base& __io, ios_base::iostate& __err) const;
673 
674  // Extract on a component-by-component basis, via __format argument.
675  iter_type
676  _M_extract_via_format(iter_type __beg, iter_type __end, ios_base& __io,
677  ios_base::iostate& __err, tm* __tm,
678  const _CharT* __format) const;
679  };
680 
681  template<typename _CharT, typename _InIter>
683 
685  template<typename _CharT, typename _InIter>
686  class time_get_byname : public time_get<_CharT, _InIter>
687  {
688  public:
689  // Types:
690  typedef _CharT char_type;
691  typedef _InIter iter_type;
692 
693  explicit
694  time_get_byname(const char*, size_t __refs = 0)
695  : time_get<_CharT, _InIter>(__refs) { }
696 
697  protected:
698  virtual
699  ~time_get_byname() { }
700  };
701 
714  template<typename _CharT, typename _OutIter>
715  class time_put : public locale::facet
716  {
717  public:
718  // Types:
720  typedef _CharT char_type;
722  typedef _OutIter iter_type;
724 
726  static locale::id id;
727 
735  explicit
736  time_put(size_t __refs = 0)
737  : facet(__refs) { }
738 
754  iter_type
755  put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
756  const _CharT* __beg, const _CharT* __end) const;
757 
774  iter_type
775  put(iter_type __s, ios_base& __io, char_type __fill,
776  const tm* __tm, char __format, char __mod = 0) const
777  { return this->do_put(__s, __io, __fill, __tm, __format, __mod); }
778 
779  protected:
781  virtual
782  ~time_put()
783  { }
784 
801  virtual iter_type
802  do_put(iter_type __s, ios_base& __io, char_type __fill, const tm* __tm,
803  char __format, char __mod) const;
804  };
805 
806  template<typename _CharT, typename _OutIter>
808 
810  template<typename _CharT, typename _OutIter>
811  class time_put_byname : public time_put<_CharT, _OutIter>
812  {
813  public:
814  // Types:
815  typedef _CharT char_type;
816  typedef _OutIter iter_type;
817 
818  explicit
819  time_put_byname(const char*, size_t __refs = 0)
820  : time_put<_CharT, _OutIter>(__refs)
821  { };
822 
823  protected:
824  virtual
825  ~time_put_byname() { }
826  };
827 
828 
840  class money_base
841  {
842  public:
843  enum part { none, space, symbol, sign, value };
844  struct pattern { char field[4]; };
845 
846  static const pattern _S_default_pattern;
847 
848  enum
849  {
850  _S_minus,
851  _S_zero,
852  _S_end = 11
853  };
854 
855  // String literal of acceptable (narrow) input/output, for
856  // money_get/money_put. "-0123456789"
857  static const char* _S_atoms;
858 
859  // Construct and return valid pattern consisting of some combination of:
860  // space none symbol sign value
861  _GLIBCXX_CONST static pattern
862  _S_construct_pattern(char __precedes, char __space, char __posn) throw ();
863  };
864 
865  template<typename _CharT, bool _Intl>
866  struct __moneypunct_cache : public locale::facet
867  {
868  const char* _M_grouping;
869  size_t _M_grouping_size;
870  bool _M_use_grouping;
871  _CharT _M_decimal_point;
872  _CharT _M_thousands_sep;
873  const _CharT* _M_curr_symbol;
874  size_t _M_curr_symbol_size;
875  const _CharT* _M_positive_sign;
876  size_t _M_positive_sign_size;
877  const _CharT* _M_negative_sign;
878  size_t _M_negative_sign_size;
879  int _M_frac_digits;
880  money_base::pattern _M_pos_format;
881  money_base::pattern _M_neg_format;
882 
883  // A list of valid numeric literals for input and output: in the standard
884  // "C" locale, this is "-0123456789". This array contains the chars after
885  // having been passed through the current locale's ctype<_CharT>.widen().
886  _CharT _M_atoms[money_base::_S_end];
887 
888  bool _M_allocated;
889 
890  __moneypunct_cache(size_t __refs = 0) : facet(__refs),
891  _M_grouping(0), _M_grouping_size(0), _M_use_grouping(false),
892  _M_decimal_point(_CharT()), _M_thousands_sep(_CharT()),
893  _M_curr_symbol(0), _M_curr_symbol_size(0),
894  _M_positive_sign(0), _M_positive_sign_size(0),
895  _M_negative_sign(0), _M_negative_sign_size(0),
896  _M_frac_digits(0),
897  _M_pos_format(money_base::pattern()),
898  _M_neg_format(money_base::pattern()), _M_allocated(false)
899  { }
900 
901  ~__moneypunct_cache();
902 
903  void
904  _M_cache(const locale& __loc);
905 
906  private:
907  __moneypunct_cache&
908  operator=(const __moneypunct_cache&);
909 
910  explicit
911  __moneypunct_cache(const __moneypunct_cache&);
912  };
913 
914  template<typename _CharT, bool _Intl>
915  __moneypunct_cache<_CharT, _Intl>::~__moneypunct_cache()
916  {
917  if (_M_allocated)
918  {
919  delete [] _M_grouping;
920  delete [] _M_curr_symbol;
921  delete [] _M_positive_sign;
922  delete [] _M_negative_sign;
923  }
924  }
925 
933  template<typename _CharT, bool _Intl>
934  class moneypunct : public locale::facet, public money_base
935  {
936  public:
937  // Types:
939  typedef _CharT char_type;
941  typedef basic_string<_CharT> string_type;
943  typedef __moneypunct_cache<_CharT, _Intl> __cache_type;
944 
945  private:
946  __cache_type* _M_data;
947 
948  public:
951  static const bool intl = _Intl;
953  static locale::id id;
954 
962  explicit
963  moneypunct(size_t __refs = 0)
964  : facet(__refs), _M_data(0)
965  { _M_initialize_moneypunct(); }
966 
975  explicit
976  moneypunct(__cache_type* __cache, size_t __refs = 0)
977  : facet(__refs), _M_data(__cache)
978  { _M_initialize_moneypunct(); }
979 
990  explicit
991  moneypunct(__c_locale __cloc, const char* __s, size_t __refs = 0)
992  : facet(__refs), _M_data(0)
993  { _M_initialize_moneypunct(__cloc, __s); }
994 
1004  char_type
1005  decimal_point() const
1006  { return this->do_decimal_point(); }
1007 
1017  char_type
1018  thousands_sep() const
1019  { return this->do_thousands_sep(); }
1020 
1047  string
1048  grouping() const
1049  { return this->do_grouping(); }
1050 
1060  string_type
1061  curr_symbol() const
1062  { return this->do_curr_symbol(); }
1063 
1077  string_type
1078  positive_sign() const
1079  { return this->do_positive_sign(); }
1080 
1094  string_type
1095  negative_sign() const
1096  { return this->do_negative_sign(); }
1097 
1110  int
1111  frac_digits() const
1112  { return this->do_frac_digits(); }
1113 
1115 
1146  pattern
1147  pos_format() const
1148  { return this->do_pos_format(); }
1149 
1150  pattern
1151  neg_format() const
1152  { return this->do_neg_format(); }
1154 
1155  protected:
1157  virtual
1158  ~moneypunct();
1159 
1168  virtual char_type
1169  do_decimal_point() const
1170  { return _M_data->_M_decimal_point; }
1171 
1180  virtual char_type
1181  do_thousands_sep() const
1182  { return _M_data->_M_thousands_sep; }
1183 
1193  virtual string
1194  do_grouping() const
1195  { return _M_data->_M_grouping; }
1196 
1206  virtual string_type
1207  do_curr_symbol() const
1208  { return _M_data->_M_curr_symbol; }
1209 
1219  virtual string_type
1220  do_positive_sign() const
1221  { return _M_data->_M_positive_sign; }
1222 
1232  virtual string_type
1233  do_negative_sign() const
1234  { return _M_data->_M_negative_sign; }
1235 
1246  virtual int
1247  do_frac_digits() const
1248  { return _M_data->_M_frac_digits; }
1249 
1260  virtual pattern
1261  do_pos_format() const
1262  { return _M_data->_M_pos_format; }
1263 
1274  virtual pattern
1275  do_neg_format() const
1276  { return _M_data->_M_neg_format; }
1277 
1278  // For use at construction time only.
1279  void
1280  _M_initialize_moneypunct(__c_locale __cloc = 0,
1281  const char* __name = 0);
1282  };
1283 
1284  template<typename _CharT, bool _Intl>
1286 
1287  template<typename _CharT, bool _Intl>
1288  const bool moneypunct<_CharT, _Intl>::intl;
1289 
1290  template<>
1291  moneypunct<char, true>::~moneypunct();
1292 
1293  template<>
1294  moneypunct<char, false>::~moneypunct();
1295 
1296  template<>
1297  void
1298  moneypunct<char, true>::_M_initialize_moneypunct(__c_locale, const char*);
1299 
1300  template<>
1301  void
1302  moneypunct<char, false>::_M_initialize_moneypunct(__c_locale, const char*);
1303 
1304 #ifdef _GLIBCXX_USE_WCHAR_T
1305  template<>
1306  moneypunct<wchar_t, true>::~moneypunct();
1307 
1308  template<>
1309  moneypunct<wchar_t, false>::~moneypunct();
1310 
1311  template<>
1312  void
1313  moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale,
1314  const char*);
1315 
1316  template<>
1317  void
1318  moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale,
1319  const char*);
1320 #endif
1321 
1323  template<typename _CharT, bool _Intl>
1324  class moneypunct_byname : public moneypunct<_CharT, _Intl>
1325  {
1326  public:
1327  typedef _CharT char_type;
1328  typedef basic_string<_CharT> string_type;
1329 
1330  static const bool intl = _Intl;
1331 
1332  explicit
1333  moneypunct_byname(const char* __s, size_t __refs = 0)
1334  : moneypunct<_CharT, _Intl>(__refs)
1335  {
1336  if (__builtin_strcmp(__s, "C") != 0
1337  && __builtin_strcmp(__s, "POSIX") != 0)
1338  {
1339  __c_locale __tmp;
1340  this->_S_create_c_locale(__tmp, __s);
1341  this->_M_initialize_moneypunct(__tmp);
1342  this->_S_destroy_c_locale(__tmp);
1343  }
1344  }
1345 
1346  protected:
1347  virtual
1348  ~moneypunct_byname() { }
1349  };
1350 
1351  template<typename _CharT, bool _Intl>
1352  const bool moneypunct_byname<_CharT, _Intl>::intl;
1353 
1354 _GLIBCXX_BEGIN_NAMESPACE_LDBL
1355 
1369  template<typename _CharT, typename _InIter>
1370  class money_get : public locale::facet
1371  {
1372  public:
1373  // Types:
1375  typedef _CharT char_type;
1377  typedef _InIter iter_type;
1378  typedef basic_string<_CharT> string_type;
1380 
1382  static locale::id id;
1383 
1391  explicit
1392  money_get(size_t __refs = 0) : facet(__refs) { }
1393 
1421  iter_type
1422  get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1423  ios_base::iostate& __err, long double& __units) const
1424  { return this->do_get(__s, __end, __intl, __io, __err, __units); }
1425 
1452  iter_type
1453  get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1454  ios_base::iostate& __err, string_type& __digits) const
1455  { return this->do_get(__s, __end, __intl, __io, __err, __digits); }
1456 
1457  protected:
1459  virtual
1460  ~money_get() { }
1461 
1469  // XXX GLIBCXX_ABI Deprecated
1470 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
1471  virtual iter_type
1472  __do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1473  ios_base::iostate& __err, double& __units) const;
1474 #else
1475  virtual iter_type
1476  do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1477  ios_base::iostate& __err, long double& __units) const;
1478 #endif
1479 
1487  virtual iter_type
1488  do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1489  ios_base::iostate& __err, string_type& __digits) const;
1490 
1491  // XXX GLIBCXX_ABI Deprecated
1492 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
1493  virtual iter_type
1494  do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
1495  ios_base::iostate& __err, long double& __units) const;
1496 #endif
1497 
1498  template<bool _Intl>
1499  iter_type
1500  _M_extract(iter_type __s, iter_type __end, ios_base& __io,
1501  ios_base::iostate& __err, string& __digits) const;
1502  };
1503 
1504  template<typename _CharT, typename _InIter>
1506 
1520  template<typename _CharT, typename _OutIter>
1521  class money_put : public locale::facet
1522  {
1523  public:
1525  typedef _CharT char_type;
1527  typedef _OutIter iter_type;
1528  typedef basic_string<_CharT> string_type;
1530 
1532  static locale::id id;
1533 
1541  explicit
1542  money_put(size_t __refs = 0) : facet(__refs) { }
1543 
1561  iter_type
1562  put(iter_type __s, bool __intl, ios_base& __io,
1563  char_type __fill, long double __units) const
1564  { return this->do_put(__s, __intl, __io, __fill, __units); }
1565 
1584  iter_type
1585  put(iter_type __s, bool __intl, ios_base& __io,
1586  char_type __fill, const string_type& __digits) const
1587  { return this->do_put(__s, __intl, __io, __fill, __digits); }
1588 
1589  protected:
1591  virtual
1592  ~money_put() { }
1593 
1612  // XXX GLIBCXX_ABI Deprecated
1613 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
1614  virtual iter_type
1615  __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1616  double __units) const;
1617 #else
1618  virtual iter_type
1619  do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1620  long double __units) const;
1621 #endif
1622 
1642  virtual iter_type
1643  do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1644  const string_type& __digits) const;
1645 
1646  // XXX GLIBCXX_ABI Deprecated
1647 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
1648  virtual iter_type
1649  do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
1650  long double __units) const;
1651 #endif
1652 
1653  template<bool _Intl>
1654  iter_type
1655  _M_insert(iter_type __s, ios_base& __io, char_type __fill,
1656  const string_type& __digits) const;
1657  };
1658 
1659  template<typename _CharT, typename _OutIter>
1661 
1662 _GLIBCXX_END_NAMESPACE_LDBL
1663 
1668  struct messages_base
1669  {
1670  typedef int catalog;
1671  };
1672 
1694  template<typename _CharT>
1695  class messages : public locale::facet, public messages_base
1696  {
1697  public:
1698  // Types:
1700  typedef _CharT char_type;
1702  typedef basic_string<_CharT> string_type;
1704 
1705  protected:
1706  // Underlying "C" library locale information saved from
1707  // initialization, needed by messages_byname as well.
1708  __c_locale _M_c_locale_messages;
1709  const char* _M_name_messages;
1710 
1711  public:
1713  static locale::id id;
1714 
1722  explicit
1723  messages(size_t __refs = 0);
1724 
1725  // Non-standard.
1736  explicit
1737  messages(__c_locale __cloc, const char* __s, size_t __refs = 0);
1738 
1739  /*
1740  * @brief Open a message catalog.
1741  *
1742  * This function opens and returns a handle to a message catalog by
1743  * returning do_open(__s, __loc).
1744  *
1745  * @param __s The catalog to open.
1746  * @param __loc Locale to use for character set conversions.
1747  * @return Handle to the catalog or value < 0 if open fails.
1748  */
1749  catalog
1750  open(const basic_string<char>& __s, const locale& __loc) const
1751  { return this->do_open(__s, __loc); }
1752 
1753  // Non-standard and unorthodox, yet effective.
1754  /*
1755  * @brief Open a message catalog.
1756  *
1757  * This non-standard function opens and returns a handle to a message
1758  * catalog by returning do_open(s, loc). The third argument provides a
1759  * message catalog root directory for gnu gettext and is ignored
1760  * otherwise.
1761  *
1762  * @param __s The catalog to open.
1763  * @param __loc Locale to use for character set conversions.
1764  * @param __dir Message catalog root directory.
1765  * @return Handle to the catalog or value < 0 if open fails.
1766  */
1767  catalog
1768  open(const basic_string<char>&, const locale&, const char*) const;
1769 
1770  /*
1771  * @brief Look up a string in a message catalog.
1772  *
1773  * This function retrieves and returns a message from a catalog by
1774  * returning do_get(c, set, msgid, s).
1775  *
1776  * For gnu, @a __set and @a msgid are ignored. Returns gettext(s).
1777  * For default, returns s. For ieee, returns catgets(c,set,msgid,s).
1778  *
1779  * @param __c The catalog to access.
1780  * @param __set Implementation-defined.
1781  * @param __msgid Implementation-defined.
1782  * @param __s Default return value if retrieval fails.
1783  * @return Retrieved message or @a __s if get fails.
1784  */
1785  string_type
1786  get(catalog __c, int __set, int __msgid, const string_type& __s) const
1787  { return this->do_get(__c, __set, __msgid, __s); }
1788 
1789  /*
1790  * @brief Close a message catalog.
1791  *
1792  * Closes catalog @a c by calling do_close(c).
1793  *
1794  * @param __c The catalog to close.
1795  */
1796  void
1797  close(catalog __c) const
1798  { return this->do_close(__c); }
1799 
1800  protected:
1802  virtual
1803  ~messages();
1804 
1805  /*
1806  * @brief Open a message catalog.
1807  *
1808  * This function opens and returns a handle to a message catalog in an
1809  * implementation-defined manner. This function is a hook for derived
1810  * classes to change the value returned.
1811  *
1812  * @param __s The catalog to open.
1813  * @param __loc Locale to use for character set conversions.
1814  * @return Handle to the opened catalog, value < 0 if open failed.
1815  */
1816  virtual catalog
1817  do_open(const basic_string<char>&, const locale&) const;
1818 
1819  /*
1820  * @brief Look up a string in a message catalog.
1821  *
1822  * This function retrieves and returns a message from a catalog in an
1823  * implementation-defined manner. This function is a hook for derived
1824  * classes to change the value returned.
1825  *
1826  * For gnu, @a __set and @a __msgid are ignored. Returns gettext(s).
1827  * For default, returns s. For ieee, returns catgets(c,set,msgid,s).
1828  *
1829  * @param __c The catalog to access.
1830  * @param __set Implementation-defined.
1831  * @param __msgid Implementation-defined.
1832  * @param __s Default return value if retrieval fails.
1833  * @return Retrieved message or @a __s if get fails.
1834  */
1835  virtual string_type
1836  do_get(catalog, int, int, const string_type& __dfault) const;
1837 
1838  /*
1839  * @brief Close a message catalog.
1840  *
1841  * @param __c The catalog to close.
1842  */
1843  virtual void
1844  do_close(catalog) const;
1845 
1846  // Returns a locale and codeset-converted string, given a char* message.
1847  char*
1848  _M_convert_to_char(const string_type& __msg) const
1849  {
1850  // XXX
1851  return reinterpret_cast<char*>(const_cast<_CharT*>(__msg.c_str()));
1852  }
1853 
1854  // Returns a locale and codeset-converted string, given a char* message.
1855  string_type
1856  _M_convert_from_char(char*) const
1857  {
1858  // XXX
1859  return string_type();
1860  }
1861  };
1862 
1863  template<typename _CharT>
1865 
1867  template<>
1868  string
1869  messages<char>::do_get(catalog, int, int, const string&) const;
1870 
1871 #ifdef _GLIBCXX_USE_WCHAR_T
1872  template<>
1873  wstring
1874  messages<wchar_t>::do_get(catalog, int, int, const wstring&) const;
1875 #endif
1876 
1878  template<typename _CharT>
1879  class messages_byname : public messages<_CharT>
1880  {
1881  public:
1882  typedef _CharT char_type;
1883  typedef basic_string<_CharT> string_type;
1884 
1885  explicit
1886  messages_byname(const char* __s, size_t __refs = 0);
1887 
1888  protected:
1889  virtual
1890  ~messages_byname()
1891  { }
1892  };
1893 
1894 _GLIBCXX_END_NAMESPACE_VERSION
1895 } // namespace
1896 
1897 // Include host and configuration specific messages functions.
1898 #include <bits/messages_members.h>
1899 
1900 // 22.2.1.5 Template class codecvt
1901 #include <bits/codecvt.h>
1902 
1904 
1905 #endif
#define false
Definition: stdbool.h:35
namespace std _GLIBCXX_VISIBILITY(default)
Definition: auto_ptr.h:36
struct objc_object * id
Definition: basic_string.h:45