30#ifndef _LOCALE_FACETS_NONIO_TCC
31#define _LOCALE_FACETS_NONIO_TCC 1
33#pragma GCC system_header
35namespace std _GLIBCXX_VISIBILITY(default)
37_GLIBCXX_BEGIN_NAMESPACE_VERSION
39 template<
typename _CharT,
bool _Intl>
40 struct __use_cache<__moneypunct_cache<_CharT, _Intl> >
42 const __moneypunct_cache<_CharT, _Intl>*
43 operator() (
const locale& __loc)
const
46 const locale::facet** __caches = __loc._M_impl->_M_caches;
49 __moneypunct_cache<_CharT, _Intl>* __tmp = 0;
52 __tmp =
new __moneypunct_cache<_CharT, _Intl>;
53 __tmp->_M_cache(__loc);
58 __throw_exception_again;
60 __loc._M_impl->_M_install_cache(__tmp, __i);
63 const __moneypunct_cache<_CharT, _Intl>*
>(__caches[__i]);
67 template<
typename _CharT,
bool _Intl>
69 __moneypunct_cache<_CharT, _Intl>::_M_cache(
const locale& __loc)
71 const moneypunct<_CharT, _Intl>& __mp =
72 use_facet<moneypunct<_CharT, _Intl> >(__loc);
74 _M_decimal_point = __mp.decimal_point();
75 _M_thousands_sep = __mp.thousands_sep();
76 _M_frac_digits = __mp.frac_digits();
79 _CharT* __curr_symbol = 0;
80 _CharT* __positive_sign = 0;
81 _CharT* __negative_sign = 0;
84 const string& __g = __mp.grouping();
85 _M_grouping_size = __g.size();
86 __grouping =
new char[_M_grouping_size];
87 __g.copy(__grouping, _M_grouping_size);
88 _M_use_grouping = (_M_grouping_size
89 &&
static_cast<signed char>(__grouping[0]) > 0
91 != __gnu_cxx::__numeric_traits<char>::__max));
93 const basic_string<_CharT>& __cs = __mp.curr_symbol();
94 _M_curr_symbol_size = __cs.size();
95 __curr_symbol =
new _CharT[_M_curr_symbol_size];
96 __cs.copy(__curr_symbol, _M_curr_symbol_size);
98 const basic_string<_CharT>& __ps = __mp.positive_sign();
99 _M_positive_sign_size = __ps.size();
100 __positive_sign =
new _CharT[_M_positive_sign_size];
101 __ps.copy(__positive_sign, _M_positive_sign_size);
103 const basic_string<_CharT>& __ns = __mp.negative_sign();
104 _M_negative_sign_size = __ns.size();
105 __negative_sign =
new _CharT[_M_negative_sign_size];
106 __ns.copy(__negative_sign, _M_negative_sign_size);
108 _M_pos_format = __mp.pos_format();
109 _M_neg_format = __mp.neg_format();
111 const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__loc);
112 __ct.widen(money_base::_S_atoms,
113 money_base::_S_atoms + money_base::_S_end, _M_atoms);
115 _M_grouping = __grouping;
116 _M_curr_symbol = __curr_symbol;
117 _M_positive_sign = __positive_sign;
118 _M_negative_sign = __negative_sign;
123 delete [] __grouping;
124 delete [] __curr_symbol;
125 delete [] __positive_sign;
126 delete [] __negative_sign;
127 __throw_exception_again;
131_GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11
133 template<
typename _CharT,
typename _InIter>
136 money_get<_CharT, _InIter>::
137 _M_extract(iter_type __beg, iter_type __end, ios_base& __io,
140 typedef char_traits<_CharT> __traits_type;
141 typedef typename string_type::size_type size_type;
142 typedef money_base::part part;
143 typedef __moneypunct_cache<_CharT, _Intl> __cache_type;
145 const locale& __loc = __io._M_getloc();
146 const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
148 __use_cache<__cache_type> __uc;
149 const __cache_type* __lc = __uc(__loc);
150 const char_type* __lit = __lc->_M_atoms;
153 bool __negative =
false;
155 size_type __sign_size = 0;
157 const bool __mandatory_sign = (__lc->_M_positive_sign_size
158 && __lc->_M_negative_sign_size);
160 string __grouping_tmp;
161 if (__lc->_M_use_grouping)
162 __grouping_tmp.reserve(32);
168 bool __testvalid =
true;
170 bool __testdecfound =
false;
176 const char_type* __lit_zero = __lit + money_base::_S_zero;
177 const money_base::pattern __p = __lc->_M_neg_format;
178 for (
int __i = 0; __i < 4 && __testvalid; ++__i)
180 const part __which =
static_cast<part
>(__p.field[__i]);
183 case money_base::symbol:
190 || (__i == 1 && (__mandatory_sign
191 || (
static_cast<part
>(__p.field[0])
193 || (
static_cast<part
>(__p.field[2])
194 == money_base::space)))
195 || (__i == 2 && ((
static_cast<part
>(__p.field[3])
196 == money_base::value)
198 && (
static_cast<part
>(__p.field[3])
199 == money_base::sign)))))
201 const size_type __len = __lc->_M_curr_symbol_size;
203 for (; __beg != __end && __j < __len
204 && *__beg == __lc->_M_curr_symbol[__j];
205 ++__beg, (void)++__j);
211 case money_base::sign:
213 if (__lc->_M_positive_sign_size && __beg != __end
214 && *__beg == __lc->_M_positive_sign[0])
216 __sign_size = __lc->_M_positive_sign_size;
219 else if (__lc->_M_negative_sign_size && __beg != __end
220 && *__beg == __lc->_M_negative_sign[0])
223 __sign_size = __lc->_M_negative_sign_size;
226 else if (__lc->_M_positive_sign_size
227 && !__lc->_M_negative_sign_size)
231 else if (__mandatory_sign)
234 case money_base::value:
237 for (; __beg != __end; ++__beg)
239 const char_type __c = *__beg;
240 const char_type* __q = __traits_type::find(__lit_zero,
244 __res += money_base::_S_atoms[__q - __lit];
247 else if (__c == __lc->_M_decimal_point
250 if (__lc->_M_frac_digits <= 0)
255 __testdecfound =
true;
257 else if (__lc->_M_use_grouping
258 && __c == __lc->_M_thousands_sep
264 __grouping_tmp +=
static_cast<char>(__n);
279 case money_base::space:
281 if (__beg != __end && __ctype.is(ctype_base::space, *__beg))
285 case money_base::none:
288 for (; __beg != __end
289 && __ctype.is(ctype_base::space, *__beg); ++__beg);
295 if (__sign_size > 1 && __testvalid)
297 const char_type* __sign = __negative ? __lc->_M_negative_sign
298 : __lc->_M_positive_sign;
300 for (; __beg != __end && __i < __sign_size
301 && *__beg == __sign[__i]; ++__beg, (void)++__i);
303 if (__i != __sign_size)
310 if (__res.size() > 1)
312 const size_type __first = __res.find_first_not_of(
'0');
315 __res.erase(0, __only_zeros ? __res.size() - 1 : __first);
319 if (__negative && __res[0] !=
'0')
320 __res.insert(__res.begin(),
'-');
323 if (__grouping_tmp.size())
326 __grouping_tmp +=
static_cast<char>(__testdecfound ? __last_pos
328 if (!std::__verify_grouping(__lc->_M_grouping,
329 __lc->_M_grouping_size,
335 if (__testdecfound && __n != __lc->_M_frac_digits)
351#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \
352 && _GLIBCXX_USE_CXX11_ABI == 0
353 template<
typename _CharT,
typename _InIter>
355 money_get<_CharT, _InIter>::
356 __do_get(iter_type __beg, iter_type __end,
bool __intl, ios_base& __io,
360 __beg = __intl ? _M_extract<true>(__beg, __end, __io, __err, __str)
361 : _M_extract<false>(__beg, __end, __io, __err, __str);
362 std::__convert_to_v(__str.c_str(), __units, __err, _S_get_c_locale());
367 template<
typename _CharT,
typename _InIter>
380 template<
typename _CharT,
typename _InIter>
386 typedef typename string::size_type size_type;
403 template<
typename _CharT,
typename _OutIter>
408 const string_type& __digits)
const
410 typedef typename string_type::size_type size_type;
411 typedef money_base::part part;
419 const char_type*
__lit = __lc->_M_atoms;
423 const char_type*
__beg = __digits.data();
425 money_base::pattern __p;
430 __p = __lc->_M_pos_format;
431 __sign = __lc->_M_positive_sign;
436 __p = __lc->_M_neg_format;
437 __sign = __lc->_M_negative_sign;
438 __sign_size = __lc->_M_negative_sign_size;
444 size_type __len = __ctype.scan_not(ctype_base::digit, __beg,
445 __beg + __digits.size()) - __beg;
452 __value.reserve(2 * __len);
456 long __paddec = __len - __lc->_M_frac_digits;
459 if (__lc->_M_frac_digits < 0)
461 if (__lc->_M_grouping_size)
463 __value.assign(2 * __paddec, char_type());
465 std::__add_grouping(&__value[0], __lc->_M_thousands_sep,
467 __lc->_M_grouping_size,
468 __beg, __beg + __paddec);
469 __value.erase(__vend - &__value[0]);
472 __value.assign(__beg, __paddec);
476 if (__lc->_M_frac_digits > 0)
478 __value += __lc->_M_decimal_point;
480 __value.append(__beg + __paddec, __lc->_M_frac_digits);
484 __value.append(-__paddec, __lit[money_base::_S_zero]);
485 __value.append(__beg, __len);
492 __len = __value.size() + __sign_size;
494 ? __lc->_M_curr_symbol_size : 0);
497 __res.reserve(2 * __len);
499 const size_type __width =
static_cast<size_type
>(__io.
width());
503 for (
int __i = 0; __i < 4; ++__i)
505 const part __which =
static_cast<part
>(__p.field[__i]);
508 case money_base::symbol:
510 __res.append(__lc->_M_curr_symbol,
511 __lc->_M_curr_symbol_size);
513 case money_base::sign:
520 case money_base::value:
523 case money_base::space:
528 __res.append(__width - __len, __fill);
532 case money_base::none:
534 __res.append(__width - __len, __fill);
541 __res.append(__sign + 1, __sign_size - 1);
544 __len = __res.size();
549 __res.append(__width - __len, __fill);
552 __res.insert(0, __width - __len, __fill);
557 __s = std::__write(__s, __res.data(), __len);
563#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ \
564 && _GLIBCXX_USE_CXX11_ABI == 0
565 template<
typename _CharT,
typename _OutIter>
567 money_put<_CharT, _OutIter>::
568 __do_put(iter_type __s,
bool __intl, ios_base& __io, char_type __fill,
569 double __units)
const
570 {
return this->do_put(__s, __intl, __io, __fill, (
long double) __units); }
573 template<
typename _CharT,
typename _OutIter>
581#if _GLIBCXX_USE_C99_STDIO
600 __gnu_cxx::__numeric_traits<long double>::__max_exponent10 + 3;
602 int __len = std::__convert_from_v(_S_get_c_locale(),
__cs, 0,
"%.*Lf",
611 template<
typename _CharT,
typename _OutIter>
619_GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11
624 template<
typename _CharT,
typename _InIter>
627 {
return time_base::no_order; }
631 template<
typename _CharT,
typename _InIter>
652 if (__c ==
'E' || __c ==
'O')
689 const char_type*
__dt[2];
807 __timepunct_cache<_CharT>::_S_timezones,
832 if (__format[__i] == *__beg)
839 if (__tmperr || __i != __len)
845 template<
typename _CharT,
typename _InIter>
847 time_get<_CharT, _InIter>::
848 _M_extract_num(iter_type __beg, iter_type __end,
int& __member,
849 int __min,
int __max,
size_t __len,
852 const locale& __loc = __io._M_getloc();
853 const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
856 int __mult = __len == 2 ? 10 : (__len == 4 ? 1000 : 1);
861 for (; __beg != __end && __i < __len; ++__beg, (void)++__i)
863 const char __c = __ctype.narrow(*__beg,
'*');
864 if (__c >=
'0' && __c <=
'9')
866 __value = __value * 10 + (__c -
'0');
867 const int __valuec = __value * __mult;
868 if (__valuec > __max || __valuec + __mult < __min)
878 else if (__len == 4 && __i == 2)
879 __member = __value - 100;
888 template<
typename _CharT,
typename _InIter>
890 time_get<_CharT, _InIter>::
891 _M_extract_name(iter_type __beg, iter_type __end,
int& __member,
892 const _CharT** __names,
size_t __indexlen,
895 typedef char_traits<_CharT> __traits_type;
896 const locale& __loc = __io._M_getloc();
897 const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
899 int* __matches =
static_cast<int*
>(__builtin_alloca(
sizeof(
int)
901 size_t __nmatches = 0;
903 bool __testvalid =
true;
904 const char_type* __name;
912 const char_type __c = *__beg;
913 for (
size_t __i1 = 0; __i1 < __indexlen; ++__i1)
914 if (__c == __names[__i1][0]
915 || __c == __ctype.toupper(__names[__i1][0]))
916 __matches[__nmatches++] = __i1;
919 while (__nmatches > 1)
922 size_t __minlen = __traits_type::length(__names[__matches[0]]);
923 for (
size_t __i2 = 1; __i2 < __nmatches; ++__i2)
925 __traits_type::length(__names[__matches[__i2]]));
928 if (__pos < __minlen && __beg != __end)
929 for (
size_t __i3 = 0; __i3 < __nmatches;)
931 __name = __names[__matches[__i3]];
932 if (!(__name[__pos] == *__beg))
933 __matches[__i3] = __matches[--__nmatches];
946 __name = __names[__matches[0]];
947 const size_t __len = __traits_type::length(__name);
948 while (__pos < __len && __beg != __end && __name[__pos] == *__beg)
949 ++__beg, (void)++__pos;
952 __member = __matches[0];
964 template<
typename _CharT,
typename _InIter>
966 time_get<_CharT, _InIter>::
967 _M_extract_wday_or_month(iter_type __beg, iter_type __end,
int& __member,
968 const _CharT** __names,
size_t __indexlen,
971 typedef char_traits<_CharT> __traits_type;
972 const locale& __loc = __io._M_getloc();
973 const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
975 int* __matches =
static_cast<int*
>(__builtin_alloca(2 *
sizeof(
int)
977 size_t __nmatches = 0;
978 size_t* __matches_lengths = 0;
983 const char_type __c = *__beg;
984 for (
size_t __i = 0; __i < 2 * __indexlen; ++__i)
985 if (__c == __names[__i][0]
986 || __c == __ctype.toupper(__names[__i][0]))
987 __matches[__nmatches++] = __i;
996 =
static_cast<size_t*
>(__builtin_alloca(
sizeof(
size_t)
998 for (
size_t __i = 0; __i < __nmatches; ++__i)
999 __matches_lengths[__i]
1000 = __traits_type::length(__names[__matches[__i]]);
1003 for (; __beg != __end; ++__beg, (void)++__pos)
1005 size_t __nskipped = 0;
1006 const char_type __c = *__beg;
1007 for (
size_t __i = 0; __i < __nmatches;)
1009 const char_type* __name = __names[__matches[__i]];
1010 if (__pos >= __matches_lengths[__i])
1011 ++__nskipped, ++__i;
1012 else if (!(__name[__pos] == __c))
1015 __matches[__i] = __matches[__nmatches];
1016 __matches_lengths[__i] = __matches_lengths[__nmatches];
1021 if (__nskipped == __nmatches)
1025 if ((__nmatches == 1 && __matches_lengths[0] == __pos)
1026 || (__nmatches == 2 && (__matches_lengths[0] == __pos
1027 || __matches_lengths[1] == __pos)))
1028 __member = (__matches[0] >= __indexlen
1029 ? __matches[0] - __indexlen : __matches[0]);
1036 template<
typename _CharT,
typename _InIter>
1053 template<
typename _CharT,
typename _InIter>
1070 template<
typename _CharT,
typename _InIter>
1097 template<
typename _CharT,
typename _InIter>
1124 template<
typename _CharT,
typename _InIter>
1147#if __cplusplus >= 201103L
1148 template<
typename _CharT,
typename _InIter>
1177 if (__c !=
'E' && __c !=
'O')
1200 while (
__s != __end &&
1220 template<
typename _CharT,
typename _InIter>
1254 template<
typename _CharT,
typename _OutIter>
1258 const _CharT*
__beg,
const _CharT* __end)
const
1268 else if (++
__beg != __end)
1273 if (__c !=
'E' && __c !=
'O')
1275 else if (++
__beg != __end)
1289 template<
typename _CharT,
typename _OutIter>
1332#if _GLIBCXX_EXTERN_TEMPLATE
1337 extern template class _GLIBCXX_NAMESPACE_LDBL_OR_CXX11
money_get<char>;
1338 extern template class _GLIBCXX_NAMESPACE_LDBL_OR_CXX11
money_put<char>;
1407#ifdef _GLIBCXX_USE_WCHAR_T
1484_GLIBCXX_END_NAMESPACE_VERSION
_GLIBCXX14_CONSTEXPR const _Tp & min(const _Tp &, const _Tp &)
This does what you think it does.
ISO C++ entities toplevel namespace is std.
void resize(size_type __n, _CharT __c)
Resizes the string to the specified number of characters.
static const size_type npos
Value returned by various member functions when they fail.
Basis for explicit traits specializations.
The base of the I/O class hierarchy.
_Ios_Fmtflags fmtflags
This is a bitmask type.
_Ios_Iostate iostate
This is a bitmask type.
static const fmtflags showbase
Generates a prefix indicating the numeric base of generated integer output.
static const fmtflags internal
Adds fill characters at a designated internal point in certain generated output, or identical to righ...
fmtflags flags() const
Access to format flags.
static const iostate eofbit
Indicates that an input operation reached the end of an input sequence.
static const iostate goodbit
Indicates all is well.
streamsize width() const
Flags access.
static const fmtflags left
Adds fill characters on the right (final positions) of certain generated output. (I....
static const iostate failbit
Indicates that an input operation failed to read the expected characters, or that an output operation...
static const fmtflags adjustfield
A mask of left|right|internal. Useful for the 2-arg form of setf.
Container class for localization functionality.
Primary class template time_get.
virtual iter_type do_get_year(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input year string.
virtual iter_type do_get_weekday(iter_type __beg, iter_type __end, ios_base &, ios_base::iostate &__err, tm *__tm) const
Parse input weekday string.
virtual iter_type do_get_monthname(iter_type __beg, iter_type __end, ios_base &, ios_base::iostate &__err, tm *__tm) const
Parse input month string.
_CharT char_type
Public typedefs.
iter_type do_get(iter_type __s, iter_type __end, ios_base &__f, ios_base::iostate &__err, tm *__tm, char __format, char __modifier) const
Parse input string according to format.
iter_type get(iter_type __s, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm, char __format, char __modifier=0) const
Parse input string according to format.
virtual dateorder do_date_order() const
Return preferred order of month, day, and year.
virtual iter_type do_get_date(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input date string.
virtual iter_type do_get_time(iter_type __beg, iter_type __end, ios_base &__io, ios_base::iostate &__err, tm *__tm) const
Parse input time string.
virtual iter_type do_put(iter_type __s, ios_base &__io, char_type __fill, const tm *__tm, char __format, char __mod) const
Format and output a time or date.
_CharT char_type
Public typedefs.
iter_type put(iter_type __s, ios_base &__io, char_type __fill, const tm *__tm, const _CharT *__beg, const _CharT *__end) const
Format and output a time or date.
static locale::id id
Numpunct facet id.
virtual iter_type do_get(iter_type __s, iter_type __end, bool __intl, ios_base &__io, ios_base::iostate &__err, long double &__units) const
Read and parse a monetary value.
Primary class template money_put.
virtual iter_type do_put(iter_type __s, bool __intl, ios_base &__io, char_type __fill, long double __units) const
Format and output a monetary value.
_CharT char_type
Public typedefs.