30#ifndef _GLIBCXX_CHRONO_IO_H
31#define _GLIBCXX_CHRONO_IO_H 1
34#pragma GCC system_header
37#if __cplusplus >= 202002L
48namespace std _GLIBCXX_VISIBILITY(default)
50_GLIBCXX_BEGIN_NAMESPACE_VERSION
60#define _GLIBCXX_WIDEN_(C, S) ::std::__format::_Widen<C>(S, L##S)
61#define _GLIBCXX_WIDEN(S) _GLIBCXX_WIDEN_(_CharT, S)
63 template<
typename _Period,
typename _CharT>
65 __units_suffix()
noexcept
70#define _GLIBCXX_UNITS_SUFFIX(period, suffix) \
71 if constexpr (is_same_v<_Period, period>) \
72 return _GLIBCXX_WIDEN(suffix); \
75 _GLIBCXX_UNITS_SUFFIX(atto,
"as")
76 _GLIBCXX_UNITS_SUFFIX(femto,
"fs")
77 _GLIBCXX_UNITS_SUFFIX(pico,
"ps")
78 _GLIBCXX_UNITS_SUFFIX(nano,
"ns")
79 _GLIBCXX_UNITS_SUFFIX(milli,
"ms")
80#if _GLIBCXX_USE_ALT_MICROSECONDS_SUFFIX
83 _GLIBCXX_UNITS_SUFFIX(micro,
"\u00b5s")
85 _GLIBCXX_UNITS_SUFFIX(micro,
"us")
87 _GLIBCXX_UNITS_SUFFIX(centi,
"cs")
88 _GLIBCXX_UNITS_SUFFIX(deci,
"ds")
90 _GLIBCXX_UNITS_SUFFIX(deca,
"das")
91 _GLIBCXX_UNITS_SUFFIX(hecto,
"hs")
92 _GLIBCXX_UNITS_SUFFIX(kilo,
"ks")
93 _GLIBCXX_UNITS_SUFFIX(mega,
"Ms")
94 _GLIBCXX_UNITS_SUFFIX(giga,
"Gs")
95 _GLIBCXX_UNITS_SUFFIX(tera,
"Ts")
96 _GLIBCXX_UNITS_SUFFIX(tera,
"Ts")
97 _GLIBCXX_UNITS_SUFFIX(peta,
"Ps")
98 _GLIBCXX_UNITS_SUFFIX(exa,
"Es")
102#undef _GLIBCXX_UNITS_SUFFIX
106 template<
typename _Period,
typename _CharT,
typename _Out>
108 __fmt_units_suffix(_Out __out)
noexcept
110 if (
auto __s = __detail::__units_suffix<_Period, _CharT>(); __s.size())
111 return __format::__write(
std::move(__out), __s);
112 else if constexpr (_Period::den == 1)
113 return std::format_to(
std::move(__out), _GLIBCXX_WIDEN(
"[{}]s"),
114 (uintmax_t)_Period::num);
116 return std::format_to(
std::move(__out), _GLIBCXX_WIDEN(
"[{}/{}]s"),
117 (uintmax_t)_Period::num,
118 (uintmax_t)_Period::den);
127 template<
typename _CharT,
typename _Traits,
128 typename _Rep,
typename _Period>
134 using period =
typename _Period::type;
142 __detail::__fmt_units_suffix<period, _CharT>(_Out(__s));
152 template<
typename _Duration>
153 struct __local_time_fmt
155 local_time<_Duration> _M_time;
156 const string* _M_abbrev;
162 template<
typename _Duration>
163 using __local_time_fmt_for
164 = __local_time_fmt<common_type_t<_Duration, seconds>>;
177 template<
typename _Duration>
178 inline __detail::__local_time_fmt<_Duration>
180 const string* __abbrev =
nullptr,
181 const seconds* __offset_sec =
nullptr)
182 {
return {__time, __abbrev, __offset_sec}; }
190 [[noreturn,__gnu__::__always_inline__]]
192 __no_timezone_available()
193 { __throw_format_error(
"format error: no timezone available for %Z or %z"); }
195 [[noreturn,__gnu__::__always_inline__]]
197 __not_valid_for_duration()
198 { __throw_format_error(
"format error: chrono-format-spec not valid for "
199 "chrono::duration"); }
201 [[noreturn,__gnu__::__always_inline__]]
203 __invalid_chrono_spec()
204 { __throw_format_error(
"format error: chrono-format-spec not valid for "
207 template<
typename _CharT>
208 struct _ChronoSpec : _Spec<_CharT>
210 basic_string_view<_CharT> _M_chrono_specs;
219 _M_locale_specific() const noexcept
220 {
return this->_M_reserved; }
223 _M_locale_specific(
bool __b)
noexcept
224 { this->_M_reserved = __b; }
231 _Year = 1, _Month = 2, _Day = 4, _Weekday = 8, _TimeOfDay = 16,
233 _Date = _Year | _Month | _Day | _Weekday,
234 _DateTime = _Date | _TimeOfDay,
235 _ZonedDateTime = _DateTime | _TimeZone,
239 constexpr _ChronoParts
240 operator|(_ChronoParts __x, _ChronoParts __y)
noexcept
241 {
return static_cast<_ChronoParts
>((int)__x | (int)__y); }
243 constexpr _ChronoParts&
244 operator|=(_ChronoParts& __x, _ChronoParts __y)
noexcept
245 {
return __x = __x | __y; }
248 template<
typename _CharT>
249 struct __formatter_chrono
251 using __string_view = basic_string_view<_CharT>;
252 using __string = basic_string<_CharT>;
254 template<
typename _ParseContext>
255 constexpr typename _ParseContext::iterator
256 _M_parse(_ParseContext& __pc, _ChronoParts __parts)
258 auto __first = __pc.
begin();
259 auto __last = __pc.end();
261 _ChronoSpec<_CharT> __spec{};
263 auto __finalize = [
this, &__spec] {
267 auto __finished = [&] {
268 if (__first == __last || *__first ==
'}')
279 __first = __spec._M_parse_fill_and_align(__first, __last);
283 __first = __spec._M_parse_width(__first, __last, __pc);
287 if (__parts & _ChronoParts::_Duration)
289 __first = __spec._M_parse_precision(__first, __last, __pc);
294 __first = __spec._M_parse_locale(__first, __last);
301 __string_view __str(__first, __last - __first);
302 auto __end = __str.find(
'}');
303 if (__end != __str.npos)
305 __str.remove_suffix(__str.length() - __end);
306 __last = __first + __end;
308 if (__str.find(
'{') != __str.npos)
309 __throw_format_error(
"chrono format error: '{' in chrono-specs");
316 const auto __chrono_specs = __first++;
317 if (*__chrono_specs !=
'%')
318 __throw_format_error(
"chrono format error: no '%' at start of "
324 bool __locale_specific =
false;
326 while (__first != __last)
328 enum _Mods { _Mod_none, _Mod_E, _Mod_O, _Mod_E_O };
329 _Mods __allowed_mods = _Mod_none;
331 _CharT __c = *__first++;
337 __locale_specific =
true;
343 __locale_specific =
true;
346 __needed = _DateTime;
347 __allowed_mods = _Mod_E;
348 __locale_specific =
true;
352 __allowed_mods = _Mod_E;
357 __allowed_mods = _Mod_O;
369 __needed = _TimeOfDay;
370 __allowed_mods = _Mod_O;
373 if (!(__parts & _Duration))
378 __allowed_mods = _Mod_O;
381 __needed = _TimeOfDay;
382 __allowed_mods = _Mod_O;
386 __locale_specific =
true;
390 __needed = _TimeOfDay;
394 __needed = _Duration;
397 __needed = _TimeOfDay;
398 __allowed_mods = _Mod_O;
403 __allowed_mods = _Mod_O;
409 __allowed_mods = _Mod_O;
413 __locale_specific =
true;
414 __allowed_mods = _Mod_E;
417 __needed = _TimeOfDay;
418 __locale_specific =
true;
419 __allowed_mods = _Mod_E;
423 __allowed_mods = _Mod_E_O;
427 __allowed_mods = _Mod_E;
430 __needed = _TimeZone;
431 __allowed_mods = _Mod_E_O;
434 __needed = _TimeZone;
442 if (__mod) [[unlikely]]
444 __allowed_mods = _Mod_none;
450 __throw_format_error(
"chrono format error: invalid "
451 " specifier in chrono-specs");
454 if ((__mod ==
'E' && !(__allowed_mods & _Mod_E))
455 || (__mod ==
'O' && !(__allowed_mods & _Mod_O)))
456 __throw_format_error(
"chrono format error: invalid "
457 " modifier in chrono-specs");
458 if (__mod && __c !=
'z')
459 __locale_specific =
true;
462 if ((__parts & __needed) != __needed)
463 __throw_format_error(
"chrono format error: format argument "
464 "does not contain the information "
465 "required by the chrono-specs");
468 size_t __pos = __string_view(__first, __last - __first).find(
'%');
473 if (__pos == __string_view::npos)
479 __first += __pos + 1;
484 if (__conv || __mod != _CharT())
485 __throw_format_error(
"chrono format error: unescaped '%' in "
489 _M_spec._M_chrono_specs
490 = __string_view(__chrono_specs, __first - __chrono_specs);
491 _M_spec._M_locale_specific(__locale_specific);
501 template<
typename _Tp,
typename _FormatContext>
502 typename _FormatContext::iterator
503 _M_format(
const _Tp& __t, _FormatContext& __fc,
504 bool __is_neg =
false)
const
506 auto __first = _M_spec._M_chrono_specs.begin();
507 const auto __last = _M_spec._M_chrono_specs.end();
508 if (__first == __last)
509 return _M_format_to_ostream(__t, __fc, __is_neg);
511#if defined _GLIBCXX_USE_NL_LANGINFO_L && __CHAR_BIT__ == 8
515 if constexpr (is_same_v<_CharT, char>)
516 if constexpr (__unicode::__literal_encoding_is_utf8())
517 if (_M_spec._M_localized && _M_spec._M_locale_specific())
519 extern locale __with_encoding_conversion(
const locale&);
523 locale __loc = __fc.locale();
524 if (__loc != locale::classic())
525 __fc._M_loc = __with_encoding_conversion(__loc);
529 _Sink_iter<_CharT> __out;
530 __format::_Str_sink<_CharT> __sink;
531 bool __write_direct =
false;
532 if constexpr (is_same_v<
typename _FormatContext::iterator,
535 if (_M_spec._M_width_kind == __format::_WP_none)
538 __write_direct =
true;
541 __out = __sink.out();
544 __out = __sink.out();
548 if constexpr (__is_specialization_of<_Tp, chrono::hh_mm_ss>)
549 __is_neg = __t.is_negative();
551 auto __print_sign = [&__is_neg, &__out] {
552 if constexpr (chrono::__is_duration_v<_Tp>
553 || __is_specialization_of<_Tp, chrono::hh_mm_ss>)
556 *__out++ = _S_plus_minus[1];
563 constexpr const _CharT* __literals = _GLIBCXX_WIDEN(
"\n\t%");
570 _CharT __c = *__first++;
575 __out = _M_a_A(__t,
std::move(__out), __fc, __c ==
'A');
580 __out = _M_b_B(__t,
std::move(__out), __fc, __c ==
'B');
586 __out = _M_c_r_x_X(__t,
std::move(__out), __fc, __c, __mod);
591 __out = _M_C_y_Y(__t,
std::move(__out), __fc, __c, __mod);
595 __out = _M_d_e(__t,
std::move(__out), __fc, __c, __mod ==
'O');
598 __out = _M_D(__t,
std::move(__out), __fc);
601 __out = _M_F(__t,
std::move(__out), __fc);
605 __out = _M_g_G(__t,
std::move(__out), __fc, __c ==
'G');
609 __out = _M_H_I(__t, __print_sign(), __fc, __c, __mod ==
'O');
612 __out = _M_j(__t, __print_sign(), __fc);
615 __out = _M_m(__t,
std::move(__out), __fc, __mod ==
'O');
618 __out = _M_M(__t, __print_sign(), __fc, __mod ==
'O');
621 __out = _M_p(__t,
std::move(__out), __fc);
624 __out = _M_q(__t,
std::move(__out), __fc);
628 if constexpr (chrono::__is_duration_v<_Tp>)
631 __out = std::format_to(__print_sign(), _S_empty_spec,
634 __throw_format_error(
"chrono format error: argument is "
639 __out = _M_R_T(__t, __print_sign(), __fc, __c ==
'T');
642 __out = _M_S(__t, __print_sign(), __fc, __mod ==
'O');
646 __out = _M_u_w(__t,
std::move(__out), __fc, __c, __mod ==
'O');
651 __out = _M_U_V_W(__t,
std::move(__out), __fc, __c,
655 __out = _M_z(__t,
std::move(__out), __fc, (
bool)__mod);
658 __out = _M_Z(__t,
std::move(__out), __fc);
661 *__out++ = __literals[0];
664 *__out++ = __literals[1];
667 *__out++ = __literals[2];
679 __string_view __str(__first, __last - __first);
680 size_t __pos = __str.find(
'%');
685 if (__pos == __str.npos)
689 __str.remove_suffix(__str.length() - __pos);
690 __first += __pos + 1;
692 __out = __format::__write(
std::move(__out), __str);
695 while (__first != __last);
697 if constexpr (is_same_v<
typename _FormatContext::iterator,
702 auto __span = __sink.view();
703 __string_view __str(__span.data(), __span.size());
705 if constexpr (__unicode::__literal_encoding_is_unicode<_CharT>())
706 __width = __unicode::__field_width(__str);
708 __width = __str.size();
709 return __format::__write_padded_as_spec(__str, __width,
713 _ChronoSpec<_CharT> _M_spec;
717 template<
typename _FormatContext>
719 _M_locale(_FormatContext& __fc)
const
721 if (!_M_spec._M_localized)
724 return __fc.locale();
732 template<
typename _Tp,
typename _FormatContext>
733 typename _FormatContext::iterator
734 _M_format_to_ostream(
const _Tp& __t, _FormatContext& __fc,
737 using ::std::chrono::__detail::__utc_leap_second;
738 using ::std::chrono::__detail::__local_time_fmt;
740 basic_ostringstream<_CharT> __os;
741 __os.imbue(_M_locale(__fc));
743 if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
746 auto __days = chrono::floor<chrono::days>(__t._M_time);
747 __os << chrono::year_month_day(__days) <<
' '
748 << chrono::hh_mm_ss(__t._M_time - __days);
754 if (!__t._M_abbrev) [[unlikely]]
755 __format::__no_timezone_available();
756 else if constexpr (is_same_v<_CharT, char>)
757 __os <<
' ' << *__t._M_abbrev;
761 for (
char __c : *__t._M_abbrev)
768 if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
769 __os << __t._M_date <<
' ' << __t._M_time;
770 else if constexpr (chrono::__is_time_point_v<_Tp>)
777 if constexpr (is_convertible_v<_Tp, chrono::sys_days>)
778 __os << _S_date(__t);
780 else if constexpr (is_convertible_v<_Tp, chrono::local_days>)
781 __os << _S_date(__t);
784 auto __days = chrono::floor<chrono::days>(__t);
785 __os << chrono::year_month_day(__days) <<
' '
786 << chrono::hh_mm_ss(__t - __days);
791 if constexpr (chrono::__is_duration_v<_Tp>)
792 if (__is_neg) [[unlikely]]
793 __os << _S_plus_minus[1];
799 return __format::__write_padded_as_spec(__str, __str.size(),
803 static constexpr const _CharT* _S_chars
804 = _GLIBCXX_WIDEN(
"0123456789+-:/ {}");
805 static constexpr const _CharT* _S_plus_minus = _S_chars + 10;
806 static constexpr _CharT _S_colon = _S_chars[12];
807 static constexpr _CharT _S_slash = _S_chars[13];
808 static constexpr _CharT _S_space = _S_chars[14];
809 static constexpr const _CharT* _S_empty_spec = _S_chars + 15;
811 template<
typename _OutIter>
813 _M_write(_OutIter __out,
const locale& __loc, __string_view __s)
const
815#if defined _GLIBCXX_USE_NL_LANGINFO_L && __CHAR_BIT__ == 8
820 if constexpr (is_same_v<_CharT, char>)
821 if constexpr (__unicode::__literal_encoding_is_utf8())
822 if (_M_spec._M_localized && _M_spec._M_locale_specific()
823 && __loc != locale::classic())
826 __locale_encoding_to_utf8(
const locale&, string_view,
void*);
828 __s = __locale_encoding_to_utf8(__loc, __s, &__buf);
831 return __format::__write(
std::move(__out), __s);
834 template<
typename _Tp,
typename _FormatContext>
835 typename _FormatContext::iterator
836 _M_a_A(
const _Tp& __t,
typename _FormatContext::iterator __out,
837 _FormatContext& __ctx,
bool __full)
const
841 chrono::weekday __wd = _S_weekday(__t);
843 __throw_format_error(
"format error: invalid weekday");
845 locale __loc = _M_locale(__ctx);
847 __tm.tm_wday = __wd.c_encoding();
848 return _M_locale_fmt(
std::move(__out), __loc, __tm,
849 __full ?
'A' :
'a', 0);
852 template<
typename _Tp,
typename _FormatContext>
853 typename _FormatContext::iterator
854 _M_b_B(
const _Tp& __t,
typename _FormatContext::iterator __out,
855 _FormatContext& __ctx,
bool __full)
const
859 chrono::month __m = _S_month(__t);
861 __throw_format_error(
"format error: invalid month");
862 locale __loc = _M_locale(__ctx);
864 __tm.tm_mon = (unsigned)__m - 1;
865 return _M_locale_fmt(
std::move(__out), __loc, __tm,
866 __full ?
'B' :
'b', 0);
869 template<
typename _Tp,
typename _FormatContext>
870 typename _FormatContext::iterator
871 _M_c_r_x_X(
const _Tp& __t,
typename _FormatContext::iterator __out,
872 _FormatContext& __ctx, _CharT __conv, _CharT __mod)
const
882 using namespace chrono;
883 using ::std::chrono::__detail::__utc_leap_second;
884 using ::std::chrono::__detail::__local_time_fmt;
894#ifdef _GLIBCXX_USE_STRUCT_TM_TM_ZONE
897 if constexpr (__is_time_point_v<_Tp>)
900 if constexpr (!is_same_v<typename _Tp::clock, local_t>)
901 __tm.tm_zone =
const_cast<char*
>(
"UTC");
903 else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
908 __tm.tm_zone =
const_cast<char*
>(__t._M_abbrev->c_str());
911 __tm.tm_zone =
const_cast<char*
>(
"UTC");
914 if (__conv ==
'c' || __conv ==
'x')
916 auto __d = _S_days(__t);
917 using _TDays =
decltype(__d);
918 const year_month_day __ymd(__d);
919 const auto __y = __ymd.year();
921 __tm.tm_year = (int)__y - 1900;
922 __tm.tm_yday = (__d - _TDays(__y/January/1)).count();
923 __tm.tm_mon = (unsigned)__ymd.month() - 1;
924 __tm.tm_mday = (unsigned)__ymd.day();
925 __tm.tm_wday = weekday(__d).c_encoding();
930 const auto __hms = _S_hms(__t);
931 __tm.tm_hour = __hms.hours().count();
932 __tm.tm_min = __hms.minutes().count();
933 __tm.tm_sec = __hms.seconds().count();
936 return _M_locale_fmt(
std::move(__out), _M_locale(__ctx), __tm,
940 template<
typename _Tp,
typename _FormatContext>
941 typename _FormatContext::iterator
942 _M_C_y_Y(
const _Tp& __t,
typename _FormatContext::iterator __out,
943 _FormatContext& __ctx, _CharT __conv, _CharT __mod = 0)
const
953 chrono::year __y = _S_year(__t);
955 if (__mod && _M_spec._M_localized) [[unlikely]]
956 if (
auto __loc = __ctx.locale(); __loc != locale::classic())
959 __tm.tm_year = (int)__y - 1900;
960 return _M_locale_fmt(
std::move(__out), __loc, __tm,
964 basic_string<_CharT> __s;
966 const bool __is_neg = __yi < 0;
967 __yi = __builtin_abs(__yi);
969 if (__conv ==
'Y' || __conv ==
'C')
971 int __ci = __yi / 100;
972 if (__is_neg) [[unlikely]]
974 __s.assign(1, _S_plus_minus[1]);
976 if (__conv ==
'C' && (__ci * 100) != __yi)
979 if (__ci >= 100) [[unlikely]]
981 __s += std::format(_S_empty_spec, __ci / 100);
984 __s += _S_two_digits(__ci);
987 if (__conv ==
'Y' || __conv ==
'y')
988 __s += _S_two_digits(__yi % 100);
990 return __format::__write(
std::move(__out), __string_view(__s));
993 template<
typename _Tp,
typename _FormatContext>
994 typename _FormatContext::iterator
995 _M_D(
const _Tp& __t,
typename _FormatContext::iterator __out,
996 _FormatContext&)
const
998 auto __ymd = _S_date(__t);
999 basic_string<_CharT> __s;
1000#if ! _GLIBCXX_USE_CXX11_ABI
1003 __s = _S_two_digits((
unsigned)__ymd.month());
1005 __s += _S_two_digits((
unsigned)__ymd.day());
1007 __s += _S_two_digits(__builtin_abs((
int)__ymd.year()) % 100);
1008 return __format::__write(
std::move(__out), __string_view(__s));
1011 template<
typename _Tp,
typename _FormatContext>
1012 typename _FormatContext::iterator
1013 _M_d_e(
const _Tp& __t,
typename _FormatContext::iterator __out,
1014 _FormatContext& __ctx, _CharT __conv,
bool __mod =
false)
const
1021 chrono::day __d = _S_day(__t);
1022 unsigned __i = (unsigned)__d;
1024 if (__mod && _M_spec._M_localized) [[unlikely]]
1025 if (
auto __loc = __ctx.locale(); __loc != locale::classic())
1029 return _M_locale_fmt(
std::move(__out), __loc, __tm,
1033 auto __sv = _S_two_digits(__i);
1035 if (__conv == _CharT(
'e') && __i < 10)
1037 __buf[0] = _S_space;
1041 return __format::__write(
std::move(__out), __sv);
1044 template<
typename _Tp,
typename _FormatContext>
1045 typename _FormatContext::iterator
1046 _M_F(
const _Tp& __t,
typename _FormatContext::iterator __out,
1047 _FormatContext&)
const
1049 auto __ymd = _S_date(__t);
1050 auto __s = std::format(_GLIBCXX_WIDEN(
"{:04d}- - "),
1052 auto __sv = _S_two_digits((
unsigned)__ymd.month());
1053 __s[__s.size() - 5] = __sv[0];
1054 __s[__s.size() - 4] = __sv[1];
1055 __sv = _S_two_digits((
unsigned)__ymd.day());
1056 __s[__s.size() - 2] = __sv[0];
1057 __s[__s.size() - 1] = __sv[1];
1059 return __format::__write(
std::move(__out), __sv);
1062 template<
typename _Tp,
typename _FormatContext>
1063 typename _FormatContext::iterator
1064 _M_g_G(
const _Tp& __t,
typename _FormatContext::iterator __out,
1065 _FormatContext& __ctx,
bool __full)
const
1069 using namespace chrono;
1070 auto __d = _S_days(__t);
1072 __d -= (weekday(__d) - Monday) -
days(3);
1074 year __y = year_month_day(__d).year();
1075 return _M_C_y_Y(__y,
std::move(__out), __ctx,
"yY"[__full]);
1078 template<
typename _Tp,
typename _FormatContext>
1079 typename _FormatContext::iterator
1080 _M_H_I(
const _Tp& __t,
typename _FormatContext::iterator __out,
1081 _FormatContext& __ctx, _CharT __conv,
bool __mod =
false)
const
1088 const auto __hms = _S_hms(__t);
1089 int __i = __hms.hours().count();
1091 if (__mod && _M_spec._M_localized) [[unlikely]]
1092 if (
auto __loc = __ctx.locale(); __loc != locale::classic())
1096 return _M_locale_fmt(
std::move(__out), __loc, __tm,
1100 if (__conv == _CharT(
'I'))
1107 return __format::__write(
std::move(__out), _S_two_digits(__i));
1110 template<
typename _Tp,
typename _FormatContext>
1111 typename _FormatContext::iterator
1112 _M_j(
const _Tp& __t,
typename _FormatContext::iterator __out,
1113 _FormatContext&)
const
1115 if constexpr (chrono::__is_duration_v<_Tp>)
1118 unsigned __d = chrono::duration_cast<chrono::days>(__t).count();
1119 return std::format_to(
std::move(__out), _S_empty_spec, __d);
1124 using namespace chrono;
1125 auto __day = _S_days(__t);
1126 auto __ymd = _S_date(__t);
1130 if constexpr (is_same_v<
typename decltype(__day)::clock, local_t>)
1131 __d = __day - local_days(__ymd.year()/January/0);
1133 __d = __day - sys_days(__ymd.year()/January/0);
1134 return std::format_to(
std::move(__out), _GLIBCXX_WIDEN(
"{:03d}"),
1139 template<
typename _Tp,
typename _FormatContext>
1140 typename _FormatContext::iterator
1141 _M_m(
const _Tp& __t,
typename _FormatContext::iterator __out,
1142 _FormatContext& __ctx,
bool __mod)
const
1147 auto __m = _S_month(__t);
1148 auto __i = (unsigned)__m;
1150 if (__mod && _M_spec._M_localized) [[unlikely]]
1151 if (
auto __loc = __ctx.locale(); __loc != locale::classic())
1154 __tm.tm_mon = __i - 1;
1155 return _M_locale_fmt(
std::move(__out), __loc, __tm,
1159 return __format::__write(
std::move(__out), _S_two_digits(__i));
1162 template<
typename _Tp,
typename _FormatContext>
1163 typename _FormatContext::iterator
1164 _M_M(
const _Tp& __t,
typename _FormatContext::iterator __out,
1165 _FormatContext& __ctx,
bool __mod)
const
1170 auto __m = _S_hms(__t).minutes();
1171 auto __i = __m.count();
1173 if (__mod && _M_spec._M_localized) [[unlikely]]
1174 if (
auto __loc = __ctx.locale(); __loc != locale::classic())
1178 return _M_locale_fmt(
std::move(__out), __loc, __tm,
1182 return __format::__write(
std::move(__out), _S_two_digits(__i));
1185 template<
typename _Tp,
typename _FormatContext>
1186 typename _FormatContext::iterator
1187 _M_p(
const _Tp& __t,
typename _FormatContext::iterator __out,
1188 _FormatContext& __ctx)
const
1191 auto __hi = _S_hms(__t).hours().count();
1192 if (__hi >= 24) [[unlikely]]
1195 locale __loc = _M_locale(__ctx);
1197 __tm.tm_hour = __hi;
1198 return _M_locale_fmt(
std::move(__out), __loc, __tm,
'p', 0);
1201 template<
typename _Tp,
typename _FormatContext>
1202 typename _FormatContext::iterator
1203 _M_q(
const _Tp&,
typename _FormatContext::iterator __out,
1204 _FormatContext&)
const
1207 if constexpr (!chrono::__is_duration_v<_Tp>)
1208 __throw_format_error(
"format error: argument is not a duration");
1211 namespace __d = chrono::__detail;
1212 using period =
typename _Tp::period;
1213 return __d::__fmt_units_suffix<period, _CharT>(
std::move(__out));
1219 template<
typename _Tp,
typename _FormatContext>
1220 typename _FormatContext::iterator
1221 _M_R_T(
const _Tp& __t,
typename _FormatContext::iterator __out,
1222 _FormatContext& __ctx,
bool __secs)
const
1226 auto __hms = _S_hms(__t);
1228 auto __s = std::format(_GLIBCXX_WIDEN(
"{:02d}:00"),
1229 __hms.hours().count());
1230 auto __sv = _S_two_digits(__hms.minutes().count());
1231 __s[__s.size() - 2] = __sv[0];
1232 __s[__s.size() - 1] = __sv[1];
1234 __out = __format::__write(
std::move(__out), __sv);
1237 *__out++ = _S_colon;
1238 __out = _M_S(__hms,
std::move(__out), __ctx);
1243 template<
typename _Tp,
typename _FormatContext>
1244 typename _FormatContext::iterator
1245 _M_S(
const _Tp& __t,
typename _FormatContext::iterator __out,
1246 _FormatContext& __ctx,
bool __mod =
false)
const
1250 auto __hms = _S_hms(__t);
1251 auto __s = __hms.seconds();
1253 if (__mod) [[unlikely]]
1255 if (_M_spec._M_localized)
1256 if (
auto __loc = __ctx.locale(); __loc != locale::classic())
1259 __tm.tm_sec = (int)__s.count();
1260 return _M_locale_fmt(
std::move(__out), __loc, __tm,
1265 return __format::__write(
std::move(__out),
1266 _S_two_digits(__s.count()));
1269 if constexpr (__hms.fractional_width == 0)
1270 __out = __format::__write(
std::move(__out),
1271 _S_two_digits(__s.count()));
1274 locale __loc = _M_locale(__ctx);
1275 auto __ss = __hms.subseconds();
1276 using rep =
typename decltype(__ss)::rep;
1277 if constexpr (is_floating_point_v<rep>)
1279 chrono::duration<rep> __fs = __s + __ss;
1280 __out = std::format_to(
std::move(__out), __loc,
1281 _GLIBCXX_WIDEN(
"{:#0{}.{}Lf}"),
1283 3 + __hms.fractional_width,
1284 __hms.fractional_width);
1289 = use_facet<numpunct<_CharT>>(__loc);
1290 __out = __format::__write(
std::move(__out),
1291 _S_two_digits(__s.count()));
1292 *__out++ = __np.decimal_point();
1293 if constexpr (is_integral_v<rep>)
1294 __out = std::format_to(
std::move(__out),
1295 _GLIBCXX_WIDEN(
"{:0{}}"),
1297 __hms.fractional_width);
1300 auto __str = std::format(_S_empty_spec, __ss.count());
1301 __out = std::format_to(
std::move(__out),
1302 _GLIBCXX_WIDEN(
"{:0>{}s}"),
1304 __hms.fractional_width);
1313 template<
typename _Tp,
typename _FormatContext>
1314 typename _FormatContext::iterator
1315 _M_u_w(
const _Tp& __t,
typename _FormatContext::iterator __out,
1316 _FormatContext& __ctx, _CharT __conv,
bool __mod =
false)
const
1323 chrono::weekday __wd = _S_weekday(__t);
1325 if (__mod && _M_spec._M_localized) [[unlikely]]
1326 if (
auto __loc = __ctx.locale(); __loc != locale::classic())
1329 __tm.tm_wday = __wd.c_encoding();
1330 return _M_locale_fmt(
std::move(__out), __loc, __tm,
1334 unsigned __wdi = __conv ==
'u' ? __wd.iso_encoding()
1335 : __wd.c_encoding();
1336 const _CharT __d = _S_digit(__wdi);
1337 return __format::__write(
std::move(__out), __string_view(&__d, 1));
1340 template<
typename _Tp,
typename _FormatContext>
1341 typename _FormatContext::iterator
1342 _M_U_V_W(
const _Tp& __t,
typename _FormatContext::iterator __out,
1343 _FormatContext& __ctx, _CharT __conv,
bool __mod =
false)
const
1351 using namespace chrono;
1352 auto __d = _S_days(__t);
1353 using _TDays =
decltype(__d);
1355 if (__mod && _M_spec._M_localized) [[unlikely]]
1356 if (
auto __loc = __ctx.locale(); __loc != locale::classic())
1358 const year_month_day __ymd(__d);
1359 const year __y = __ymd.year();
1361 __tm.tm_year = (int)__y - 1900;
1362 __tm.tm_yday = (__d - _TDays(__y/January/1)).count();
1363 __tm.tm_wday = weekday(__d).c_encoding();
1364 return _M_locale_fmt(
std::move(__out), __loc, __tm,
1372 __d -= (weekday(__d) - Monday) -
days(3);
1375 __first = _TDays(year_month_day(__d).year()/January/1);
1380 if constexpr (
requires { __t.year(); })
1383 __y = year_month_day(__d).year();
1384 const weekday __weekstart = __conv ==
'U' ? Sunday : Monday;
1385 __first = _TDays(__y/January/__weekstart[1]);
1387 auto __weeks = chrono::floor<weeks>(__d - __first);
1388 __string_view __sv = _S_two_digits(__weeks.count() + 1);
1389 return __format::__write(
std::move(__out), __sv);
1392 template<
typename _Tp,
typename _FormatContext>
1393 typename _FormatContext::iterator
1394 _M_z(
const _Tp& __t,
typename _FormatContext::iterator __out,
1395 _FormatContext&,
bool __mod =
false)
const
1397 using ::std::chrono::__detail::__utc_leap_second;
1398 using ::std::chrono::__detail::__local_time_fmt;
1400 auto __utc = __mod ? __string_view(_GLIBCXX_WIDEN(
"+00:00"), 6)
1401 : __string_view(_GLIBCXX_WIDEN(
"+0000"), 5);
1403 if constexpr (chrono::__is_time_point_v<_Tp>)
1405 if constexpr (is_same_v<
typename _Tp::clock,
1406 chrono::system_clock>)
1407 return __format::__write(
std::move(__out), __utc);
1409 else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
1411 if (__t._M_offset_sec)
1414 basic_string<_CharT> __s;
1415 if (*__t._M_offset_sec != 0s)
1417 chrono:: hh_mm_ss __hms(*__t._M_offset_sec);
1418 __s = _S_plus_minus[__hms.is_negative()];
1419 __s += _S_two_digits(__hms.hours().count());
1422 __s += _S_two_digits(__hms.minutes().count());
1425 return __format::__write(
std::move(__out), __sv);
1428 else if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
1429 return __format::__write(
std::move(__out), __utc);
1431 __no_timezone_available();
1434 template<
typename _Tp,
typename _FormatContext>
1435 typename _FormatContext::iterator
1436 _M_Z(
const _Tp& __t,
typename _FormatContext::iterator __out,
1437 _FormatContext& __ctx)
const
1439 using ::std::chrono::__detail::__utc_leap_second;
1440 using ::std::chrono::__detail::__local_time_fmt;
1442 __string_view __utc(_GLIBCXX_WIDEN(
"UTC"), 3);
1443 if constexpr (chrono::__is_time_point_v<_Tp>)
1445 if constexpr (is_same_v<
typename _Tp::clock,
1446 chrono::system_clock>)
1447 return __format::__write(
std::move(__out), __utc);
1449 else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
1453 string_view __sv = *__t._M_abbrev;
1454 if constexpr (is_same_v<_CharT, char>)
1455 return __format::__write(
std::move(__out), __sv);
1459 basic_string<_CharT> __ws(__sv.size(), _CharT());
1460 auto& __ct = use_facet<ctype<_CharT>>(_M_locale(__ctx));
1461 __ct.widen(__sv.begin(), __sv.end(), __ws.data());
1462 __string_view __wsv = __ws;
1463 return __format::__write(
std::move(__out), __wsv);
1467 else if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
1468 return __format::__write(
std::move(__out), __utc);
1470 __no_timezone_available();
1477 _S_digit(
int __n)
noexcept
1480 return _GLIBCXX_WIDEN(
"0123456789999999")[__n & 0xf];
1484 static basic_string_view<_CharT>
1485 _S_two_digits(
int __n)
noexcept
1488 _GLIBCXX_WIDEN(
"0001020304050607080910111213141516171819"
1489 "2021222324252627282930313233343536373839"
1490 "4041424344454647484950515253545556575859"
1491 "6061626364656667686970717273747576777879"
1492 "8081828384858687888990919293949596979899"
1493 "9999999999999999999999999999999999999999"
1494 "9999999999999999") + 2 * (__n & 0x7f),
1502 template<
typename _Tp>
1503 static decltype(
auto)
1504 _S_hms(
const _Tp& __t)
1506 using ::std::chrono::__detail::__utc_leap_second;
1507 using ::std::chrono::__detail::__local_time_fmt;
1509 if constexpr (__is_specialization_of<_Tp, chrono::hh_mm_ss>)
1511 else if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
1513 else if constexpr (chrono::__is_duration_v<_Tp>)
1514 return chrono::hh_mm_ss<_Tp>(__t);
1515 else if constexpr (chrono::__is_time_point_v<_Tp>)
1516 return chrono::hh_mm_ss(__t - chrono::floor<chrono::days>(__t));
1517 else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
1518 return _S_hms(__t._M_time);
1521 __invalid_chrono_spec();
1522 return chrono::hh_mm_ss<chrono::seconds>();
1527 template<
typename _Tp>
1529 _S_days(
const _Tp& __t)
1531 using namespace chrono;
1532 using ::std::chrono::__detail::__utc_leap_second;
1533 using ::std::chrono::__detail::__local_time_fmt;
1535 if constexpr (__is_time_point_v<_Tp>)
1536 return chrono::floor<days>(__t);
1537 else if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
1539 else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
1540 return chrono::floor<days>(__t._M_time);
1541 else if constexpr (is_same_v<_Tp, year_month_day>
1542 || is_same_v<_Tp, year_month_day_last>
1543 || is_same_v<_Tp, year_month_weekday>
1544 || is_same_v<_Tp, year_month_weekday_last>)
1545 return sys_days(__t);
1548 if constexpr (__is_duration_v<_Tp>)
1549 __not_valid_for_duration();
1551 __invalid_chrono_spec();
1552 return chrono::sys_days();
1557 template<
typename _Tp>
1558 static chrono::year_month_day
1559 _S_date(
const _Tp& __t)
1561 if constexpr (is_same_v<_Tp, chrono::year_month_day>)
1564 return chrono::year_month_day(_S_days(__t));
1567 template<
typename _Tp>
1569 _S_day(
const _Tp& __t)
1571 using namespace chrono;
1573 if constexpr (is_same_v<_Tp, day>)
1575 else if constexpr (
requires { __t.day(); })
1578 return _S_date(__t).day();
1581 template<
typename _Tp>
1582 static chrono::month
1583 _S_month(
const _Tp& __t)
1585 using namespace chrono;
1587 if constexpr (is_same_v<_Tp, month>)
1589 else if constexpr (
requires { __t.month(); })
1592 return _S_date(__t).month();
1595 template<
typename _Tp>
1597 _S_year(
const _Tp& __t)
1599 using namespace chrono;
1601 if constexpr (is_same_v<_Tp, year>)
1603 else if constexpr (
requires { __t.year(); })
1606 return _S_date(__t).year();
1609 template<
typename _Tp>
1610 static chrono::weekday
1611 _S_weekday(
const _Tp& __t)
1613 using namespace ::std::chrono;
1614 using ::std::chrono::__detail::__local_time_fmt;
1616 if constexpr (is_same_v<_Tp, weekday>)
1618 else if constexpr (
requires { __t.weekday(); })
1619 return __t.weekday();
1620 else if constexpr (is_same_v<_Tp, month_weekday>)
1621 return __t.weekday_indexed().weekday();
1622 else if constexpr (is_same_v<_Tp, month_weekday_last>)
1623 return __t.weekday_last().weekday();
1625 return weekday(_S_days(__t));
1629 template<
typename _Tp>
1631 _S_floor_seconds(
const _Tp& __t)
1633 using chrono::__detail::__local_time_fmt;
1634 if constexpr (chrono::__is_time_point_v<_Tp>
1635 || chrono::__is_duration_v<_Tp>)
1637 if constexpr (_Tp::period::den != 1)
1638 return chrono::floor<chrono::seconds>(__t);
1642 else if constexpr (__is_specialization_of<_Tp, chrono::hh_mm_ss>)
1644 if constexpr (_Tp::fractional_width != 0)
1645 return chrono::floor<chrono::seconds>(__t.to_duration());
1649 else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
1650 return _S_floor_seconds(__t._M_time);
1657 template<
typename _Iter>
1659 _M_locale_fmt(_Iter __out,
const locale& __loc,
const struct tm& __tm,
1660 char __fmt,
char __mod)
const
1662 basic_ostringstream<_CharT> __os;
1664 const auto& __tp = use_facet<time_put<_CharT>>(__loc);
1665 __tp.put(__os, __os, _S_space, &__tm, __fmt, __mod);
1667 __out = _M_write(
std::move(__out), __loc, __os.view());
1675 template<
typename _Rep,
typename _Period,
typename _CharT>
1676 requires __format::__formattable_impl<_Rep, _CharT>
1677 struct formatter<
chrono::duration<_Rep, _Period>, _CharT>
1679 constexpr typename basic_format_parse_context<_CharT>::iterator
1680 parse(basic_format_parse_context<_CharT>& __pc)
1682 using namespace __format;
1683 auto __it = _M_f._M_parse(__pc, _Duration|_TimeOfDay);
1684 if constexpr (!is_floating_point_v<_Rep>)
1685 if (_M_f._M_spec._M_prec_kind != __format::_WP_none)
1686 __throw_format_error(
"format error: invalid precision for duration");
1690 template<
typename _Out>
1691 typename basic_format_context<_Out, _CharT>::iterator
1692 format(
const chrono::duration<_Rep, _Period>& __d,
1693 basic_format_context<_Out, _CharT>& __fc)
const
1695 if constexpr (numeric_limits<_Rep>::is_signed)
1696 if (__d < __d.zero()) [[unlikely]]
1698 if constexpr (is_integral_v<_Rep>)
1702 using _URep = make_unsigned_t<_Rep>;
1703 auto __ucnt = -
static_cast<_URep
>(__d.count());
1704 auto __ud = chrono::duration<_URep, _Period>(__ucnt);
1705 return _M_f._M_format(__ud, __fc,
true);
1708 return _M_f._M_format(-__d, __fc,
true);
1710 return _M_f._M_format(__d, __fc,
false);
1714 __format::__formatter_chrono<_CharT> _M_f;
1717 template<__format::__
char _CharT>
1718 struct formatter<
chrono::day, _CharT>
1720 constexpr typename basic_format_parse_context<_CharT>::iterator
1721 parse(basic_format_parse_context<_CharT>& __pc)
1722 {
return _M_f._M_parse(__pc, __format::_Day); }
1724 template<
typename _Out>
1725 typename basic_format_context<_Out, _CharT>::iterator
1726 format(
const chrono::day& __t,
1727 basic_format_context<_Out, _CharT>& __fc)
const
1728 {
return _M_f._M_format(__t, __fc); }
1731 __format::__formatter_chrono<_CharT> _M_f;
1734 template<__format::__
char _CharT>
1735 struct formatter<
chrono::month, _CharT>
1737 constexpr typename basic_format_parse_context<_CharT>::iterator
1738 parse(basic_format_parse_context<_CharT>& __pc)
1739 {
return _M_f._M_parse(__pc, __format::_Month); }
1741 template<
typename _Out>
1742 typename basic_format_context<_Out, _CharT>::iterator
1743 format(
const chrono::month& __t,
1744 basic_format_context<_Out, _CharT>& __fc)
const
1745 {
return _M_f._M_format(__t, __fc); }
1748 __format::__formatter_chrono<_CharT> _M_f;
1751 template<__format::__
char _CharT>
1752 struct formatter<
chrono::year, _CharT>
1754 constexpr typename basic_format_parse_context<_CharT>::iterator
1755 parse(basic_format_parse_context<_CharT>& __pc)
1756 {
return _M_f._M_parse(__pc, __format::_Year); }
1758 template<
typename _Out>
1759 typename basic_format_context<_Out, _CharT>::iterator
1760 format(
const chrono::year& __t,
1761 basic_format_context<_Out, _CharT>& __fc)
const
1762 {
return _M_f._M_format(__t, __fc); }
1765 __format::__formatter_chrono<_CharT> _M_f;
1768 template<__format::__
char _CharT>
1769 struct formatter<
chrono::weekday, _CharT>
1771 constexpr typename basic_format_parse_context<_CharT>::iterator
1772 parse(basic_format_parse_context<_CharT>& __pc)
1773 {
return _M_f._M_parse(__pc, __format::_Weekday); }
1775 template<
typename _Out>
1776 typename basic_format_context<_Out, _CharT>::iterator
1777 format(
const chrono::weekday& __t,
1778 basic_format_context<_Out, _CharT>& __fc)
const
1779 {
return _M_f._M_format(__t, __fc); }
1782 __format::__formatter_chrono<_CharT> _M_f;
1785 template<__format::__
char _CharT>
1786 struct formatter<
chrono::weekday_indexed, _CharT>
1788 constexpr typename basic_format_parse_context<_CharT>::iterator
1789 parse(basic_format_parse_context<_CharT>& __pc)
1790 {
return _M_f._M_parse(__pc, __format::_Weekday); }
1792 template<
typename _Out>
1793 typename basic_format_context<_Out, _CharT>::iterator
1794 format(
const chrono::weekday_indexed& __t,
1795 basic_format_context<_Out, _CharT>& __fc)
const
1796 {
return _M_f._M_format(__t, __fc); }
1799 __format::__formatter_chrono<_CharT> _M_f;
1802 template<__format::__
char _CharT>
1803 struct formatter<
chrono::weekday_last, _CharT>
1805 constexpr typename basic_format_parse_context<_CharT>::iterator
1806 parse(basic_format_parse_context<_CharT>& __pc)
1807 {
return _M_f._M_parse(__pc, __format::_Weekday); }
1809 template<
typename _Out>
1810 typename basic_format_context<_Out, _CharT>::iterator
1811 format(
const chrono::weekday_last& __t,
1812 basic_format_context<_Out, _CharT>& __fc)
const
1813 {
return _M_f._M_format(__t, __fc); }
1816 __format::__formatter_chrono<_CharT> _M_f;
1819 template<__format::__
char _CharT>
1820 struct formatter<
chrono::month_day, _CharT>
1822 constexpr typename basic_format_parse_context<_CharT>::iterator
1823 parse(basic_format_parse_context<_CharT>& __pc)
1824 {
return _M_f._M_parse(__pc, __format::_Month|__format::_Day); }
1826 template<
typename _Out>
1827 typename basic_format_context<_Out, _CharT>::iterator
1828 format(
const chrono::month_day& __t,
1829 basic_format_context<_Out, _CharT>& __fc)
const
1830 {
return _M_f._M_format(__t, __fc); }
1833 __format::__formatter_chrono<_CharT> _M_f;
1836 template<__format::__
char _CharT>
1837 struct formatter<
chrono::month_day_last, _CharT>
1839 constexpr typename basic_format_parse_context<_CharT>::iterator
1840 parse(basic_format_parse_context<_CharT>& __pc)
1841 {
return _M_f._M_parse(__pc, __format::_Month); }
1843 template<
typename _Out>
1844 typename basic_format_context<_Out, _CharT>::iterator
1845 format(
const chrono::month_day_last& __t,
1846 basic_format_context<_Out, _CharT>& __fc)
const
1847 {
return _M_f._M_format(__t, __fc); }
1850 __format::__formatter_chrono<_CharT> _M_f;
1853 template<__format::__
char _CharT>
1854 struct formatter<
chrono::month_weekday, _CharT>
1856 constexpr typename basic_format_parse_context<_CharT>::iterator
1857 parse(basic_format_parse_context<_CharT>& __pc)
1858 {
return _M_f._M_parse(__pc, __format::_Month|__format::_Weekday); }
1860 template<
typename _Out>
1861 typename basic_format_context<_Out, _CharT>::iterator
1862 format(
const chrono::month_weekday& __t,
1863 basic_format_context<_Out, _CharT>& __fc)
const
1864 {
return _M_f._M_format(__t, __fc); }
1867 __format::__formatter_chrono<_CharT> _M_f;
1870 template<__format::__
char _CharT>
1871 struct formatter<
chrono::month_weekday_last, _CharT>
1873 constexpr typename basic_format_parse_context<_CharT>::iterator
1874 parse(basic_format_parse_context<_CharT>& __pc)
1875 {
return _M_f._M_parse(__pc, __format::_Month|__format::_Weekday); }
1877 template<
typename _Out>
1878 typename basic_format_context<_Out, _CharT>::iterator
1879 format(
const chrono::month_weekday_last& __t,
1880 basic_format_context<_Out, _CharT>& __fc)
const
1881 {
return _M_f._M_format(__t, __fc); }
1884 __format::__formatter_chrono<_CharT> _M_f;
1887 template<__format::__
char _CharT>
1888 struct formatter<
chrono::year_month, _CharT>
1890 constexpr typename basic_format_parse_context<_CharT>::iterator
1891 parse(basic_format_parse_context<_CharT>& __pc)
1892 {
return _M_f._M_parse(__pc, __format::_Year|__format::_Month); }
1894 template<
typename _Out>
1895 typename basic_format_context<_Out, _CharT>::iterator
1896 format(
const chrono::year_month& __t,
1897 basic_format_context<_Out, _CharT>& __fc)
const
1898 {
return _M_f._M_format(__t, __fc); }
1901 __format::__formatter_chrono<_CharT> _M_f;
1904 template<__format::__
char _CharT>
1905 struct formatter<
chrono::year_month_day, _CharT>
1907 constexpr typename basic_format_parse_context<_CharT>::iterator
1908 parse(basic_format_parse_context<_CharT>& __pc)
1909 {
return _M_f._M_parse(__pc, __format::_Date); }
1911 template<
typename _Out>
1912 typename basic_format_context<_Out, _CharT>::iterator
1913 format(
const chrono::year_month_day& __t,
1914 basic_format_context<_Out, _CharT>& __fc)
const
1915 {
return _M_f._M_format(__t, __fc); }
1918 __format::__formatter_chrono<_CharT> _M_f;
1921 template<__format::__
char _CharT>
1922 struct formatter<
chrono::year_month_day_last, _CharT>
1924 constexpr typename basic_format_parse_context<_CharT>::iterator
1925 parse(basic_format_parse_context<_CharT>& __pc)
1926 {
return _M_f._M_parse(__pc, __format::_Date); }
1928 template<
typename _Out>
1929 typename basic_format_context<_Out, _CharT>::iterator
1930 format(
const chrono::year_month_day_last& __t,
1931 basic_format_context<_Out, _CharT>& __fc)
const
1932 {
return _M_f._M_format(__t, __fc); }
1935 __format::__formatter_chrono<_CharT> _M_f;
1938 template<__format::__
char _CharT>
1939 struct formatter<
chrono::year_month_weekday, _CharT>
1941 constexpr typename basic_format_parse_context<_CharT>::iterator
1942 parse(basic_format_parse_context<_CharT>& __pc)
1943 {
return _M_f._M_parse(__pc, __format::_Date); }
1945 template<
typename _Out>
1946 typename basic_format_context<_Out, _CharT>::iterator
1947 format(
const chrono::year_month_weekday& __t,
1948 basic_format_context<_Out, _CharT>& __fc)
const
1949 {
return _M_f._M_format(__t, __fc); }
1952 __format::__formatter_chrono<_CharT> _M_f;
1955 template<__format::__
char _CharT>
1956 struct formatter<
chrono::year_month_weekday_last, _CharT>
1958 constexpr typename basic_format_parse_context<_CharT>::iterator
1959 parse(basic_format_parse_context<_CharT>& __pc)
1960 {
return _M_f._M_parse(__pc, __format::_Date); }
1962 template<
typename _Out>
1963 typename basic_format_context<_Out, _CharT>::iterator
1964 format(
const chrono::year_month_weekday_last& __t,
1965 basic_format_context<_Out, _CharT>& __fc)
const
1966 {
return _M_f._M_format(__t, __fc); }
1969 __format::__formatter_chrono<_CharT> _M_f;
1972 template<
typename _Rep,
typename _Period, __format::__
char _CharT>
1973 struct formatter<
chrono::hh_mm_ss<chrono::duration<_Rep, _Period>>, _CharT>
1975 constexpr typename basic_format_parse_context<_CharT>::iterator
1976 parse(basic_format_parse_context<_CharT>& __pc)
1977 {
return _M_f._M_parse(__pc, __format::_TimeOfDay); }
1979 template<
typename _Out>
1980 typename basic_format_context<_Out, _CharT>::iterator
1981 format(
const chrono::hh_mm_ss<chrono::duration<_Rep, _Period>>& __t,
1982 basic_format_context<_Out, _CharT>& __fc)
const
1983 {
return _M_f._M_format(__t, __fc); }
1986 __format::__formatter_chrono<_CharT> _M_f;
1989#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
1990 template<__format::__
char _CharT>
1991 struct formatter<
chrono::sys_info, _CharT>
1993 constexpr typename basic_format_parse_context<_CharT>::iterator
1994 parse(basic_format_parse_context<_CharT>& __pc)
1995 {
return _M_f._M_parse(__pc, __format::_ChronoParts{}); }
1997 template<
typename _Out>
1998 typename basic_format_context<_Out, _CharT>::iterator
1999 format(
const chrono::sys_info& __i,
2000 basic_format_context<_Out, _CharT>& __fc)
const
2001 {
return _M_f._M_format(__i, __fc); }
2004 __format::__formatter_chrono<_CharT> _M_f;
2007 template<__format::__
char _CharT>
2008 struct formatter<
chrono::local_info, _CharT>
2010 constexpr typename basic_format_parse_context<_CharT>::iterator
2011 parse(basic_format_parse_context<_CharT>& __pc)
2012 {
return _M_f._M_parse(__pc, __format::_ChronoParts{}); }
2014 template<
typename _Out>
2015 typename basic_format_context<_Out, _CharT>::iterator
2016 format(
const chrono::local_info& __i,
2017 basic_format_context<_Out, _CharT>& __fc)
const
2018 {
return _M_f._M_format(__i, __fc); }
2021 __format::__formatter_chrono<_CharT> _M_f;
2025 template<
typename _Duration, __format::__
char _CharT>
2026 struct formatter<
chrono::sys_time<_Duration>, _CharT>
2028 constexpr typename basic_format_parse_context<_CharT>::iterator
2029 parse(basic_format_parse_context<_CharT>& __pc)
2031 auto __next = _M_f._M_parse(__pc, __format::_ZonedDateTime);
2032 if constexpr (!__stream_insertable)
2033 if (_M_f._M_spec._M_chrono_specs.empty())
2034 __format::__invalid_chrono_spec();
2038 template<
typename _Out>
2039 typename basic_format_context<_Out, _CharT>::iterator
2040 format(
const chrono::sys_time<_Duration>& __t,
2041 basic_format_context<_Out, _CharT>& __fc)
const
2042 {
return _M_f._M_format(__t, __fc); }
2045 static constexpr bool __stream_insertable
2046 =
requires (basic_ostream<_CharT>& __os,
2047 chrono::sys_time<_Duration> __t) { __os << __t; };
2049 __format::__formatter_chrono<_CharT> _M_f;
2052 template<
typename _Duration, __format::__
char _CharT>
2053 struct formatter<
chrono::utc_time<_Duration>, _CharT>
2054 : __format::__formatter_chrono<_CharT>
2056 constexpr typename basic_format_parse_context<_CharT>::iterator
2057 parse(basic_format_parse_context<_CharT>& __pc)
2058 {
return _M_f._M_parse(__pc, __format::_ZonedDateTime); }
2060 template<
typename _Out>
2061 typename basic_format_context<_Out, _CharT>::iterator
2062 format(
const chrono::utc_time<_Duration>& __t,
2063 basic_format_context<_Out, _CharT>& __fc)
const
2068 using chrono::__detail::__utc_leap_second;
2069 using chrono::seconds;
2070 using chrono::sys_time;
2071 using _CDur = common_type_t<_Duration, seconds>;
2072 const auto __li = chrono::get_leap_second_info(__t);
2073 sys_time<_CDur> __s{__t.time_since_epoch() - __li.elapsed};
2074 if (!__li.is_leap_second) [[likely]]
2075 return _M_f._M_format(__s, __fc);
2077 return _M_f._M_format(__utc_leap_second(__s), __fc);
2081 friend formatter<chrono::__detail::__utc_leap_second<_Duration>, _CharT>;
2083 __format::__formatter_chrono<_CharT> _M_f;
2086 template<
typename _Duration, __format::__
char _CharT>
2087 struct formatter<
chrono::tai_time<_Duration>, _CharT>
2088 : __format::__formatter_chrono<_CharT>
2090 constexpr typename basic_format_parse_context<_CharT>::iterator
2091 parse(basic_format_parse_context<_CharT>& __pc)
2092 {
return _M_f._M_parse(__pc, __format::_ZonedDateTime); }
2094 template<
typename _Out>
2095 typename basic_format_context<_Out, _CharT>::iterator
2096 format(
const chrono::tai_time<_Duration>& __t,
2097 basic_format_context<_Out, _CharT>& __fc)
const
2104 constexpr chrono::days __tai_offset = chrono::days(4383);
2105 using _CDur = common_type_t<_Duration, chrono::days>;
2106 chrono::local_time<_CDur> __lt(__t.time_since_epoch() - __tai_offset);
2107 const string __abbrev(
"TAI", 3);
2108 const chrono::seconds __off = 0s;
2109 const auto __lf = chrono::local_time_format(__lt, &__abbrev, &__off);
2110 return _M_f._M_format(__lf, __fc);
2114 __format::__formatter_chrono<_CharT> _M_f;
2117 template<
typename _Duration, __format::__
char _CharT>
2118 struct formatter<
chrono::gps_time<_Duration>, _CharT>
2119 : __format::__formatter_chrono<_CharT>
2121 constexpr typename basic_format_parse_context<_CharT>::iterator
2122 parse(basic_format_parse_context<_CharT>& __pc)
2123 {
return _M_f._M_parse(__pc, __format::_ZonedDateTime); }
2125 template<
typename _Out>
2126 typename basic_format_context<_Out, _CharT>::iterator
2127 format(
const chrono::gps_time<_Duration>& __t,
2128 basic_format_context<_Out, _CharT>& __fc)
const
2135 constexpr chrono::days __gps_offset = chrono::days(3657);
2136 using _CDur = common_type_t<_Duration, chrono::days>;
2137 chrono::local_time<_CDur> __lt(__t.time_since_epoch() + __gps_offset);
2138 const string __abbrev(
"GPS", 3);
2139 const chrono::seconds __off = 0s;
2140 const auto __lf = chrono::local_time_format(__lt, &__abbrev, &__off);
2141 return _M_f._M_format(__lf, __fc);
2145 __format::__formatter_chrono<_CharT> _M_f;
2148 template<
typename _Duration, __format::__
char _CharT>
2149 struct formatter<
chrono::file_time<_Duration>, _CharT>
2151 constexpr typename basic_format_parse_context<_CharT>::iterator
2152 parse(basic_format_parse_context<_CharT>& __pc)
2153 {
return _M_f._M_parse(__pc, __format::_ZonedDateTime); }
2155 template<
typename _Out>
2156 typename basic_format_context<_Out, _CharT>::iterator
2157 format(
const chrono::file_time<_Duration>& __t,
2158 basic_format_context<_Out, _CharT>& __fc)
const
2160 using namespace chrono;
2161 return _M_f._M_format(chrono::clock_cast<system_clock>(__t), __fc);
2165 __format::__formatter_chrono<_CharT> _M_f;
2168 template<
typename _Duration, __format::__
char _CharT>
2169 struct formatter<
chrono::local_time<_Duration>, _CharT>
2171 constexpr typename basic_format_parse_context<_CharT>::iterator
2172 parse(basic_format_parse_context<_CharT>& __pc)
2173 {
return _M_f._M_parse(__pc, __format::_DateTime); }
2175 template<
typename _Out>
2176 typename basic_format_context<_Out, _CharT>::iterator
2177 format(
const chrono::local_time<_Duration>& __t,
2178 basic_format_context<_Out, _CharT>& __fc)
const
2179 {
return _M_f._M_format(__t, __fc); }
2182 __format::__formatter_chrono<_CharT> _M_f;
2185 template<
typename _Duration, __format::__
char _CharT>
2186 struct formatter<
chrono::__detail::__local_time_fmt<_Duration>, _CharT>
2188 constexpr typename basic_format_parse_context<_CharT>::iterator
2189 parse(basic_format_parse_context<_CharT>& __pc)
2190 {
return _M_f._M_parse(__pc, __format::_ZonedDateTime); }
2192 template<
typename _Out>
2193 typename basic_format_context<_Out, _CharT>::iterator
2194 format(
const chrono::__detail::__local_time_fmt<_Duration>& __t,
2195 basic_format_context<_Out, _CharT>& __fc)
const
2196 {
return _M_f._M_format(__t, __fc,
true); }
2199 __format::__formatter_chrono<_CharT> _M_f;
2202#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
2203 template<
typename _Duration,
typename _TimeZonePtr, __format::__
char _CharT>
2204 struct formatter<
chrono::zoned_time<_Duration, _TimeZonePtr>, _CharT>
2205 : formatter<chrono::__detail::__local_time_fmt_for<_Duration>, _CharT>
2207 template<
typename _Out>
2208 typename basic_format_context<_Out, _CharT>::iterator
2209 format(
const chrono::zoned_time<_Duration, _TimeZonePtr>& __tp,
2210 basic_format_context<_Out, _CharT>& __fc)
const
2212 using _Ltf = chrono::__detail::__local_time_fmt_for<_Duration>;
2213 using _Base = formatter<_Ltf, _CharT>;
2214 const chrono::sys_info __info = __tp.get_info();
2215 const auto __lf = chrono::local_time_format(__tp.get_local_time(),
2218 return _Base::format(__lf, __fc);
2224 template<
typename _Duration, __format::__
char _CharT>
2225 struct formatter<
chrono::__detail::__utc_leap_second<_Duration>, _CharT>
2226 : formatter<chrono::utc_time<_Duration>, _CharT>
2228 template<
typename _Out>
2229 typename basic_format_context<_Out, _CharT>::iterator
2230 format(
const chrono::__detail::__utc_leap_second<_Duration>& __t,
2231 basic_format_context<_Out, _CharT>& __fc)
const
2232 {
return this->_M_f._M_format(__t, __fc); }
2243 template<
typename _Duration = seconds>
2246 static_assert(is_same_v<common_type_t<_Duration, seconds>, _Duration>);
2249 _Parser(__format::_ChronoParts __need) : _M_need(__need) { }
2251 _Parser(_Parser&&) =
delete;
2252 void operator=(_Parser&&) =
delete;
2254 _Duration _M_time{};
2255 sys_days _M_sys_days{};
2256 year_month_day _M_ymd{};
2258 __format::_ChronoParts _M_need;
2259 unsigned _M_is_leap_second : 1 {};
2260 unsigned _M_reserved : 15 {};
2262 template<
typename _CharT,
typename _Traits,
typename _Alloc>
2263 basic_istream<_CharT, _Traits>&
2264 operator()(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
2265 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
2266 minutes* __offset =
nullptr);
2271 template<
typename _CharT,
typename _Traits>
2272 static int_least32_t
2273 _S_read_unsigned(basic_istream<_CharT, _Traits>& __is,
2274 ios_base::iostate& __err,
int __n)
2276 int_least32_t __val = _S_try_read_digit(__is, __err);
2277 if (__val == -1) [[unlikely]]
2278 __err |= ios_base::failbit;
2283 for (
int __i = 1; __i < __n1; ++__i)
2284 if (
auto __dig = _S_try_read_digit(__is, __err); __dig != -1)
2290 while (__n1++ < __n) [[unlikely]]
2291 if (
auto __dig = _S_try_read_digit(__is, __err); __dig != -1)
2293 if (__builtin_mul_overflow(__val, 10, &__val)
2294 || __builtin_add_overflow(__val, __dig, &__val))
2296 __err |= ios_base::failbit;
2306 template<
typename _CharT,
typename _Traits>
2307 static int_least32_t
2308 _S_read_signed(basic_istream<_CharT, _Traits>& __is,
2309 ios_base::iostate& __err,
int __n)
2311 auto __sign = __is.peek();
2312 if (__sign ==
'-' || __sign ==
'+')
2314 int_least32_t __val = _S_read_unsigned(__is, __err, __n);
2315 if (__err & ios_base::failbit)
2317 if (__sign ==
'-') [[unlikely]]
2325 template<
typename _CharT,
typename _Traits>
2326 static int_least32_t
2327 _S_try_read_digit(basic_istream<_CharT, _Traits>& __is,
2328 ios_base::iostate& __err)
2330 int_least32_t __val = -1;
2331 auto __i = __is.peek();
2332 if (!_Traits::eq_int_type(__i, _Traits::eof())) [[likely]]
2334 _CharT __c = _Traits::to_char_type(__i);
2335 if (_CharT(
'0') <= __c && __c <= _CharT(
'9')) [[likely]]
2338 __val = __c - _CharT(
'0');
2342 __err |= ios_base::eofbit;
2348 template<
typename _CharT,
typename _Traits>
2350 _S_read_chr(basic_istream<_CharT, _Traits>& __is,
2351 ios_base::iostate& __err, _CharT __c)
2353 auto __i = __is.peek();
2354 if (_Traits::eq_int_type(__i, _Traits::eof()))
2355 __err |= ios_base::eofbit;
2356 else if (_Traits::to_char_type(__i) == __c) [[likely]]
2361 __err |= ios_base::failbit;
2366 template<
typename _Duration>
2367 using _Parser_t = _Parser<common_type_t<_Duration, seconds>>;
2369 template<
typename _Duration>
2373 if constexpr (_Duration::period::den == 1)
2375 switch (_Duration::period::num)
2377 case minutes::period::num:
2378 case hours::period::num:
2379 case days::period::num:
2380 case weeks::period::num:
2381 case years::period::num:
2398 template<
typename _ToDur,
typename _Tp>
2400 __round(
const _Tp& __t)
2402 if constexpr (__is_duration_v<_Tp>)
2404 if constexpr (treat_as_floating_point_v<typename _Tp::rep>)
2406 else if constexpr (__detail::__use_floor<_ToDur>())
2413 static_assert(__is_time_point_v<_Tp>);
2414 using _Tpt = time_point<typename _Tp::clock, _ToDur>;
2415 return _Tpt(__detail::__round<_ToDur>(__t.time_since_epoch()));
2422 template<
typename _CharT,
typename _Traits,
typename _Rep,
typename _Period,
2423 typename _Alloc = allocator<_CharT>>
2424 inline basic_istream<_CharT, _Traits>&
2425 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
2427 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
2430 auto __need = __format::_ChronoParts::_TimeOfDay;
2431 __detail::_Parser_t<duration<_Rep, _Period>> __p(__need);
2432 if (__p(__is, __fmt, __abbrev, __offset))
2433 __d = __detail::__round<duration<_Rep, _Period>>(__p._M_time);
2437 template<
typename _CharT,
typename _Traits>
2438 inline basic_ostream<_CharT, _Traits>&
2439 operator<<(basic_ostream<_CharT, _Traits>& __os,
const day& __d)
2441 using _Ctx = __format::__format_context<_CharT>;
2442 using _Str = basic_string_view<_CharT>;
2443 _Str __s = _GLIBCXX_WIDEN(
"{:02d} is not a valid day");
2445 __s = __s.substr(0, 6);
2446 auto __u = (unsigned)__d;
2447 __os << std::vformat(__s, make_format_args<_Ctx>(__u));
2451 template<
typename _CharT,
typename _Traits,
2452 typename _Alloc = allocator<_CharT>>
2453 inline basic_istream<_CharT, _Traits>&
2454 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
2456 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
2459 __detail::_Parser<> __p(__format::_ChronoParts::_Day);
2460 if (__p(__is, __fmt, __abbrev, __offset))
2461 __d = __p._M_ymd.day();
2465 template<
typename _CharT,
typename _Traits>
2466 inline basic_ostream<_CharT, _Traits>&
2467 operator<<(basic_ostream<_CharT, _Traits>& __os,
const month& __m)
2469 using _Ctx = __format::__format_context<_CharT>;
2470 using _Str = basic_string_view<_CharT>;
2471 _Str __s = _GLIBCXX_WIDEN(
"{:L%b}{} is not a valid month");
2473 __os << std::vformat(__os.getloc(), __s.substr(0, 6),
2474 make_format_args<_Ctx>(__m));
2477 auto __u = (unsigned)__m;
2478 __os << std::vformat(__s.substr(6), make_format_args<_Ctx>(__u));
2483 template<
typename _CharT,
typename _Traits,
2484 typename _Alloc = allocator<_CharT>>
2485 inline basic_istream<_CharT, _Traits>&
2486 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
2488 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
2491 __detail::_Parser<> __p(__format::_ChronoParts::_Month);
2492 if (__p(__is, __fmt, __abbrev, __offset))
2493 __m = __p._M_ymd.month();
2497 template<
typename _CharT,
typename _Traits>
2498 inline basic_ostream<_CharT, _Traits>&
2499 operator<<(basic_ostream<_CharT, _Traits>& __os,
const year& __y)
2501 using _Ctx = __format::__format_context<_CharT>;
2502 using _Str = basic_string_view<_CharT>;
2503 _Str __s = _GLIBCXX_WIDEN(
"-{:04d} is not a valid year");
2505 __s = __s.substr(0, 7);
2507 if (__i >= 0) [[likely]]
2508 __s.remove_prefix(1);
2511 __os << std::vformat(__s, make_format_args<_Ctx>(__i));
2515 template<
typename _CharT,
typename _Traits,
2516 typename _Alloc = allocator<_CharT>>
2517 inline basic_istream<_CharT, _Traits>&
2518 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
2520 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
2523 __detail::_Parser<> __p(__format::_ChronoParts::_Year);
2524 if (__p(__is, __fmt, __abbrev, __offset))
2525 __y = __p._M_ymd.year();
2529 template<
typename _CharT,
typename _Traits>
2530 inline basic_ostream<_CharT, _Traits>&
2531 operator<<(basic_ostream<_CharT, _Traits>& __os,
const weekday& __wd)
2533 using _Ctx = __format::__format_context<_CharT>;
2534 using _Str = basic_string_view<_CharT>;
2535 _Str __s = _GLIBCXX_WIDEN(
"{:L%a}{} is not a valid weekday");
2537 __os << std::vformat(__os.getloc(), __s.substr(0, 6),
2538 make_format_args<_Ctx>(__wd));
2541 auto __c = __wd.c_encoding();
2542 __os << std::vformat(__s.substr(6), make_format_args<_Ctx>(__c));
2547 template<
typename _CharT,
typename _Traits,
2548 typename _Alloc = allocator<_CharT>>
2549 inline basic_istream<_CharT, _Traits>&
2550 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
2552 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
2555 __detail::_Parser<> __p(__format::_ChronoParts::_Weekday);
2556 if (__p(__is, __fmt, __abbrev, __offset))
2561 template<
typename _CharT,
typename _Traits>
2562 inline basic_ostream<_CharT, _Traits>&
2563 operator<<(basic_ostream<_CharT, _Traits>& __os,
2564 const weekday_indexed& __wdi)
2569 basic_stringstream<_CharT> __os2;
2570 __os2.imbue(__os.getloc());
2571 __os2 << __wdi.weekday();
2572 const auto __i = __wdi.index();
2573 basic_string_view<_CharT> __s
2574 = _GLIBCXX_WIDEN(
"[ is not a valid index]");
2576 __os2 << std::format(_GLIBCXX_WIDEN(
"{}"), __i);
2577 if (__i >= 1 && __i <= 5)
2578 __os2 << __s.back();
2580 __os2 << __s.substr(1);
2581 __os << __os2.view();
2585 template<
typename _CharT,
typename _Traits>
2586 inline basic_ostream<_CharT, _Traits>&
2587 operator<<(basic_ostream<_CharT, _Traits>& __os,
2588 const weekday_last& __wdl)
2591 basic_stringstream<_CharT> __os2;
2592 __os2.imbue(__os.getloc());
2593 __os2 << __wdl.weekday() << _GLIBCXX_WIDEN(
"[last]");
2594 __os << __os2.view();
2598 template<
typename _CharT,
typename _Traits>
2599 inline basic_ostream<_CharT, _Traits>&
2600 operator<<(basic_ostream<_CharT, _Traits>& __os,
const month_day& __md)
2603 basic_stringstream<_CharT> __os2;
2604 __os2.imbue(__os.getloc());
2605 __os2 << __md.month();
2606 if constexpr (is_same_v<_CharT, char>)
2610 __os2 << __md.day();
2611 __os << __os2.view();
2615 template<
typename _CharT,
typename _Traits,
2616 typename _Alloc = allocator<_CharT>>
2617 inline basic_istream<_CharT, _Traits>&
2618 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
2620 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
2623 using __format::_ChronoParts;
2624 auto __need = _ChronoParts::_Month | _ChronoParts::_Day;
2625 __detail::_Parser<> __p(__need);
2626 if (__p(__is, __fmt, __abbrev, __offset))
2627 __md = month_day(__p._M_ymd.month(), __p._M_ymd.day());
2631 template<
typename _CharT,
typename _Traits>
2632 inline basic_ostream<_CharT, _Traits>&
2633 operator<<(basic_ostream<_CharT, _Traits>& __os,
2634 const month_day_last& __mdl)
2637 basic_stringstream<_CharT> __os2;
2638 __os2.imbue(__os.getloc());
2639 __os2 << __mdl.month() << _GLIBCXX_WIDEN(
"/last");
2640 __os << __os2.view();
2644 template<
typename _CharT,
typename _Traits>
2645 inline basic_ostream<_CharT, _Traits>&
2646 operator<<(basic_ostream<_CharT, _Traits>& __os,
2647 const month_weekday& __mwd)
2650 basic_stringstream<_CharT> __os2;
2651 __os2.imbue(__os.getloc());
2652 __os2 << __mwd.month();
2653 if constexpr (is_same_v<_CharT, char>)
2657 __os2 << __mwd.weekday_indexed();
2658 __os << __os2.view();
2662 template<
typename _CharT,
typename _Traits>
2663 inline basic_ostream<_CharT, _Traits>&
2664 operator<<(basic_ostream<_CharT, _Traits>& __os,
2665 const month_weekday_last& __mwdl)
2668 basic_stringstream<_CharT> __os2;
2669 __os2.imbue(__os.getloc());
2670 __os2 << __mwdl.month();
2671 if constexpr (is_same_v<_CharT, char>)
2675 __os2 << __mwdl.weekday_last();
2676 __os << __os2.view();
2680 template<
typename _CharT,
typename _Traits>
2681 inline basic_ostream<_CharT, _Traits>&
2682 operator<<(basic_ostream<_CharT, _Traits>& __os,
const year_month& __ym)
2685 basic_stringstream<_CharT> __os2;
2686 __os2.imbue(__os.getloc());
2687 __os2 << __ym.year();
2688 if constexpr (is_same_v<_CharT, char>)
2692 __os2 << __ym.month();
2693 __os << __os2.view();
2697 template<
typename _CharT,
typename _Traits,
2698 typename _Alloc = allocator<_CharT>>
2699 inline basic_istream<_CharT, _Traits>&
2700 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
2702 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
2705 using __format::_ChronoParts;
2706 auto __need = _ChronoParts::_Year | _ChronoParts::_Month;
2707 __detail::_Parser<> __p(__need);
2708 if (__p(__is, __fmt, __abbrev, __offset))
2709 __ym = year_month(__p._M_ymd.year(), __p._M_ymd.month());
2713 template<
typename _CharT,
typename _Traits>
2714 inline basic_ostream<_CharT, _Traits>&
2715 operator<<(basic_ostream<_CharT, _Traits>& __os,
2716 const year_month_day& __ymd)
2718 using _Ctx = __format::__format_context<_CharT>;
2719 using _Str = basic_string_view<_CharT>;
2720 _Str __s = _GLIBCXX_WIDEN(
"{:%F} is not a valid date");
2721 __os << std::vformat(__ymd.ok() ? __s.substr(0, 5) : __s,
2722 make_format_args<_Ctx>(__ymd));
2726 template<
typename _CharT,
typename _Traits,
2727 typename _Alloc = allocator<_CharT>>
2728 inline basic_istream<_CharT, _Traits>&
2730 year_month_day& __ymd,
2734 using __format::_ChronoParts;
2735 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
2736 | _ChronoParts::_Day;
2737 __detail::_Parser<> __p(__need);
2738 if (__p(__is, __fmt, __abbrev, __offset))
2743 template<
typename _CharT,
typename _Traits>
2746 const year_month_day_last& __ymdl)
2751 __os2 << __ymdl.year();
2752 if constexpr (is_same_v<_CharT, char>)
2756 __os2 << __ymdl.month_day_last();
2757 __os << __os2.view();
2761 template<
typename _CharT,
typename _Traits>
2762 inline basic_ostream<_CharT, _Traits>&
2763 operator<<(basic_ostream<_CharT, _Traits>& __os,
2764 const year_month_weekday& __ymwd)
2768 basic_stringstream<_CharT> __os2;
2769 __os2.
imbue(__os.getloc());
2771 if constexpr (is_same_v<_CharT, char>)
2775 __os2 << __ymwd.year() << __slash << __ymwd.month() << __slash
2776 << __ymwd.weekday_indexed();
2777 __os << __os2.view();
2781 template<
typename _CharT,
typename _Traits>
2782 inline basic_ostream<_CharT, _Traits>&
2783 operator<<(basic_ostream<_CharT, _Traits>& __os,
2784 const year_month_weekday_last& __ymwdl)
2788 basic_stringstream<_CharT> __os2;
2789 __os2.imbue(__os.getloc());
2791 if constexpr (is_same_v<_CharT, char>)
2795 __os2 << __ymwdl.year() << __slash << __ymwdl.month() << __slash
2796 << __ymwdl.weekday_last();
2797 __os << __os2.view();
2801 template<
typename _CharT,
typename _Traits,
typename _Duration>
2802 inline basic_ostream<_CharT, _Traits>&
2803 operator<<(basic_ostream<_CharT, _Traits>& __os,
2806 return __os << format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%T}"), __hms);
2809#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
2811 template<
typename _CharT,
typename _Traits>
2812 basic_ostream<_CharT, _Traits>&
2813 operator<<(basic_ostream<_CharT, _Traits>& __os,
const sys_info& __i)
2815 __os <<
'[' << __i.begin <<
',' << __i.end
2816 <<
',' <<
hh_mm_ss(__i.offset) <<
',' << __i.save
2817 <<
',' << __i.abbrev <<
']';
2822 template<
typename _CharT,
typename _Traits>
2823 basic_ostream<_CharT, _Traits>&
2824 operator<<(basic_ostream<_CharT, _Traits>& __os,
const local_info& __li)
2827 if (__li.result == local_info::unique)
2831 if (__li.result == local_info::nonexistent)
2832 __os <<
"nonexistent";
2834 __os <<
"ambiguous";
2835 __os <<
" local time between " << __li.first;
2836 __os <<
" and " << __li.second;
2842 template<
typename _CharT,
typename _Traits,
typename _Duration,
2843 typename _TimeZonePtr>
2844 inline basic_ostream<_CharT, _Traits>&
2845 operator<<(basic_ostream<_CharT, _Traits>& __os,
2846 const zoned_time<_Duration, _TimeZonePtr>& __t)
2848 __os << format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T %Z}"), __t);
2853 template<
typename _CharT,
typename _Traits,
typename _Duration>
2854 requires (!treat_as_floating_point_v<typename _Duration::rep>)
2855 && ratio_less_v<typename _Duration::period, days::period>
2856 inline basic_ostream<_CharT, _Traits>&
2857 operator<<(basic_ostream<_CharT, _Traits>& __os,
2858 const sys_time<_Duration>& __tp)
2860 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __tp);
2864 template<
typename _CharT,
typename _Traits>
2865 inline basic_ostream<_CharT, _Traits>&
2866 operator<<(basic_ostream<_CharT, _Traits>& __os,
const sys_days& __dp)
2868 __os << year_month_day{__dp};
2872 template<
typename _CharT,
typename _Traits,
typename _Duration,
2873 typename _Alloc = allocator<_CharT>>
2874 basic_istream<_CharT, _Traits>&
2875 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
2876 sys_time<_Duration>& __tp,
2877 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
2883 using __format::_ChronoParts;
2884 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
2885 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
2886 __detail::_Parser_t<_Duration> __p(__need);
2887 if (__p(__is, __fmt, __abbrev, __offset))
2889 if (__p._M_is_leap_second)
2893 auto __st = __p._M_sys_days + __p._M_time - *__offset;
2894 __tp = __detail::__round<_Duration>(__st);
2900 template<
typename _CharT,
typename _Traits,
typename _Duration>
2901 inline basic_ostream<_CharT, _Traits>&
2902 operator<<(basic_ostream<_CharT, _Traits>& __os,
2903 const utc_time<_Duration>& __t)
2905 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
2909 template<
typename _CharT,
typename _Traits,
typename _Duration,
2910 typename _Alloc = allocator<_CharT>>
2911 inline basic_istream<_CharT, _Traits>&
2912 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
2913 utc_time<_Duration>& __tp,
2914 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
2920 using __format::_ChronoParts;
2921 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
2922 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
2923 __detail::_Parser_t<_Duration> __p(__need);
2924 if (__p(__is, __fmt, __abbrev, __offset))
2928 auto __ut = utc_clock::from_sys(__p._M_sys_days) + __p._M_time
2930 __tp = __detail::__round<_Duration>(__ut);
2935 template<
typename _CharT,
typename _Traits,
typename _Duration>
2936 inline basic_ostream<_CharT, _Traits>&
2937 operator<<(basic_ostream<_CharT, _Traits>& __os,
2938 const tai_time<_Duration>& __t)
2940 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
2944 template<
typename _CharT,
typename _Traits,
typename _Duration,
2945 typename _Alloc = allocator<_CharT>>
2946 inline basic_istream<_CharT, _Traits>&
2947 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
2948 tai_time<_Duration>& __tp,
2949 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
2955 using __format::_ChronoParts;
2956 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
2957 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
2958 __detail::_Parser_t<_Duration> __p(__need);
2959 if (__p(__is, __fmt, __abbrev, __offset))
2961 if (__p._M_is_leap_second)
2965 constexpr sys_days __epoch(-
days(4383));
2966 auto __d = __p._M_sys_days - __epoch + __p._M_time - *__offset;
2967 tai_time<common_type_t<_Duration, seconds>> __tt(__d);
2968 __tp = __detail::__round<_Duration>(__tt);
2974 template<
typename _CharT,
typename _Traits,
typename _Duration>
2975 inline basic_ostream<_CharT, _Traits>&
2976 operator<<(basic_ostream<_CharT, _Traits>& __os,
2977 const gps_time<_Duration>& __t)
2979 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
2983 template<
typename _CharT,
typename _Traits,
typename _Duration,
2984 typename _Alloc = allocator<_CharT>>
2985 inline basic_istream<_CharT, _Traits>&
2986 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
2987 gps_time<_Duration>& __tp,
2988 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
2994 using __format::_ChronoParts;
2995 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
2996 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
2997 __detail::_Parser_t<_Duration> __p(__need);
2998 if (__p(__is, __fmt, __abbrev, __offset))
3000 if (__p._M_is_leap_second)
3004 constexpr sys_days __epoch(
days(3657));
3005 auto __d = __p._M_sys_days - __epoch + __p._M_time - *__offset;
3006 gps_time<common_type_t<_Duration, seconds>> __gt(__d);
3007 __tp = __detail::__round<_Duration>(__gt);
3013 template<
typename _CharT,
typename _Traits,
typename _Duration>
3014 inline basic_ostream<_CharT, _Traits>&
3015 operator<<(basic_ostream<_CharT, _Traits>& __os,
3016 const file_time<_Duration>& __t)
3018 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
3022 template<
typename _CharT,
typename _Traits,
typename _Duration,
3023 typename _Alloc = allocator<_CharT>>
3024 inline basic_istream<_CharT, _Traits>&
3025 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3026 file_time<_Duration>& __tp,
3027 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3030 sys_time<_Duration> __st;
3031 if (chrono::from_stream(__is, __fmt, __st, __abbrev, __offset))
3032 __tp = __detail::__round<_Duration>(file_clock::from_sys(__st));
3036 template<
typename _CharT,
typename _Traits,
typename _Duration>
3037 inline basic_ostream<_CharT, _Traits>&
3038 operator<<(basic_ostream<_CharT, _Traits>& __os,
3039 const local_time<_Duration>& __lt)
3041 __os << sys_time<_Duration>{__lt.time_since_epoch()};
3045 template<
typename _CharT,
typename _Traits,
typename _Duration,
3046 typename _Alloc = allocator<_CharT>>
3047 basic_istream<_CharT, _Traits>&
3048 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3049 local_time<_Duration>& __tp,
3050 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3053 using __format::_ChronoParts;
3054 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
3055 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
3056 __detail::_Parser_t<_Duration> __p(__need);
3057 if (__p(__is, __fmt, __abbrev, __offset))
3059 days __d = __p._M_sys_days.time_since_epoch();
3060 auto __t = local_days(__d) + __p._M_time;
3061 __tp = __detail::__round<_Duration>(__t);
3072 void from_stream() =
delete;
3074 template<
typename _Parsable,
typename _CharT,
3075 typename _Traits = std::char_traits<_CharT>,
3076 typename... _OptArgs>
3077 concept __parsable =
requires (basic_istream<_CharT, _Traits>& __is,
3078 const _CharT* __fmt, _Parsable& __tp,
3079 _OptArgs*... __args)
3080 { from_stream(__is, __fmt, __tp, __args...); };
3082 template<
typename _Parsable,
typename _CharT,
3083 typename _Traits = char_traits<_CharT>,
3084 typename _Alloc = allocator<_CharT>>
3088 using __string_type = basic_string<_CharT, _Traits, _Alloc>;
3091 _Parse(
const _CharT* __fmt, _Parsable& __tp,
3092 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3095 _M_abbrev(__abbrev), _M_offset(__offset)
3098 _Parse(_Parse&&) =
delete;
3099 _Parse& operator=(_Parse&&) =
delete;
3102 using __stream_type = basic_istream<_CharT, _Traits>;
3104 const _CharT*
const _M_fmt;
3105 _Parsable*
const _M_tp;
3106 __string_type*
const _M_abbrev;
3109 friend __stream_type&
3110 operator>>(__stream_type& __is, _Parse&& __p)
3113 from_stream(__is, __p._M_fmt, *__p._M_tp, __p._M_abbrev,
3115 else if (__p._M_abbrev)
3116 from_stream(__is, __p._M_fmt, *__p._M_tp, __p._M_abbrev);
3118 from_stream(__is, __p._M_fmt, *__p._M_tp);
3122 friend void operator>>(__stream_type&, _Parse&) =
delete;
3123 friend void operator>>(__stream_type&,
const _Parse&) =
delete;
3127 template<
typename _CharT, __detail::__parsable<_CharT> _Parsable>
3128 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
3130 parse(
const _CharT* __fmt, _Parsable& __tp)
3131 {
return __detail::_Parse<_Parsable, _CharT>(__fmt, __tp); }
3133 template<
typename _CharT,
typename _Traits,
typename _Alloc,
3134 __detail::__parsable<_CharT, _Traits> _Parsable>
3137 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp)
3139 return __detail::_Parse<_Parsable, _CharT, _Traits>(__fmt.c_str(), __tp);
3142 template<
typename _CharT,
typename _Traits,
typename _Alloc,
3143 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
3144 __detail::__parsable<_CharT, _Traits, _StrT> _Parsable>
3145 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
3147 parse(
const _CharT* __fmt, _Parsable& __tp,
3148 basic_string<_CharT, _Traits, _Alloc>& __abbrev)
3151 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt, __tp,
3155 template<
typename _CharT,
typename _Traits,
typename _Alloc,
3156 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
3157 __detail::__parsable<_CharT, _Traits, _StrT> _Parsable>
3160 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp,
3161 basic_string<_CharT, _Traits, _Alloc>& __abbrev)
3164 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt.c_str(),
3168 template<
typename _CharT,
typename _Traits =
char_traits<_CharT>,
3169 typename _StrT = basic_
string<_CharT, _Traits>,
3170 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
3171 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
3173 parse(
const _CharT* __fmt, _Parsable& __tp,
minutes& __offset)
3175 return __detail::_Parse<_Parsable, _CharT>(__fmt, __tp,
nullptr,
3179 template<
typename _CharT,
typename _Traits,
typename _Alloc,
3180 typename _StrT = basic_string<_CharT, _Traits>,
3181 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
3184 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp,
3187 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt.c_str(),
3192 template<
typename _CharT,
typename _Traits,
typename _Alloc,
3193 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
3194 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
3195 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
3197 parse(
const _CharT* __fmt, _Parsable& __tp,
3198 basic_string<_CharT, _Traits, _Alloc>& __abbrev,
minutes& __offset)
3201 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt, __tp,
3206 template<
typename _CharT,
typename _Traits,
typename _Alloc,
3207 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
3208 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
3211 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp,
3212 basic_string<_CharT, _Traits, _Alloc>& __abbrev,
minutes& __offset)
3215 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt.c_str(),
3221 template<
typename _Duration>
3222 template<
typename _CharT,
typename _Traits,
typename _Alloc>
3223 basic_istream<_CharT, _Traits>&
3224 __detail::_Parser<_Duration>::
3225 operator()(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3226 basic_string<_CharT, _Traits, _Alloc>* __abbrev,
3229 using sentry =
typename basic_istream<_CharT, _Traits>::sentry;
3231 if (sentry __cerb(__is,
true); __cerb)
3233 locale __loc = __is.getloc();
3238 struct _Stream_state
3241 _Stream_state(basic_istream<_CharT, _Traits>& __i)
3243 _M_flags(__i.flags(ios_base::
skipws | ios_base::
dec)),
3249 _M_is.flags(_M_flags);
3253 _Stream_state(_Stream_state&&) =
delete;
3255 basic_istream<_CharT, _Traits>& _M_is;
3256 ios_base::fmtflags _M_flags;
3266 auto __read_unsigned = [&] (
int __n) {
3267 return _S_read_unsigned(__is, __err, __n);
3272 auto __read_signed = [&] (
int __n) {
3273 return _S_read_signed(__is, __err, __n);
3277 auto __read_chr = [&__is, &__err] (_CharT __c) {
3278 return _S_read_chr(__is, __err, __c);
3281 using __format::_ChronoParts;
3282 _ChronoParts __parts{};
3284 const year __bad_y = --year::min();
3285 const month __bad_mon(255);
3286 const day __bad_day(255);
3287 const weekday __bad_wday(255);
3288 const hours __bad_h(-1);
3289 const minutes __bad_min(-9999);
3292 year __y = __bad_y, __yy = __bad_y;
3293 year __iso_y = __bad_y, __iso_yy = __bad_y;
3294 month __m = __bad_mon;
3295 day __d = __bad_day;
3296 weekday __wday = __bad_wday;
3297 hours __h = __bad_h, __h12 = __bad_h;
3299 _Duration __s = __bad_sec;
3301 int __iso_wk = -1, __sunday_wk = -1, __monday_wk = -1;
3303 int __dayofyear = -1;
3305 minutes __tz_offset = __bad_min;
3306 basic_string<_CharT, _Traits> __tz_abbr;
3308 if ((_M_need & _ChronoParts::_TimeOfDay)
3309 && (_M_need & _ChronoParts::_Year))
3315 __parts = _ChronoParts::_TimeOfDay;
3322 bool __is_flag =
false;
3324 constexpr bool __is_floating
3325 = treat_as_floating_point_v<typename _Duration::rep>;
3344 _CharT __c = *__fmt++;
3351 else if (!__read_chr(__c)) [[unlikely]]
3362 if (__mod || __num) [[unlikely]]
3367 __tmget.get(__is, {}, __is, __err, &__tm,
3369 if (!__is_failed(__err))
3370 __wday = weekday(__tm.tm_wday);
3372 __parts |= _ChronoParts::_Weekday;
3378 if (__mod || __num) [[unlikely]]
3386 __tmget.get(__is, {}, __is, __err, &__tm,
3388 if (!__is_failed(__err))
3389 __m = month(__tm.tm_mon + 1);
3391 __parts |= _ChronoParts::_Month;
3395 if (__mod ==
'O' || __num) [[unlikely]]
3400 __tmget.get(__is, {}, __is, __err, &__tm,
3401 __fmt - 2 - (__mod ==
'E'), __fmt);
3402 if (!__is_failed(__err))
3404 __y = year(__tm.tm_year + 1900);
3405 __m = month(__tm.tm_mon + 1);
3406 __d = day(__tm.tm_mday);
3407 __h =
hours(__tm.tm_hour);
3412 __parts |= _ChronoParts::_DateTime;
3416 if (!__mod) [[likely]]
3418 auto __v = __read_signed(__num ? __num : 2);
3419 if (!__is_failed(__err))
3421 int __cmin = (int)year::min() / 100;
3422 int __cmax = (int)year::max() / 100;
3423 if (__cmin <= __v && __v <= __cmax)
3424 __century = __v * 100;
3429 else if (__mod ==
'E')
3432 __tmget.get(__is, {}, __is, __err, &__tm,
3434 if (!__is_failed(__err))
3435 __century = __tm.tm_year;
3444 if (!__mod) [[likely]]
3446 auto __v = __read_unsigned(__num ? __num : 2);
3447 if (!__is_failed(__err))
3450 else if (__mod ==
'O')
3453 __tmget.get(__is, {}, __is, __err, &__tm,
3455 if (!__is_failed(__err))
3456 __d = day(__tm.tm_mday);
3460 __parts |= _ChronoParts::_Day;
3464 if (__mod || __num) [[unlikely]]
3468 auto __month = __read_unsigned(2);
3470 auto __day = __read_unsigned(2);
3472 auto __year = __read_unsigned(2);
3473 if (__is_failed(__err))
3475 __y = year(__year + 1900 + 100 *
int(__year < 69));
3476 __m = month(__month);
3478 if (!year_month_day(__y, __m, __d).ok())
3480 __y = __yy = __iso_y = __iso_yy = __bad_y;
3486 __parts |= _ChronoParts::_Date;
3490 if (__mod) [[unlikely]]
3494 auto __year = __read_signed(__num ? __num : 4);
3496 auto __month = __read_unsigned(2);
3498 auto __day = __read_unsigned(2);
3499 if (__is_failed(__err))
3502 __m = month(__month);
3504 if (!year_month_day(__y, __m, __d).ok())
3506 __y = __yy = __iso_y = __iso_yy = __bad_y;
3512 __parts |= _ChronoParts::_Date;
3516 if (__mod) [[unlikely]]
3520 auto __val = __read_unsigned(__num ? __num : 2);
3521 if (__val >= 0 && __val <= 99)
3523 __iso_yy = year(__val);
3524 if (__century == -1)
3528 __iso_yy = __iso_y = __y = __yy = __bad_y;
3530 __parts |= _ChronoParts::_Year;
3534 if (__mod) [[unlikely]]
3537 __iso_y = year(__read_unsigned(__num ? __num : 4));
3538 __parts |= _ChronoParts::_Year;
3543 if (__mod ==
'E') [[unlikely]]
3545 else if (__mod ==
'O')
3550 __tmget.get(__is, {}, __is, __err, &__tm,
3552 if (!__is_failed(__err))
3556 __h12 =
hours(__tm.tm_hour);
3560 __h =
hours(__tm.tm_hour);
3569 auto __val = __read_unsigned(__num ? __num : 2);
3570 if (__c ==
'I' && __val >= 1 && __val <= 12)
3572 __h12 =
hours(__val);
3575 else if (__c ==
'H' && __val >= 0 && __val <= 23)
3582 if (_M_need & _ChronoParts::_TimeOfDay)
3587 __parts |= _ChronoParts::_TimeOfDay;
3591 if (__mod) [[unlikely]]
3593 else if (_M_need == _ChronoParts::_TimeOfDay)
3595 auto __val = __read_signed(__num ? __num : 3);
3596 if (!__is_failed(__err))
3599 __parts |= _ChronoParts::_TimeOfDay;
3604 __dayofyear = __read_unsigned(__num ? __num : 3);
3611 if (__mod ==
'E') [[unlikely]]
3613 else if (__mod ==
'O')
3616 __tmget.get(__is, {}, __is, __err, &__tm,
3618 if (!__is_failed(__err))
3619 __m = month(__tm.tm_mon + 1);
3623 auto __val = __read_unsigned(__num ? __num : 2);
3624 if (__val >= 1 && __val <= 12)
3629 __parts |= _ChronoParts::_Month;
3633 if (__mod ==
'E') [[unlikely]]
3635 else if (__mod ==
'O')
3638 __tmget.get(__is, {}, __is, __err, &__tm,
3640 if (!__is_failed(__err))
3645 auto __val = __read_unsigned(__num ? __num : 2);
3646 if (0 <= __val && __val < 60)
3650 if (_M_need & _ChronoParts::_TimeOfDay)
3655 __parts |= _ChronoParts::_TimeOfDay;
3665 const _CharT* __ampms[2];
3666 __tmpunct._M_am_pm(__ampms);
3667 int __n = 0, __which = 3;
3668 while (__which != 0)
3670 auto __i = __is.peek();
3671 if (_Traits::eq_int_type(__i, _Traits::eof()))
3681 else if (__ampms[0][__n + 1] == _CharT())
3692 else if (__ampms[1][__n + 1] == _CharT())
3703 if (__which == 0 || __which == 3)
3716 __tmget.get(__is, {}, __is, __err, &__tm,
3718 if (!__is_failed(__err))
3720 __h =
hours(__tm.tm_hour);
3725 __parts |= _ChronoParts::_TimeOfDay;
3730 if (__mod || __num) [[unlikely]]
3737 auto __val = __read_unsigned(2);
3738 if (__val == -1 || __val > 23) [[unlikely]]
3740 if (_M_need & _ChronoParts::_TimeOfDay)
3744 if (!__read_chr(
':')) [[unlikely]]
3748 __val = __read_unsigned(2);
3749 if (__val == -1 || __val > 60) [[unlikely]]
3751 if (_M_need & _ChronoParts::_TimeOfDay)
3759 __parts |= _ChronoParts::_TimeOfDay;
3762 else if (!__read_chr(
':')) [[unlikely]]
3768 if (__mod ==
'E') [[unlikely]]
3770 else if (__mod ==
'O')
3773 __tmget.get(__is, {}, __is, __err, &__tm,
3775 if (!__is_failed(__err))
3778 else if constexpr (_Duration::period::den == 1
3781 auto __val = __read_unsigned(__num ? __num : 2);
3782 if (0 <= __val && __val <= 59) [[likely]]
3786 if (_M_need & _ChronoParts::_TimeOfDay)
3794 auto __digit = _S_try_read_digit(__is, __err);
3797 __buf.put(
'0' + __digit);
3798 __digit = _S_try_read_digit(__is, __err);
3800 __buf.put(
'0' + __digit);
3803 auto __i = __is.peek();
3804 if (_Traits::eq_int_type(__i, _Traits::eof()))
3812 __dp = __np.decimal_point();
3814 _CharT __c = _Traits::to_char_type(__i);
3820 = hh_mm_ss<_Duration>::fractional_width;
3823 __digit = _S_try_read_digit(__is, __err);
3825 __buf.put(
'0' + __digit);
3833 if (!__is_failed(__err)) [[likely]]
3835 long double __val{};
3836#if __cpp_lib_to_chars
3838 auto __first = __str.data();
3839 auto __last = __first + __str.size();
3843 if ((
bool)ec || ptr != __last) [[unlikely]]
3851 if constexpr (__is_floating)
3858 __parts |= _ChronoParts::_TimeOfDay;
3863 if (__mod ==
'E') [[unlikely]]
3865 else if (__mod ==
'O')
3870 __tmget.get(__is, {}, __is, __err, &__tm,
3872 if (!__is_failed(__err))
3873 __wday = weekday(__tm.tm_wday);
3880 const int __lo = __c ==
'u' ? 1 : 0;
3881 const int __hi = __lo + 6;
3882 auto __val = __read_unsigned(__num ? __num : 1);
3883 if (__lo <= __val && __val <= __hi)
3884 __wday = weekday(__val);
3887 __wday = __bad_wday;
3891 __parts |= _ChronoParts::_Weekday;
3897 if (__mod ==
'E') [[unlikely]]
3899 else if (__mod ==
'O')
3901 if (__c ==
'V') [[unlikely]]
3911 const int __lo = __c ==
'V' ? 1 : 0;
3912 const int __hi = 53;
3913 auto __val = __read_unsigned(__num ? __num : 2);
3914 if (__lo <= __val && __val <= __hi)
3919 __sunday_wk = __val;
3925 __monday_wk = __val;
3930 __iso_wk = __sunday_wk = __monday_wk = -1;
3936 if (__mod ==
'O' || __num) [[unlikely]]
3941 __tmget.get(__is, {}, __is, __err, &__tm,
3942 __fmt - 2 - (__mod ==
'E'), __fmt);
3943 if (!__is_failed(__err))
3945 __y = year(__tm.tm_year + 1900);
3946 __m = month(__tm.tm_mon + 1);
3947 __d = day(__tm.tm_mday);
3950 __parts |= _ChronoParts::_Date;
3954 if (__mod ==
'O' || __num) [[unlikely]]
3959 __tmget.get(__is, {}, __is, __err, &__tm,
3960 __fmt - 2 - (__mod ==
'E'), __fmt);
3961 if (!__is_failed(__err))
3963 __h =
hours(__tm.tm_hour);
3968 __parts |= _ChronoParts::_TimeOfDay;
3972 if (__mod) [[unlikely]]
3975 __tmget.get(__is, {}, __is, __err, &__tm,
3977 if (!__is_failed(__err))
3979 int __cent = __tm.tm_year < 2000 ? 1900 : 2000;
3980 __yy = year(__tm.tm_year - __cent);
3981 if (__century == -1)
3987 auto __val = __read_unsigned(__num ? __num : 2);
3988 if (__val >= 0 && __val <= 99)
3991 if (__century == -1)
3992 __century = __val < 69 ? 2000 : 1900;
3995 __y = __yy = __iso_yy = __iso_y = __bad_y;
3997 __parts |= _ChronoParts::_Year;
4001 if (__mod ==
'O') [[unlikely]]
4003 else if (__mod ==
'E')
4006 __tmget.get(__is, {}, __is, __err, &__tm,
4008 if (!__is_failed(__err))
4009 __y = year(__tm.tm_year);
4013 auto __val = __read_unsigned(__num ? __num : 4);
4014 if (!__is_failed(__err))
4017 __parts |= _ChronoParts::_Year;
4021 if (__num) [[unlikely]]
4028 auto __i = __is.peek();
4029 if (_Traits::eq_int_type(__i, _Traits::eof()))
4034 _CharT __ic = _Traits::to_char_type(__i);
4035 const bool __neg = __ic == _CharT(
'-');
4036 if (__ic == _CharT(
'-') || __ic == _CharT(
'+'))
4043 __hh = __read_unsigned(2);
4048 auto __d1 = _S_try_read_digit(__is, __err);
4049 auto __d2 = _S_try_read_digit(__is, __err);
4050 if (__d1 >= 0 && __d2 >= 0) [[likely]]
4051 __hh = 10 * __d1 + __d2;
4056 if (__is_failed(__err))
4060 if (_Traits::eq_int_type(__i, _Traits::eof()))
4063 __tz_offset =
minutes(__hh * (__neg ? -60 : 60));
4066 __ic = _Traits::to_char_type(__i);
4068 bool __read_mm =
false;
4071 if (__ic == _GLIBCXX_WIDEN(
":")[0])
4078 else if (_CharT(
'0') <= __ic && __ic <= _CharT(
'9'))
4084 int_least32_t __mm = 0;
4087 auto __d1 = _S_try_read_digit(__is, __err);
4088 auto __d2 = _S_try_read_digit(__is, __err);
4089 if (__d1 >= 0 && __d2 >= 0) [[likely]]
4090 __mm = 10 * __d1 + __d2;
4095 if (!__is_failed(__err))
4097 auto __z = __hh * 60 + __mm;
4098 __tz_offset =
minutes(__neg ? -__z : __z);
4104 if (__mod || __num) [[unlikely]]
4108 basic_string_view<_CharT> __x = _GLIBCXX_WIDEN(
"_/-+");
4112 auto __i = __is.peek();
4113 if (!_Traits::eq_int_type(__i, _Traits::eof()))
4115 _CharT __a = _Traits::to_char_type(__i);
4117 || __x.find(__a) != __x.npos)
4119 __tz_abbr.push_back(__a);
4128 if (__tz_abbr.empty())
4134 if (__mod || __num) [[unlikely]]
4138 _CharT __i = __is.peek();
4139 if (_Traits::eq_int_type(__i, _Traits::eof()))
4141 else if (
std::isspace(_Traits::to_char_type(__i), __loc))
4149 if (__mod || __num) [[unlikely]]
4153 _CharT __i = __is.peek();
4154 if (_Traits::eq_int_type(__i, _Traits::eof()))
4156 else if (
std::isspace(_Traits::to_char_type(__i), __loc))
4162 if (__mod || __num) [[unlikely]]
4170 if (__mod || __num) [[unlikely]]
4179 if (_CharT(
'1') <= __c && __c <= _CharT(
'9'))
4181 if (!__mod) [[likely]]
4184 auto __end = __fmt + _Traits::length(__fmt);
4186 = __format::__parse_integer(__fmt - 1, __end);
4187 if (__ptr) [[likely]]
4198 if (__is_failed(__err)) [[unlikely]]
4208 if (__yy != __bad_y && __y == __bad_y)
4209 __y =
years(__century) + __yy;
4210 if (__iso_yy != __bad_y && __iso_y == __bad_y)
4211 __iso_y =
years(__century) + __iso_yy;
4214 bool __can_use_doy =
false;
4215 bool __can_use_iso_wk =
false;
4216 bool __can_use_sun_wk =
false;
4217 bool __can_use_mon_wk =
false;
4220 if (__y != __bad_y && __dayofyear >= 0)
4222 __can_use_doy =
true;
4223 __parts |= _ChronoParts::_Date;
4225 else if (__y != __bad_y && __wday != __bad_wday && __sunday_wk >= 0)
4227 __can_use_sun_wk =
true;
4228 __parts |= _ChronoParts::_Date;
4230 else if (__y != __bad_y && __wday != __bad_wday && __monday_wk >= 0)
4232 __can_use_mon_wk =
true;
4233 __parts |= _ChronoParts::_Date;
4235 else if (__iso_y != __bad_y && __wday != __bad_wday && __iso_wk > 0)
4238 __can_use_iso_wk =
true;
4239 __parts |= _ChronoParts::_Date;
4242 if (__is_failed(__err)) [[unlikely]]
4244 else if (__is_flag) [[unlikely]]
4246 else if ((_M_need & __parts) == _M_need) [[likely]]
4268 const bool __need_wday = _M_need & _ChronoParts::_Weekday;
4272 const bool __need_time = _M_need & _ChronoParts::_TimeOfDay;
4274 if (__need_wday && __wday != __bad_wday)
4276 else if (_M_need & _ChronoParts::_Date)
4280 const bool __need_ymd = !__need_wday && !__need_time;
4282 if ((_M_need & _ChronoParts::_Year && __y == __bad_y)
4283 || (_M_need & _ChronoParts::_Month && __m == __bad_mon)
4284 || (_M_need & _ChronoParts::_Day && __d == __bad_day))
4291 if ((0 < __dayofyear && __dayofyear <= 365)
4292 || (__dayofyear == 366 && __y.is_leap()))
4295 _M_sys_days = sys_days(__y/January/1)
4296 +
days(__dayofyear - 1);
4298 _M_ymd = year_month_day(_M_sys_days);
4303 else if (__can_use_iso_wk)
4311 const sys_days __jan4(__iso_y/January/4);
4312 weekday __wd1(__jan4 -
days(3));
4313 if (__wd1 != Thursday)
4314 if (__wd1 != Wednesday || !__iso_y.is_leap())
4318 if (!__is_failed(__err)) [[likely]]
4321 sys_days __w(Thursday[1]/January/__iso_y);
4323 __w -= Thursday - Monday;
4325 __w += __wday - Monday;
4329 _M_ymd = year_month_day(_M_sys_days);
4332 else if (__can_use_sun_wk)
4335 sys_days __wk1(__y/January/Sunday[1]);
4336 _M_sys_days = __wk1 +
weeks(__sunday_wk - 1)
4337 +
days(__wday.c_encoding());
4338 _M_ymd = year_month_day(_M_sys_days);
4339 if (_M_ymd.year() != __y) [[unlikely]]
4342 else if (__can_use_mon_wk)
4345 sys_days __wk1(__y/January/Monday[1]);
4346 _M_sys_days = __wk1 +
weeks(__monday_wk - 1)
4347 +
days(__wday.c_encoding() - 1);
4348 _M_ymd = year_month_day(_M_sys_days);
4349 if (_M_ymd.year() != __y) [[unlikely]]
4361 if (_M_need & _ChronoParts::_Year)
4363 if (!__y.ok()) [[unlikely]]
4366 else if (__y == __bad_y)
4369 if (_M_need & _ChronoParts::_Month)
4371 if (!__m.ok()) [[unlikely]]
4374 else if (__m == __bad_mon)
4377 if (_M_need & _ChronoParts::_Day)
4379 if (__d < day(1) || __d > (__y/__m/last).day())
4382 else if (__d == __bad_day)
4385 if (year_month_day __ymd(__y, __m, __d); __ymd.ok())
4388 if (__need_wday || __need_time)
4389 _M_sys_days = sys_days(_M_ymd);
4396 _M_wd = weekday(_M_sys_days);
4402 if (__h == __bad_h && __h12 != __bad_h)
4406 else if (__ampm == 2)
4407 __h = __h12 ==
hours(12) ? __h12 : __h12 +
hours(12);
4412 auto __t = _M_time.zero();
4421 if (__min != __bad_min)
4427 if (__s != __bad_sec)
4431 _M_is_leap_second = __s >=
seconds(60);
4440 if (!__is_failed(__err)) [[likely]]
4442 if (__offset && __tz_offset != __bad_min)
4443 *__offset = __tz_offset;
4444 if (__abbrev && !__tz_abbr.empty())
4452 __is.setstate(__err);
4456#undef _GLIBCXX_WIDEN
4461_GLIBCXX_END_NAMESPACE_VERSION
__detail::__local_time_fmt< _Duration > local_time_format(local_time< _Duration > __time, const string *__abbrev=nullptr, const seconds *__offset_sec=nullptr)
duration< int64_t, ratio< 604800 > > weeks
weeks
constexpr __enable_if_is_duration< _ToDur > floor(const duration< _Rep, _Period > &__d)
constexpr enable_if_t< __and_< __is_duration< _ToDur >, __not_< treat_as_floating_point< typename _ToDur::rep > > >::value, _ToDur > round(const duration< _Rep, _Period > &__d)
duration< int64_t, ratio< 86400 > > days
days
duration< int64_t, ratio< 31556952 > > years
years
duration< int64_t, ratio< 3600 > > hours
hours
duration< int64_t, ratio< 60 > > minutes
minutes
basic_ostream< _CharT, _Traits > & operator<<(std::basic_ostream< _CharT, _Traits > &__os, const duration< _Rep, _Period > &__d)
duration< int64_t > seconds
seconds
constexpr __enable_if_is_duration< _ToDur > duration_cast(const duration< _Rep, _Period > &__d)
basic_stringstream< char > stringstream
Class for char mixed input and output memory streams.
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
constexpr const _Tp & min(const _Tp &, const _Tp &)
This does what you think it does.
const _Facet & use_facet(const locale &__loc)
Return a facet.
ISO C++ entities toplevel namespace is std.
ptrdiff_t streamsize
Integral type for I/O operation counts and buffer sizes.
chars_format
floating-point format for primitive numerical conversion
bool isspace(_CharT __c, const locale &__loc)
Convenience interface to ctype.is(ctype_base::space, __c).
_CharT toupper(_CharT __c, const locale &__loc)
Convenience interface to ctype.toupper(__c).
bool isalnum(_CharT __c, const locale &__loc)
Convenience interface to ctype.is(ctype_base::alnum, __c).
ios_base & dec(ios_base &__base)
Calls base.setf(ios_base::dec, ios_base::basefield).
ios_base & skipws(ios_base &__base)
Calls base.setf(ios_base::skipws).
ios_base & fixed(ios_base &__base)
Calls base.setf(ios_base::fixed, ios_base::floatfield).
constexpr bitset< _Nb > operator|(const bitset< _Nb > &__x, const bitset< _Nb > &__y) noexcept
Global bitwise operations on bitsets.
basic_istream< _CharT, _Traits > & ws(basic_istream< _CharT, _Traits > &__is)
Quick and easy way to eat whitespace.
constexpr from_chars_result from_chars(const char *__first, const char *__last, _Tp &__value, int __base=10)
std::from_chars for integral types.
ISO C++ 2011 namespace for date and time utilities.
locale imbue(const locale &__loc)
Moves to a new locale.
Template class basic_istream.
Template class basic_ostream.
Controlling output for std::string.
Controlling input and output for std::string.
Provides output iterator semantics for streambufs.
Provides compile-time rational arithmetic.
A non-owning reference to a string.
Managing sequences of characters and character-like objects.
constexpr iterator begin() noexcept
chrono::duration represents a distance between two points in time
_Ios_Iostate iostate
This is a bitmask type.
streamsize precision() const
Flags access.
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.
locale getloc() const
Locale access.
static const iostate failbit
Indicates that an input operation failed to read the expected characters, or that an output operation...
static const locale & classic()
Return reference to the C locale.