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