30#ifndef _GLIBCXX_CHRONO_IO_H
31#define _GLIBCXX_CHRONO_IO_H 1
33#pragma GCC system_header
35#if __cplusplus >= 202002L
45_GLIBCXX_BEGIN_NAMESPACE_VERSION
60 template<
typename _CharT>
69#define _GLIBCXX_WIDEN_(C, S) ::std::chrono::__detail::_Widen<C>(S, L##S)
70#define _GLIBCXX_WIDEN(S) _GLIBCXX_WIDEN_(_CharT, S)
72 template<
typename _Period,
typename _CharT>
79#define _GLIBCXX_UNITS_SUFFIX(period, suffix) \
80 if constexpr (is_same_v<_Period, period>) \
81 return _GLIBCXX_WIDEN(suffix); \
89#if _GLIBCXX_USE_ALT_MICROSECONDS_SUFFIX
111#undef _GLIBCXX_UNITS_SUFFIX
115 template<
typename _Period,
typename _CharT,
typename _Out>
119 if (
auto __s = __detail::__units_suffix<_Period, _CharT>();
__s.size())
121 else if constexpr (_Period::den == 1)
123 (uintmax_t)_Period::num);
126 (uintmax_t)_Period::num,
127 (uintmax_t)_Period::den);
136 template<
typename _CharT,
typename _Traits,
137 typename _Rep,
typename _Period>
143 using period =
typename _Period::type;
147 __s.precision(
__os.precision());
149 __detail::__fmt_units_suffix<period, _CharT>(_Out(
__s));
158 template<
typename _Duration>
179 template<
typename _Duration>
180 inline __detail::__local_time_fmt<_Duration>
192 [[noreturn,__gnu__::__always_inline__]]
194 __no_timezone_available()
195 { __throw_format_error(
"format error: no timezone available for %Z or %z"); }
197 [[noreturn,__gnu__::__always_inline__]]
199 __not_valid_for_duration()
200 { __throw_format_error(
"format error: chrono-format-spec not valid for "
201 "chrono::duration"); }
203 [[noreturn,__gnu__::__always_inline__]]
205 __invalid_chrono_spec()
206 { __throw_format_error(
"format error: chrono-format-spec not valid for "
209 template<
typename _CharT>
210 struct _ChronoSpec : _Spec<_CharT>
212 basic_string_view<_CharT> _M_chrono_specs;
219 _Year = 1, _Month = 2, _Day = 4, _Weekday = 8, _TimeOfDay = 16,
221 _Date = _Year | _Month | _Day | _Weekday,
222 _DateTime = _Date | _TimeOfDay,
223 _ZonedDateTime = _DateTime | _TimeZone,
227 constexpr _ChronoParts
228 operator|(_ChronoParts __x, _ChronoParts __y)
229 {
return static_cast<_ChronoParts
>((int)__x | (
int)__y); }
232 template<
typename _CharT>
233 struct __formatter_chrono
235 using __string_view = basic_string_view<_CharT>;
236 using __string = basic_string<_CharT>;
238 template<
typename _ParseContext>
239 constexpr typename _ParseContext::iterator
240 _M_parse(_ParseContext& __pc, _ChronoParts __parts)
242 auto __first = __pc.
begin();
243 auto __last = __pc.end();
245 _ChronoSpec<_CharT> __spec{};
247 auto __finalize = [
this, &__spec] {
251 auto __finished = [&] {
252 if (__first == __last || *__first ==
'}')
263 __first = __spec._M_parse_fill_and_align(__first, __last);
267 __first = __spec._M_parse_width(__first, __last, __pc);
271 if (__parts & _ChronoParts::_Duration)
273 __first = __spec._M_parse_precision(__first, __last, __pc);
278 __first = __spec._M_parse_locale(__first, __last);
285 __string_view __str(__first, __last - __first);
286 auto __end = __str.find(
'}');
287 if (__end != __str.npos)
289 __str.remove_suffix(__str.length() - __end);
290 __last = __first + __end;
292 if (__str.find(
'{') != __str.npos)
293 __throw_format_error(
"chrono format error: '{' in chrono-specs");
300 const auto __chrono_specs = __first++;
301 if (*__chrono_specs !=
'%')
302 __throw_format_error(
"chrono format error: no '%' at start of "
309 while (__first != __last)
311 enum _Mods { _Mod_none, _Mod_E, _Mod_O, _Mod_E_O };
312 _Mods __allowed_mods = _Mod_none;
314 _CharT __c = *__first++;
327 __needed = _DateTime;
328 __allowed_mods = _Mod_E;
332 __allowed_mods = _Mod_E;
337 __allowed_mods = _Mod_O;
349 __needed = _TimeOfDay;
350 __allowed_mods = _Mod_O;
353 if (!(__parts & _Duration))
358 __allowed_mods = _Mod_O;
361 __needed = _TimeOfDay;
362 __allowed_mods = _Mod_O;
368 __needed = _TimeOfDay;
372 __needed = _Duration;
375 __needed = _TimeOfDay;
376 __allowed_mods = _Mod_O;
381 __allowed_mods = _Mod_O;
387 __allowed_mods = _Mod_O;
391 __allowed_mods = _Mod_E;
394 __needed = _TimeOfDay;
395 __allowed_mods = _Mod_E;
399 __allowed_mods = _Mod_E_O;
403 __allowed_mods = _Mod_E;
406 __needed = _TimeZone;
407 __allowed_mods = _Mod_E_O;
410 __needed = _TimeZone;
418 if (__mod) [[unlikely]]
420 __allowed_mods = _Mod_none;
426 __throw_format_error(
"chrono format error: invalid "
427 " specifier in chrono-specs");
430 if ((__mod ==
'E' && !(__allowed_mods & _Mod_E))
431 || (__mod ==
'O' && !(__allowed_mods & _Mod_O)))
432 __throw_format_error(
"chrono format error: invalid "
433 " modifier in chrono-specs");
436 if ((__parts & __needed) != __needed)
437 __throw_format_error(
"chrono format error: format argument "
438 "does not contain the information "
439 "required by the chrono-specs");
442 size_t __pos = __string_view(__first, __last - __first).find(
'%');
447 if (__pos == __string_view::npos)
453 __first += __pos + 1;
458 if (__conv || __mod != _CharT())
459 __throw_format_error(
"chrono format error: unescaped '%' in "
463 _M_spec._M_chrono_specs
464 = __string_view(__chrono_specs, __first - __chrono_specs);
474 template<
typename _Tp,
typename _FormatContext>
475 typename _FormatContext::iterator
476 _M_format(
const _Tp& __t, _FormatContext& __fc,
477 bool __is_neg =
false)
const
479 auto __first = _M_spec._M_chrono_specs.begin();
480 const auto __last = _M_spec._M_chrono_specs.end();
481 if (__first == __last)
482 return _M_format_to_ostream(__t, __fc, __is_neg);
484 _Sink_iter<_CharT> __out;
485 __format::_Str_sink<_CharT> __sink;
486 bool __write_direct =
false;
487 if constexpr (is_same_v<
typename _FormatContext::iterator,
490 if (_M_spec._M_width_kind == __format::_WP_none)
493 __write_direct =
true;
496 __out = __sink.out();
499 __out = __sink.out();
503 if constexpr (__is_specialization_of<_Tp, chrono::hh_mm_ss>)
504 __is_neg = __t.is_negative();
506 auto __print_sign = [&__is_neg, &__out] {
507 if constexpr (chrono::__is_duration_v<_Tp>
508 || __is_specialization_of<_Tp, chrono::hh_mm_ss>)
511 *__out++ = _S_plus_minus[1];
518 constexpr const _CharT* __literals = _GLIBCXX_WIDEN(
"\n\t%");
525 _CharT __c = *__first++;
530 __out = _M_a_A(__t,
std::move(__out), __fc, __c ==
'A');
535 __out = _M_b_B(__t,
std::move(__out), __fc, __c ==
'B');
538 __out = _M_c(__t,
std::move(__out), __fc, __mod ==
'E');
543 __out = _M_C_y_Y(__t,
std::move(__out), __fc, __c, __mod);
547 __out = _M_d_e(__t,
std::move(__out), __fc, __c, __mod ==
'O');
550 __out = _M_D(__t,
std::move(__out), __fc);
553 __out = _M_F(__t,
std::move(__out), __fc);
557 __out = _M_g_G(__t,
std::move(__out), __fc, __c ==
'G');
561 __out = _M_H_I(__t, __print_sign(), __fc, __c, __mod ==
'O');
564 __out = _M_j(__t, __print_sign(), __fc);
567 __out = _M_m(__t,
std::move(__out), __fc, __mod ==
'O');
570 __out = _M_M(__t, __print_sign(), __fc, __mod ==
'O');
573 __out = _M_p(__t,
std::move(__out), __fc);
576 __out = _M_q(__t,
std::move(__out), __fc);
580 if constexpr (chrono::__is_duration_v<_Tp>)
584 __throw_format_error(
"chrono format error: argument is "
588 __out = _M_r(__t, __print_sign(), __fc);
592 __out = _M_R_T(__t, __print_sign(), __fc, __c ==
'T');
595 __out = _M_S(__t, __print_sign(), __fc, __mod ==
'O');
599 __out = _M_u_w(__t,
std::move(__out), __fc, __c, __mod ==
'O');
604 __out = _M_U_V_W(__t,
std::move(__out), __fc, __c,
608 __out = _M_x(__t,
std::move(__out), __fc, __mod ==
'E');
611 __out = _M_X(__t, __print_sign(), __fc, __mod ==
'E');
614 __out = _M_z(__t,
std::move(__out), __fc, (
bool)__mod);
617 __out = _M_Z(__t,
std::move(__out), __fc);
620 *__out++ = __literals[0];
623 *__out++ = __literals[1];
626 *__out++ = __literals[2];
638 __string_view __str(__first, __last - __first);
639 size_t __pos = __str.find(
'%');
644 if (__pos == __str.npos)
648 __str.remove_suffix(__str.length() - __pos);
649 __first += __pos + 1;
651 __out = __format::__write(
std::move(__out), __str);
654 while (__first != __last);
656 if constexpr (is_same_v<
typename _FormatContext::iterator,
662 return __format::__write_padded_as_spec(__str, __str.size(),
666 _ChronoSpec<_CharT> _M_spec;
670 template<
typename _FormatContext>
672 _M_locale(_FormatContext& __fc)
const
674 if (!_M_spec._M_localized)
677 return __fc.locale();
685 template<
typename _Tp,
typename _FormatContext>
686 typename _FormatContext::iterator
687 _M_format_to_ostream(
const _Tp& __t, _FormatContext& __fc,
690 using ::std::chrono::__detail::__utc_leap_second;
691 using ::std::chrono::__detail::__local_time_fmt;
693 if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
694 return _M_format_to_ostream(__t._M_time, __fc,
false);
697 basic_ostringstream<_CharT> __os;
698 __os.imbue(_M_locale(__fc));
700 if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
701 __os << __t._M_date <<
' ' << __t._M_time;
702 else if constexpr (chrono::__is_time_point_v<_Tp>)
709 if constexpr (is_convertible_v<_Tp, chrono::sys_days>)
710 __os << _S_date(__t);
713 auto __days = chrono::floor<chrono::days>(__t);
714 __os << chrono::year_month_day(__days) <<
' '
715 << chrono::hh_mm_ss(__t - __days);
720 if constexpr (chrono::__is_duration_v<_Tp>)
721 if (__is_neg) [[unlikely]]
722 __os << _S_plus_minus[1];
727 return __format::__write_padded_as_spec(__str, __str.size(),
732 static constexpr const _CharT* _S_chars
733 = _GLIBCXX_WIDEN(
"0123456789+-:/ {}");
734 static constexpr const _CharT* _S_plus_minus = _S_chars + 10;
735 static constexpr _CharT _S_colon = _S_chars[12];
736 static constexpr _CharT _S_slash = _S_chars[13];
737 static constexpr _CharT _S_space = _S_chars[14];
738 static constexpr const _CharT* _S_empty_spec = _S_chars + 15;
740 template<
typename _Tp,
typename _FormatContext>
741 typename _FormatContext::iterator
742 _M_a_A(
const _Tp& __t,
typename _FormatContext::iterator __out,
743 _FormatContext& __ctx,
bool __full)
const
747 chrono::weekday __wd = _S_weekday(__t);
749 __throw_format_error(
"format error: invalid weekday");
751 locale __loc = _M_locale(__ctx);
752 const auto& __tp = use_facet<__timepunct<_CharT>>(__loc);
753 const _CharT* __days[7];
755 __tp._M_days(__days);
757 __tp._M_days_abbreviated(__days);
758 __string_view __str(__days[__wd.c_encoding()]);
759 return __format::__write(
std::move(__out), __str);
762 template<
typename _Tp,
typename _FormatContext>
763 typename _FormatContext::iterator
764 _M_b_B(
const _Tp& __t,
typename _FormatContext::iterator __out,
765 _FormatContext& __ctx,
bool __full)
const
769 chrono::month __m = _S_month(__t);
771 __throw_format_error(
"format error: invalid month");
772 locale __loc = _M_locale(__ctx);
773 const auto& __tp = use_facet<__timepunct<_CharT>>(__loc);
774 const _CharT* __months[12];
776 __tp._M_months(__months);
778 __tp._M_months_abbreviated(__months);
779 __string_view __str(__months[(
unsigned)__m - 1]);
780 return __format::__write(
std::move(__out), __str);
783 template<
typename _Tp,
typename _FormatContext>
784 typename _FormatContext::iterator
785 _M_c(
const _Tp& __tt,
typename _FormatContext::iterator __out,
786 _FormatContext& __ctx,
bool __mod =
false)
const
791 auto __t = _S_floor_seconds(__tt);
792 locale __loc = _M_locale(__ctx);
793 const auto& __tp = use_facet<__timepunct<_CharT>>(__loc);
794 const _CharT* __formats[2];
795 __tp._M_date_time_formats(__formats);
796 const _CharT* __rep = __formats[__mod];
798 __rep = _GLIBCXX_WIDEN(
"%a %b %e %H:%M:%S %Y");
799 basic_string<_CharT> __fmt(_S_empty_spec);
800 __fmt.insert(1u, 1u, _S_colon);
801 __fmt.insert(2u, __rep);
806 template<
typename _Tp,
typename _FormatContext>
807 typename _FormatContext::iterator
808 _M_C_y_Y(
const _Tp& __t,
typename _FormatContext::iterator __out,
809 _FormatContext& __ctx, _CharT __conv, _CharT __mod = 0)
const
819 chrono::year __y = _S_year(__t);
821 if (__mod) [[unlikely]]
824 __tm.tm_year = (int)__y - 1900;
825 return _M_locale_fmt(
std::move(__out), _M_locale(__ctx), __tm,
829 basic_string<_CharT> __s;
831 const bool __is_neg = __yi < 0;
832 __yi = __builtin_abs(__yi);
834 if (__conv ==
'Y' || __conv ==
'C')
836 int __ci = __yi / 100;
837 if (__is_neg) [[unlikely]]
839 __s.assign(1, _S_plus_minus[1]);
841 if (__conv ==
'C' && (__ci * 100) != __yi)
844 if (__ci >= 100) [[unlikely]]
846 __s += std::format(_S_empty_spec, __ci / 100);
849 __s += _S_two_digits(__ci);
852 if (__conv ==
'Y' || __conv ==
'y')
853 __s += _S_two_digits(__yi % 100);
855 return __format::__write(
std::move(__out), __string_view(__s));
858 template<
typename _Tp,
typename _FormatContext>
859 typename _FormatContext::iterator
860 _M_D(
const _Tp& __t,
typename _FormatContext::iterator __out,
861 _FormatContext&)
const
863 auto __ymd = _S_date(__t);
864 basic_string<_CharT> __s;
865#if ! _GLIBCXX_USE_CXX11_ABI
868 __s = _S_two_digits((
unsigned)__ymd.month());
870 __s += _S_two_digits((
unsigned)__ymd.day());
872 __s += _S_two_digits(__builtin_abs((
int)__ymd.year()) % 100);
873 return __format::__write(
std::move(__out), __string_view(__s));
876 template<
typename _Tp,
typename _FormatContext>
877 typename _FormatContext::iterator
878 _M_d_e(
const _Tp& __t,
typename _FormatContext::iterator __out,
879 _FormatContext& __ctx, _CharT __conv,
bool __mod =
false)
const
886 chrono::day __d = _S_day(__t);
887 unsigned __i = (unsigned)__d;
889 if (__mod) [[unlikely]]
893 return _M_locale_fmt(
std::move(__out), _M_locale(__ctx), __tm,
897 auto __sv = _S_two_digits(__i);
899 if (__conv == _CharT(
'e') && __i < 10)
905 return __format::__write(
std::move(__out), __sv);
908 template<
typename _Tp,
typename _FormatContext>
909 typename _FormatContext::iterator
910 _M_F(
const _Tp& __t,
typename _FormatContext::iterator __out,
911 _FormatContext&)
const
913 auto __ymd = _S_date(__t);
914 basic_string<_CharT> __s;
915#if ! _GLIBCXX_USE_CXX11_ABI
918 __s += std::format(_GLIBCXX_WIDEN(
"{:04d}- - "), (
int)__ymd.year());
919 auto __sv = _S_two_digits((
unsigned)__ymd.month());
920 __s[__s.size() - 5] = __sv[0];
921 __s[__s.size() - 4] = __sv[1];
922 __sv = _S_two_digits((
unsigned)__ymd.day());
923 __s[__s.size() - 2] = __sv[0];
924 __s[__s.size() - 1] = __sv[1];
926 return __format::__write(
std::move(__out), __sv);
929 template<
typename _Tp,
typename _FormatContext>
930 typename _FormatContext::iterator
931 _M_g_G(
const _Tp& __t,
typename _FormatContext::iterator __out,
932 _FormatContext& __ctx,
bool __full)
const
936 using namespace chrono;
937 auto __d = _S_days(__t);
939 __d -= (weekday(__d) - Monday) -
days(3);
941 year __y = year_month_day(__d).year();
942 return _M_C_y_Y(__y,
std::move(__out), __ctx,
"yY"[__full]);
945 template<
typename _Tp,
typename _FormatContext>
946 typename _FormatContext::iterator
947 _M_H_I(
const _Tp& __t,
typename _FormatContext::iterator __out,
948 _FormatContext& __ctx, _CharT __conv,
bool __mod =
false)
const
955 const auto __hms = _S_hms(__t);
956 int __i = __hms.hours().count();
958 if (__mod) [[unlikely]]
962 return _M_locale_fmt(
std::move(__out), _M_locale(__ctx), __tm,
966 if (__conv == _CharT(
'I'))
973 return __format::__write(
std::move(__out), _S_two_digits(__i));
976 template<
typename _Tp,
typename _FormatContext>
977 typename _FormatContext::iterator
978 _M_j(
const _Tp& __t,
typename _FormatContext::iterator __out,
979 _FormatContext&)
const
981 if constexpr (chrono::__is_duration_v<_Tp>)
984 unsigned __d = chrono::duration_cast<chrono::days>(__t).count();
990 using namespace chrono;
991 auto __day = _S_days(__t);
992 auto __ymd = _S_date(__t);
996 if constexpr (is_same_v<
typename decltype(__day)::clock, local_t>)
997 __d = __day - local_days(__ymd.year()/January/0);
999 __d = __day - sys_days(__ymd.year()/January/0);
1005 template<
typename _Tp,
typename _FormatContext>
1006 typename _FormatContext::iterator
1007 _M_m(
const _Tp& __t,
typename _FormatContext::iterator __out,
1008 _FormatContext& __ctx,
bool __mod)
const
1013 auto __m = _S_month(__t);
1014 auto __i = (unsigned)__m;
1016 if (__mod) [[unlikely]]
1019 __tm.tm_mon = __i - 1;
1020 return _M_locale_fmt(
std::move(__out), _M_locale(__ctx), __tm,
1024 return __format::__write(
std::move(__out), _S_two_digits(__i));
1027 template<
typename _Tp,
typename _FormatContext>
1028 typename _FormatContext::iterator
1029 _M_M(
const _Tp& __t,
typename _FormatContext::iterator __out,
1030 _FormatContext& __ctx,
bool __mod)
const
1035 auto __m = _S_hms(__t).minutes();
1036 auto __i = __m.count();
1038 if (__mod) [[unlikely]]
1042 return _M_locale_fmt(
std::move(__out), _M_locale(__ctx), __tm,
1046 return __format::__write(
std::move(__out), _S_two_digits(__i));
1049 template<
typename _Tp,
typename _FormatContext>
1050 typename _FormatContext::iterator
1051 _M_p(
const _Tp& __t,
typename _FormatContext::iterator __out,
1052 _FormatContext& __ctx)
const
1055 auto __hms = _S_hms(__t);
1056 locale __loc = _M_locale(__ctx);
1057 const auto& __tp = use_facet<__timepunct<_CharT>>(__loc);
1058 const _CharT* __ampm[2];
1059 __tp._M_am_pm(__ampm);
1061 __ampm[__hms.hours().count() >= 12]);
1064 template<
typename _Tp,
typename _FormatContext>
1065 typename _FormatContext::iterator
1066 _M_q(
const _Tp&,
typename _FormatContext::iterator __out,
1067 _FormatContext&)
const
1070 if constexpr (!chrono::__is_duration_v<_Tp>)
1071 __throw_format_error(
"format error: argument is not a duration");
1074 namespace __d = chrono::__detail;
1075 using period =
typename _Tp::period;
1076 return __d::__fmt_units_suffix<period, _CharT>(
std::move(__out));
1082 template<
typename _Tp,
typename _FormatContext>
1083 typename _FormatContext::iterator
1084 _M_r(
const _Tp& __tt,
typename _FormatContext::iterator __out,
1085 _FormatContext& __ctx)
const
1088 auto __t = _S_floor_seconds(__tt);
1089 locale __loc = _M_locale(__ctx);
1090 const auto& __tp = use_facet<__timepunct<_CharT>>(__loc);
1091 const _CharT* __ampm_fmt;
1092 __tp._M_am_pm_format(&__ampm_fmt);
1093 basic_string<_CharT> __fmt(_S_empty_spec);
1094 __fmt.insert(1u, 1u, _S_colon);
1095 __fmt.insert(2u, __ampm_fmt);
1100 template<
typename _Tp,
typename _FormatContext>
1101 typename _FormatContext::iterator
1102 _M_R_T(
const _Tp& __t,
typename _FormatContext::iterator __out,
1103 _FormatContext& __ctx,
bool __secs)
const
1107 auto __hms = _S_hms(__t);
1109 basic_string<_CharT> __s;
1110#if ! _GLIBCXX_USE_CXX11_ABI
1113 __s = std::format(_GLIBCXX_WIDEN(
"{:02d}:00"), __hms.hours().count());
1114 auto __sv = _S_two_digits(__hms.minutes().count());
1115 __s[__s.size() - 2] = __sv[0];
1116 __s[__s.size() - 1] = __sv[1];
1118 __out = __format::__write(
std::move(__out), __sv);
1121 *__out++ = _S_colon;
1122 __out = _M_S(__hms,
std::move(__out), __ctx);
1127 template<
typename _Tp,
typename _FormatContext>
1128 typename _FormatContext::iterator
1129 _M_S(
const _Tp& __t,
typename _FormatContext::iterator __out,
1130 _FormatContext& __ctx,
bool __mod =
false)
const
1134 auto __hms = _S_hms(__t);
1136 if (__mod) [[unlikely]]
1139 __tm.tm_sec = (int)__hms.seconds().count();
1140 return _M_locale_fmt(
std::move(__out), _M_locale(__ctx), __tm,
1144 if constexpr (__hms.fractional_width == 0)
1145 __out = __format::__write(
std::move(__out),
1146 _S_two_digits(__hms.seconds().count()));
1149 locale __loc = _M_locale(__ctx);
1150 auto __s = __hms.seconds();
1151 auto __ss = __hms.subseconds();
1152 using rep =
typename decltype(__ss)::rep;
1153 if constexpr (is_floating_point_v<rep>)
1155 chrono::duration<rep> __fs = __s + __ss;
1157 _GLIBCXX_WIDEN(
"{:#0{}.{}Lf}"),
1159 3 + __hms.fractional_width,
1160 __hms.fractional_width);
1165 = use_facet<numpunct<_CharT>>(__loc);
1166 __out = __format::__write(
std::move(__out),
1167 _S_two_digits(__s.count()));
1168 *__out++ = __np.decimal_point();
1169 if constexpr (is_integral_v<rep>)
1171 _GLIBCXX_WIDEN(
"{:0{}}"),
1173 __hms.fractional_width);
1176 auto __str = std::format(_S_empty_spec, __ss.count());
1179 __hms.fractional_width);
1188 template<
typename _Tp,
typename _FormatContext>
1189 typename _FormatContext::iterator
1190 _M_u_w(
const _Tp& __t,
typename _FormatContext::iterator __out,
1191 _FormatContext& __ctx, _CharT __conv,
bool __mod =
false)
const
1198 chrono::weekday __wd = _S_weekday(__t);
1200 if (__mod) [[unlikely]]
1203 __tm.tm_wday = __wd.c_encoding();
1204 return _M_locale_fmt(
std::move(__out), _M_locale(__ctx), __tm,
1208 unsigned __wdi = __conv ==
'u' ? __wd.iso_encoding()
1209 : __wd.c_encoding();
1210 const _CharT __d = _S_digit(__wdi);
1211 return __format::__write(
std::move(__out), __string_view(&__d, 1));
1214 template<
typename _Tp,
typename _FormatContext>
1215 typename _FormatContext::iterator
1216 _M_U_V_W(
const _Tp& __t,
typename _FormatContext::iterator __out,
1217 _FormatContext& __ctx, _CharT __conv,
bool __mod =
false)
const
1225 using namespace chrono;
1226 auto __d = _S_days(__t);
1227 using _TDays =
decltype(__d);
1229 if (__mod) [[unlikely]]
1231 const year_month_day __ymd(__d);
1232 const year __y = __ymd.year();
1234 __tm.tm_year = (int)__y - 1900;
1235 __tm.tm_yday = (__d - _TDays(__y/January/1)).count();
1236 __tm.tm_wday = weekday(__d).c_encoding();
1237 return _M_locale_fmt(
std::move(__out), _M_locale(__ctx), __tm,
1245 __d -= (weekday(__d) - Monday) -
days(3);
1248 __first = _TDays(year_month_day(__d).year()/January/1);
1253 if constexpr (
requires { __t.year(); })
1256 __y = year_month_day(__d).year();
1257 const weekday __weekstart = __conv ==
'U' ? Sunday : Monday;
1258 __first = _TDays(__y/January/__weekstart[1]);
1260 auto __weeks = chrono::floor<weeks>(__d - __first);
1261 __string_view __sv = _S_two_digits(__weeks.count() + 1);
1262 return __format::__write(
std::move(__out), __sv);
1265 template<
typename _Tp,
typename _FormatContext>
1266 typename _FormatContext::iterator
1267 _M_x(
const _Tp& __t,
typename _FormatContext::iterator __out,
1268 _FormatContext& __ctx,
bool __mod =
false)
const
1272 locale __loc = _M_locale(__ctx);
1273 const auto& __tp = use_facet<__timepunct<_CharT>>(__loc);
1274 const _CharT* __date_reps[2];
1275 __tp._M_date_formats(__date_reps);
1276 const _CharT* __rep = __date_reps[__mod];
1278 return _M_D(__t,
std::move(__out), __ctx);
1280 basic_string<_CharT> __fmt(_S_empty_spec);
1281 __fmt.insert(1u, 1u, _S_colon);
1282 __fmt.insert(2u, __rep);
1287 template<
typename _Tp,
typename _FormatContext>
1288 typename _FormatContext::iterator
1289 _M_X(
const _Tp& __tt,
typename _FormatContext::iterator __out,
1290 _FormatContext& __ctx,
bool __mod =
false)
const
1294 auto __t = _S_floor_seconds(__tt);
1295 locale __loc = _M_locale(__ctx);
1296 const auto& __tp = use_facet<__timepunct<_CharT>>(__loc);
1297 const _CharT* __time_reps[2];
1298 __tp._M_time_formats(__time_reps);
1299 const _CharT* __rep = __time_reps[__mod];
1301 return _M_R_T(__t,
std::move(__out), __ctx,
true);
1303 basic_string<_CharT> __fmt(_S_empty_spec);
1304 __fmt.insert(1u, 1u, _S_colon);
1305 __fmt.insert(2u, __rep);
1310 template<
typename _Tp,
typename _FormatContext>
1311 typename _FormatContext::iterator
1312 _M_z(
const _Tp& __t,
typename _FormatContext::iterator __out,
1313 _FormatContext&,
bool __mod =
false)
const
1315 using ::std::chrono::__detail::__utc_leap_second;
1316 using ::std::chrono::__detail::__local_time_fmt;
1318 auto __utc = __mod ? __string_view(_GLIBCXX_WIDEN(
"+00:00"), 6)
1319 : __string_view(_GLIBCXX_WIDEN(
"+0000"), 5);
1321 if constexpr (chrono::__is_time_point_v<_Tp>)
1323 if constexpr (is_same_v<
typename _Tp::clock,
1324 chrono::system_clock>)
1325 return __format::__write(
std::move(__out), __utc);
1327 else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
1329 if (__t._M_offset_sec)
1332 basic_string<_CharT> __s;
1333 if (*__t._M_offset_sec != 0s)
1335 chrono:: hh_mm_ss __hms(*__t._M_offset_sec);
1336 __s = _S_plus_minus[__hms.is_negative()];
1337 __s += _S_two_digits(__hms.hours().count());
1340 __s += _S_two_digits(__hms.minutes().count());
1343 return __format::__write(
std::move(__out), __sv);
1346 else if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
1347 return __format::__write(
std::move(__out), __utc);
1349 __no_timezone_available();
1352 template<
typename _Tp,
typename _FormatContext>
1353 typename _FormatContext::iterator
1354 _M_Z(
const _Tp& __t,
typename _FormatContext::iterator __out,
1355 _FormatContext& __ctx)
const
1357 using ::std::chrono::__detail::__utc_leap_second;
1358 using ::std::chrono::__detail::__local_time_fmt;
1360 __string_view __utc(_GLIBCXX_WIDEN(
"UTC"), 3);
1361 if constexpr (chrono::__is_time_point_v<_Tp>)
1363 if constexpr (is_same_v<
typename _Tp::clock,
1364 chrono::system_clock>)
1365 return __format::__write(
std::move(__out), __utc);
1367 else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
1371 string_view __sv = *__t._M_abbrev;
1372 if constexpr (is_same_v<_CharT, char>)
1373 return __format::__write(
std::move(__out), __sv);
1377 basic_string<_CharT> __ws(__sv.size(), _CharT());
1378 auto& __ct = use_facet<ctype<_CharT>>(_M_locale(__ctx));
1379 __ct.widen(__sv.begin(), __sv.end(), __ws.data());
1380 __string_view __wsv = __ws;
1381 return __format::__write(
std::move(__out), __wsv);
1385 else if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
1386 return __format::__write(
std::move(__out), __utc);
1388 __no_timezone_available();
1395 _S_digit(
int __n)
noexcept
1398 return _GLIBCXX_WIDEN(
"0123456789999999")[__n & 0xf];
1402 static basic_string_view<_CharT>
1403 _S_two_digits(
int __n)
noexcept
1406 _GLIBCXX_WIDEN(
"0001020304050607080910111213141516171819"
1407 "2021222324252627282930313233343536373839"
1408 "4041424344454647484950515253545556575859"
1409 "6061626364656667686970717273747576777879"
1410 "8081828384858687888990919293949596979899"
1411 "9999999999999999999999999999999999999999"
1412 "9999999999999999") + 2 * (__n & 0x7f),
1420 template<
typename _Tp>
1421 static decltype(
auto)
1422 _S_hms(
const _Tp& __t)
1424 using ::std::chrono::__detail::__utc_leap_second;
1425 using ::std::chrono::__detail::__local_time_fmt;
1427 if constexpr (__is_specialization_of<_Tp, chrono::hh_mm_ss>)
1429 else if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
1431 else if constexpr (chrono::__is_duration_v<_Tp>)
1432 return chrono::hh_mm_ss<_Tp>(__t);
1433 else if constexpr (chrono::__is_time_point_v<_Tp>)
1434 return chrono::hh_mm_ss(__t - chrono::floor<chrono::days>(__t));
1435 else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
1436 return _S_hms(__t._M_time);
1439 __invalid_chrono_spec();
1440 return chrono::hh_mm_ss<chrono::seconds>();
1445 template<
typename _Tp>
1447 _S_days(
const _Tp& __t)
1449 using namespace chrono;
1450 using ::std::chrono::__detail::__utc_leap_second;
1451 using ::std::chrono::__detail::__local_time_fmt;
1453 if constexpr (__is_time_point_v<_Tp>)
1454 return chrono::floor<days>(__t);
1455 else if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
1457 else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
1458 return chrono::floor<days>(__t._M_time);
1459 else if constexpr (is_same_v<_Tp, year_month_day>
1460 || is_same_v<_Tp, year_month_day_last>
1461 || is_same_v<_Tp, year_month_weekday>
1462 || is_same_v<_Tp, year_month_weekday_last>)
1463 return sys_days(__t);
1466 if constexpr (__is_duration_v<_Tp>)
1467 __not_valid_for_duration();
1469 __invalid_chrono_spec();
1470 return chrono::sys_days();
1475 template<
typename _Tp>
1476 static chrono::year_month_day
1477 _S_date(
const _Tp& __t)
1479 if constexpr (is_same_v<_Tp, chrono::year_month_day>)
1482 return chrono::year_month_day(_S_days(__t));
1485 template<
typename _Tp>
1487 _S_day(
const _Tp& __t)
1489 using namespace chrono;
1491 if constexpr (is_same_v<_Tp, day>)
1493 else if constexpr (
requires { __t.day(); })
1496 return _S_date(__t).day();
1499 template<
typename _Tp>
1500 static chrono::month
1501 _S_month(
const _Tp& __t)
1503 using namespace chrono;
1505 if constexpr (is_same_v<_Tp, month>)
1507 else if constexpr (
requires { __t.month(); })
1510 return _S_date(__t).month();
1513 template<
typename _Tp>
1515 _S_year(
const _Tp& __t)
1517 using namespace chrono;
1519 if constexpr (is_same_v<_Tp, year>)
1521 else if constexpr (
requires { __t.year(); })
1524 return _S_date(__t).year();
1527 template<
typename _Tp>
1528 static chrono::weekday
1529 _S_weekday(
const _Tp& __t)
1532 using ::std::chrono::__detail::__local_time_fmt;
1534 if constexpr (is_same_v<_Tp, weekday>)
1536 else if constexpr (
requires { __t.weekday(); })
1538 else if constexpr (is_same_v<_Tp, month_weekday>)
1539 return __t.weekday_indexed().weekday();
1540 else if constexpr (is_same_v<_Tp, month_weekday_last>)
1541 return __t.weekday_last().weekday();
1543 return weekday(_S_days(__t));
1547 template<
typename _Tp>
1549 _S_floor_seconds(
const _Tp& __t)
1551 using chrono::__detail::__local_time_fmt;
1552 if constexpr (chrono::__is_time_point_v<_Tp>
1553 || chrono::__is_duration_v<_Tp>)
1555 if constexpr (_Tp::period::den != 1)
1556 return chrono::floor<chrono::seconds>(__t);
1560 else if constexpr (__is_specialization_of<_Tp, chrono::hh_mm_ss>)
1562 if constexpr (_Tp::fractional_width != 0)
1563 return chrono::floor<chrono::seconds>(__t.to_duration());
1567 else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
1568 return _S_floor_seconds(__t._M_time);
1575 template<
typename _Iter>
1577 _M_locale_fmt(_Iter __out,
const locale& __loc,
const struct tm& __tm,
1578 char __fmt,
char __mod)
const
1580 basic_ostringstream<_CharT> __os;
1581 const auto& __tp = use_facet<time_put<_CharT>>(__loc);
1582 __tp.put(__os, __os, _S_space, &__tm, __fmt, __mod);
1584 __out = __format::__write(
std::move(__out), __os.view());
1592 template<
typename _Rep,
typename _Period,
typename _CharT>
1593 struct formatter<chrono::duration<_Rep, _Period>, _CharT>
1595 constexpr typename basic_format_parse_context<_CharT>::iterator
1596 parse(basic_format_parse_context<_CharT>& __pc)
1598 using namespace __format;
1599 auto __it = _M_f._M_parse(__pc, _Duration|_TimeOfDay);
1600 if constexpr (!is_floating_point_v<_Rep>)
1601 if (_M_f._M_spec._M_prec_kind != __format::_WP_none)
1602 __throw_format_error(
"format error: invalid precision for duration");
1606 template<
typename _Out>
1607 typename basic_format_context<_Out, _CharT>::iterator
1608 format(
const chrono::duration<_Rep, _Period>& __d,
1609 basic_format_context<_Out, _CharT>& __fc)
const
1612 if (__d < __d.zero()) [[unlikely]]
1614 if constexpr (is_integral_v<_Rep>)
1618 using _URep = make_unsigned_t<_Rep>;
1619 auto __ucnt = -
static_cast<_URep
>(__d.count());
1620 auto __ud = chrono::duration<_URep, _Period>(__ucnt);
1621 return _M_f._M_format(__ud, __fc,
true);
1624 return _M_f._M_format(-__d, __fc,
true);
1626 return _M_f._M_format(__d, __fc,
false);
1630 __format::__formatter_chrono<_CharT> _M_f;
1633 template<
typename _CharT>
1634 struct formatter<chrono::day, _CharT>
1636 template<
typename _ParseContext>
1637 constexpr typename _ParseContext::iterator
1638 parse(_ParseContext& __pc)
1639 {
return _M_f._M_parse(__pc, __format::_Day); }
1641 template<
typename _FormatContext>
1642 typename _FormatContext::iterator
1643 format(
const chrono::day& __t, _FormatContext& __fc)
const
1644 {
return _M_f._M_format(__t, __fc); }
1647 __format::__formatter_chrono<_CharT> _M_f;
1650 template<
typename _CharT>
1651 struct formatter<chrono::month, _CharT>
1653 template<
typename _ParseContext>
1654 constexpr typename _ParseContext::iterator
1655 parse(_ParseContext& __pc)
1656 {
return _M_f._M_parse(__pc, __format::_Month); }
1658 template<
typename _FormatContext>
1659 typename _FormatContext::iterator
1660 format(
const chrono::month& __t, _FormatContext& __fc)
const
1661 {
return _M_f._M_format(__t, __fc); }
1664 __format::__formatter_chrono<_CharT> _M_f;
1667 template<
typename _CharT>
1668 struct formatter<chrono::year, _CharT>
1670 template<
typename _ParseContext>
1671 constexpr typename _ParseContext::iterator
1672 parse(_ParseContext& __pc)
1673 {
return _M_f._M_parse(__pc, __format::_Year); }
1675 template<
typename _FormatContext>
1676 typename _FormatContext::iterator
1677 format(
const chrono::year& __t, _FormatContext& __fc)
const
1678 {
return _M_f._M_format(__t, __fc); }
1681 __format::__formatter_chrono<_CharT> _M_f;
1684 template<
typename _CharT>
1685 struct formatter<chrono::weekday, _CharT>
1687 template<
typename _ParseContext>
1688 constexpr typename _ParseContext::iterator
1689 parse(_ParseContext& __pc)
1690 {
return _M_f._M_parse(__pc, __format::_Weekday); }
1692 template<
typename _FormatContext>
1693 typename _FormatContext::iterator
1694 format(
const chrono::weekday& __t, _FormatContext& __fc)
const
1695 {
return _M_f._M_format(__t, __fc); }
1698 __format::__formatter_chrono<_CharT> _M_f;
1701 template<
typename _CharT>
1702 struct formatter<chrono::weekday_indexed, _CharT>
1704 template<
typename _ParseContext>
1705 constexpr typename _ParseContext::iterator
1706 parse(_ParseContext& __pc)
1707 {
return _M_f._M_parse(__pc, __format::_Weekday); }
1709 template<
typename _FormatContext>
1710 typename _FormatContext::iterator
1711 format(
const chrono::weekday_indexed& __t, _FormatContext& __fc)
const
1712 {
return _M_f._M_format(__t, __fc); }
1715 __format::__formatter_chrono<_CharT> _M_f;
1718 template<
typename _CharT>
1719 struct formatter<chrono::weekday_last, _CharT>
1721 template<
typename _ParseContext>
1722 constexpr typename _ParseContext::iterator
1723 parse(_ParseContext& __pc)
1724 {
return _M_f._M_parse(__pc, __format::_Weekday); }
1726 template<
typename _FormatContext>
1727 typename _FormatContext::iterator
1728 format(
const chrono::weekday_last& __t, _FormatContext& __fc)
const
1729 {
return _M_f._M_format(__t, __fc); }
1732 __format::__formatter_chrono<_CharT> _M_f;
1735 template<
typename _CharT>
1736 struct formatter<chrono::month_day, _CharT>
1738 template<
typename _ParseContext>
1739 constexpr typename _ParseContext::iterator
1740 parse(_ParseContext& __pc)
1741 {
return _M_f._M_parse(__pc, __format::_Month|__format::_Day); }
1743 template<
typename _FormatContext>
1744 typename _FormatContext::iterator
1745 format(
const chrono::month_day& __t, _FormatContext& __fc)
const
1746 {
return _M_f._M_format(__t, __fc); }
1749 __format::__formatter_chrono<_CharT> _M_f;
1752 template<
typename _CharT>
1753 struct formatter<chrono::month_day_last, _CharT>
1755 template<
typename _ParseContext>
1756 constexpr typename _ParseContext::iterator
1757 parse(_ParseContext& __pc)
1758 {
return _M_f._M_parse(__pc, __format::_Month|__format::_Day); }
1760 template<
typename _FormatContext>
1761 typename _FormatContext::iterator
1762 format(
const chrono::month_day_last& __t, _FormatContext& __fc)
const
1763 {
return _M_f._M_format(__t, __fc); }
1766 __format::__formatter_chrono<_CharT> _M_f;
1769 template<
typename _CharT>
1770 struct formatter<chrono::month_weekday, _CharT>
1772 template<
typename _ParseContext>
1773 constexpr typename _ParseContext::iterator
1774 parse(_ParseContext& __pc)
1775 {
return _M_f._M_parse(__pc, __format::_Month|__format::_Weekday); }
1777 template<
typename _FormatContext>
1778 typename _FormatContext::iterator
1779 format(
const chrono::month_weekday& __t, _FormatContext& __fc)
const
1780 {
return _M_f._M_format(__t, __fc); }
1783 __format::__formatter_chrono<_CharT> _M_f;
1786 template<
typename _CharT>
1787 struct formatter<chrono::month_weekday_last, _CharT>
1789 template<
typename _ParseContext>
1790 constexpr typename _ParseContext::iterator
1791 parse(_ParseContext& __pc)
1792 {
return _M_f._M_parse(__pc, __format::_Month|__format::_Weekday); }
1794 template<
typename _FormatContext>
1795 typename _FormatContext::iterator
1796 format(
const chrono::month_weekday_last& __t,
1797 _FormatContext& __fc)
const
1798 {
return _M_f._M_format(__t, __fc); }
1801 __format::__formatter_chrono<_CharT> _M_f;
1804 template<
typename _CharT>
1805 struct formatter<chrono::year_month, _CharT>
1807 template<
typename _ParseContext>
1808 constexpr typename _ParseContext::iterator
1809 parse(_ParseContext& __pc)
1810 {
return _M_f._M_parse(__pc, __format::_Year|__format::_Month); }
1812 template<
typename _FormatContext>
1813 typename _FormatContext::iterator
1814 format(
const chrono::year_month& __t, _FormatContext& __fc)
const
1815 {
return _M_f._M_format(__t, __fc); }
1818 __format::__formatter_chrono<_CharT> _M_f;
1821 template<
typename _CharT>
1822 struct formatter<chrono::year_month_day, _CharT>
1824 template<
typename _ParseContext>
1825 constexpr typename _ParseContext::iterator
1826 parse(_ParseContext& __pc)
1827 {
return _M_f._M_parse(__pc, __format::_Date); }
1829 template<
typename _FormatContext>
1830 typename _FormatContext::iterator
1831 format(
const chrono::year_month_day& __t, _FormatContext& __fc)
const
1832 {
return _M_f._M_format(__t, __fc); }
1835 __format::__formatter_chrono<_CharT> _M_f;
1838 template<
typename _CharT>
1839 struct formatter<chrono::year_month_day_last, _CharT>
1841 template<
typename _ParseContext>
1842 constexpr typename _ParseContext::iterator
1843 parse(_ParseContext& __pc)
1844 {
return _M_f._M_parse(__pc, __format::_Date); }
1846 template<
typename _FormatContext>
1847 typename _FormatContext::iterator
1848 format(
const chrono::year_month_day_last& __t,
1849 _FormatContext& __fc)
const
1850 {
return _M_f._M_format(__t, __fc); }
1853 __format::__formatter_chrono<_CharT> _M_f;
1856 template<
typename _CharT>
1857 struct formatter<chrono::year_month_weekday, _CharT>
1859 template<
typename _ParseContext>
1860 constexpr typename _ParseContext::iterator
1861 parse(_ParseContext& __pc)
1862 {
return _M_f._M_parse(__pc, __format::_Date); }
1864 template<
typename _FormatContext>
1865 typename _FormatContext::iterator
1866 format(
const chrono::year_month_weekday& __t,
1867 _FormatContext& __fc)
const
1868 {
return _M_f._M_format(__t, __fc); }
1871 __format::__formatter_chrono<_CharT> _M_f;
1874 template<
typename _CharT>
1875 struct formatter<chrono::year_month_weekday_last, _CharT>
1877 template<
typename _ParseContext>
1878 constexpr typename _ParseContext::iterator
1879 parse(_ParseContext& __pc)
1880 {
return _M_f._M_parse(__pc, __format::_Date); }
1882 template<
typename _FormatContext>
1883 typename _FormatContext::iterator
1884 format(
const chrono::year_month_weekday_last& __t,
1885 _FormatContext& __fc)
const
1886 {
return _M_f._M_format(__t, __fc); }
1889 __format::__formatter_chrono<_CharT> _M_f;
1892 template<
typename _Rep,
typename _Period,
typename _CharT>
1893 struct formatter<chrono::hh_mm_ss<chrono::duration<_Rep, _Period>>, _CharT>
1895 template<
typename _ParseContext>
1896 constexpr typename _ParseContext::iterator
1897 parse(_ParseContext& __pc)
1898 {
return _M_f._M_parse(__pc, __format::_TimeOfDay); }
1900 template<
typename _FormatContext>
1901 typename _FormatContext::iterator
1902 format(
const chrono::hh_mm_ss<chrono::duration<_Rep, _Period>>& __t,
1903 _FormatContext& __fc)
const
1904 {
return _M_f._M_format(__t, __fc); }
1907 __format::__formatter_chrono<_CharT> _M_f;
1910#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
1911 template<
typename _CharT>
1912 struct formatter<chrono::sys_info, _CharT>
1914 template<
typename _ParseContext>
1915 constexpr typename _ParseContext::iterator
1916 parse(_ParseContext& __pc)
1917 {
return _M_f._M_parse(__pc, __format::_ChronoParts{}); }
1919 template<
typename _FormatContext>
1920 typename _FormatContext::iterator
1921 format(
const chrono::sys_info& __i, _FormatContext& __fc)
const
1922 {
return _M_f._M_format(__i, __fc); }
1925 __format::__formatter_chrono<_CharT> _M_f;
1928 template<
typename _CharT>
1929 struct formatter<chrono::local_info, _CharT>
1931 template<
typename _ParseContext>
1932 constexpr typename _ParseContext::iterator
1933 parse(_ParseContext& __pc)
1934 {
return _M_f._M_parse(__pc, __format::_ChronoParts{}); }
1936 template<
typename _FormatContext>
1937 typename _FormatContext::iterator
1938 format(
const chrono::local_info& __i, _FormatContext& __fc)
const
1939 {
return _M_f._M_format(__i, __fc); }
1942 __format::__formatter_chrono<_CharT> _M_f;
1946 template<
typename _Duration,
typename _CharT>
1947 struct formatter<chrono::sys_time<_Duration>, _CharT>
1949 template<
typename _ParseContext>
1950 constexpr typename _ParseContext::iterator
1951 parse(_ParseContext& __pc)
1953 auto __next = _M_f._M_parse(__pc, __format::_ZonedDateTime);
1954 if constexpr (!__stream_insertable)
1955 if (_M_f._M_spec._M_chrono_specs.empty())
1956 __format::__invalid_chrono_spec();
1960 template<
typename _FormatContext>
1961 typename _FormatContext::iterator
1962 format(
const chrono::sys_time<_Duration>& __t,
1963 _FormatContext& __fc)
const
1964 {
return _M_f._M_format(__t, __fc); }
1967 static constexpr bool __stream_insertable
1968 =
requires (basic_ostream<_CharT>& __os,
1969 chrono::sys_time<_Duration> __t) { __os << __t; };
1971 __format::__formatter_chrono<_CharT> _M_f;
1974 template<
typename _Duration,
typename _CharT>
1975 struct formatter<chrono::utc_time<_Duration>, _CharT>
1976 : __format::__formatter_chrono<_CharT>
1978 template<
typename _ParseContext>
1979 constexpr typename _ParseContext::iterator
1980 parse(_ParseContext& __pc)
1981 {
return _M_f._M_parse(__pc, __format::_ZonedDateTime); }
1983 template<
typename _FormatContext>
1984 typename _FormatContext::iterator
1985 format(
const chrono::utc_time<_Duration>& __t,
1986 _FormatContext& __fc)
const
1991 using chrono::__detail::__utc_leap_second;
1993 using chrono::sys_time;
1994 using _CDur = common_type_t<_Duration, seconds>;
1995 const auto __li = chrono::get_leap_second_info(__t);
1996 sys_time<_CDur> __s{__t.time_since_epoch() - __li.elapsed};
1997 if (!__li.is_leap_second) [[likely]]
1998 return _M_f._M_format(__s, __fc);
2000 return _M_f._M_format(__utc_leap_second(__s), __fc);
2004 friend formatter<chrono::__detail::__utc_leap_second<_Duration>, _CharT>;
2006 __format::__formatter_chrono<_CharT> _M_f;
2009 template<
typename _Duration,
typename _CharT>
2010 struct formatter<chrono::tai_time<_Duration>, _CharT>
2011 : __format::__formatter_chrono<_CharT>
2013 template<
typename _ParseContext>
2014 constexpr typename _ParseContext::iterator
2015 parse(_ParseContext& __pc)
2016 {
return _M_f._M_parse(__pc, __format::_ZonedDateTime); }
2018 template<
typename _FormatContext>
2019 typename _FormatContext::iterator
2020 format(
const chrono::tai_time<_Duration>& __t,
2021 _FormatContext& __fc)
const
2027 using _CDur = common_type_t<_Duration, chrono::days>;
2028 chrono::local_time<_CDur> __lt(__t.time_since_epoch() - __tai_offset);
2029 const string __abbrev(
"TAI", 3);
2032 return _M_f._M_format(__lf, __fc);
2036 __format::__formatter_chrono<_CharT> _M_f;
2039 template<
typename _Duration,
typename _CharT>
2040 struct formatter<chrono::gps_time<_Duration>, _CharT>
2041 : __format::__formatter_chrono<_CharT>
2043 template<
typename _ParseContext>
2044 constexpr typename _ParseContext::iterator
2045 parse(_ParseContext& __pc)
2046 {
return _M_f._M_parse(__pc, __format::_ZonedDateTime); }
2048 template<
typename _FormatContext>
2049 typename _FormatContext::iterator
2050 format(
const chrono::gps_time<_Duration>& __t,
2051 _FormatContext& __fc)
const
2057 using _CDur = common_type_t<_Duration, chrono::days>;
2058 chrono::local_time<_CDur> __lt(__t.time_since_epoch() + __gps_offset);
2059 const string __abbrev(
"GPS", 3);
2062 return _M_f._M_format(__lf, __fc);
2066 __format::__formatter_chrono<_CharT> _M_f;
2069 template<
typename _Duration,
typename _CharT>
2070 struct formatter<chrono::file_time<_Duration>, _CharT>
2072 template<
typename _ParseContext>
2073 constexpr typename _ParseContext::iterator
2074 parse(_ParseContext& __pc)
2075 {
return _M_f._M_parse(__pc, __format::_ZonedDateTime); }
2077 template<
typename _FormatContext>
2078 typename _FormatContext::iterator
2079 format(
const chrono::file_time<_Duration>& __t,
2080 _FormatContext& __ctx)
const
2082 using namespace chrono;
2083 return _M_f._M_format(chrono::clock_cast<system_clock>(__t), __ctx);
2087 __format::__formatter_chrono<_CharT> _M_f;
2090 template<
typename _Duration,
typename _CharT>
2091 struct formatter<chrono::local_time<_Duration>, _CharT>
2093 template<
typename _ParseContext>
2094 constexpr typename _ParseContext::iterator
2095 parse(_ParseContext& __pc)
2096 {
return _M_f._M_parse(__pc, __format::_DateTime); }
2098 template<
typename _FormatContext>
2099 typename _FormatContext::iterator
2100 format(
const chrono::local_time<_Duration>& __t,
2101 _FormatContext& __ctx)
const
2102 {
return _M_f._M_format(__t, __ctx); }
2105 __format::__formatter_chrono<_CharT> _M_f;
2108 template<
typename _Duration,
typename _CharT>
2109 struct formatter<chrono::__detail::__local_time_fmt<_Duration>, _CharT>
2111 template<
typename _ParseContext>
2112 constexpr typename _ParseContext::iterator
2113 parse(_ParseContext& __pc)
2114 {
return _M_f._M_parse(__pc, __format::_ZonedDateTime); }
2116 template<
typename _FormatContext>
2117 typename _FormatContext::iterator
2118 format(
const chrono::__detail::__local_time_fmt<_Duration>& __t,
2119 _FormatContext& __ctx)
const
2120 {
return _M_f._M_format(__t, __ctx); }
2123 __format::__formatter_chrono<_CharT> _M_f;
2126#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
2127 template<
typename _Duration,
typename _TimeZonePtr,
typename _CharT>
2128 struct formatter<chrono::zoned_time<_Duration, _TimeZonePtr>, _CharT>
2129 : formatter<chrono::__detail::__local_time_fmt<_Duration>, _CharT>
2131 template<
typename _FormatContext>
2132 typename _FormatContext::iterator
2133 format(
const chrono::zoned_time<_Duration, _TimeZonePtr>& __tp,
2134 _FormatContext& __ctx)
const
2136 using chrono::__detail::__local_time_fmt;
2137 using _Base = formatter<__local_time_fmt<_Duration>, _CharT>;
2138 const chrono::sys_info __info = __tp.get_info();
2142 return _Base::format(__lf, __ctx);
2148 template<
typename _Duration,
typename _CharT>
2149 struct formatter<chrono::__detail::__utc_leap_second<_Duration>, _CharT>
2150 : formatter<chrono::utc_time<_Duration>, _CharT>
2152 template<
typename _FormatContext>
2153 typename _FormatContext::iterator
2154 format(
const chrono::__detail::__utc_leap_second<_Duration>& __t,
2156 {
return this->_M_f._M_format(__t,
__fc); }
2166 template<
typename _CharT,
typename _Traits,
typename _Rep,
typename _Period,
2167 typename _Alloc = allocator<_CharT>>
2168 basic_istream<_CharT, _Traits>&
2169 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
2170 duration<_Rep, _Period>& __d,
2171 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
2177 template<
typename _CharT,
typename _Traits>
2178 inline basic_ostream<_CharT, _Traits>&
2179 operator<<(basic_ostream<_CharT, _Traits>& __os,
const day& __d)
2181 using _Ctx = __conditional_t<is_same_v<_CharT, char>,
2182 format_context, wformat_context>;
2183 using _Str = basic_string_view<_CharT>;
2184 _Str __s = _GLIBCXX_WIDEN(
"{:02d} is not a valid day");
2186 __s = __s.substr(0, 6);
2187 auto __u = (unsigned)__d;
2188 __os << std::vformat(__s, make_format_args<_Ctx>(__u));
2194 template<
typename _CharT,
typename _Traits>
2195 inline basic_ostream<_CharT, _Traits>&
2196 operator<<(basic_ostream<_CharT, _Traits>& __os,
const month& __m)
2198 using _Ctx = __conditional_t<is_same_v<_CharT, char>,
2199 format_context, wformat_context>;
2200 using _Str = basic_string_view<_CharT>;
2201 _Str __s = _GLIBCXX_WIDEN(
"{:L%b}{} is not a valid month");
2204 make_format_args<_Ctx>(__m));
2207 auto __u = (unsigned)__m;
2208 __os <<
std::vformat(__s.substr(6), make_format_args<_Ctx>(__u));
2215 template<
typename _CharT,
typename _Traits>
2216 inline basic_ostream<_CharT, _Traits>&
2217 operator<<(basic_ostream<_CharT, _Traits>& __os,
const year& __y)
2219 using _Ctx = __conditional_t<is_same_v<_CharT, char>,
2220 format_context, wformat_context>;
2221 using _Str = basic_string_view<_CharT>;
2222 _Str __s = _GLIBCXX_WIDEN(
"-{:04d} is not a valid year");
2224 __s = __s.substr(0, 7);
2226 if (__i >= 0) [[likely]]
2227 __s.remove_prefix(1);
2230 __os << std::vformat(__s, make_format_args<_Ctx>(__i));
2236 template<
typename _CharT,
typename _Traits>
2237 inline basic_ostream<_CharT, _Traits>&
2238 operator<<(basic_ostream<_CharT, _Traits>& __os,
const weekday& __wd)
2240 using _Ctx = __conditional_t<is_same_v<_CharT, char>,
2241 format_context, wformat_context>;
2242 using _Str = basic_string_view<_CharT>;
2243 _Str __s = _GLIBCXX_WIDEN(
"{:L%a}{} is not a valid weekday");
2246 make_format_args<_Ctx>(__wd));
2249 auto __c = __wd.c_encoding();
2250 __os <<
std::vformat(__s.substr(6), make_format_args<_Ctx>(__c));
2257 template<
typename _CharT,
typename _Traits>
2258 inline basic_ostream<_CharT, _Traits>&
2259 operator<<(basic_ostream<_CharT, _Traits>& __os,
2260 const weekday_indexed& __wdi)
2265 basic_stringstream<_CharT> __os2;
2266 __os2.imbue(__os.getloc());
2267 __os2 << __wdi.weekday();
2268 const auto __i = __wdi.index();
2269 if constexpr (is_same_v<_CharT, char>)
2270 __os2 << std::format(
"[{}", __i);
2272 __os2 << std::format(L
"[{}", __i);
2273 basic_string_view<_CharT> __s = _GLIBCXX_WIDEN(
" is not a valid index]");
2274 if (__i >= 1 && __i <= 5)
2275 __os2 << __s.back();
2278 __os << __os2.view();
2282 template<
typename _CharT,
typename _Traits>
2283 inline basic_ostream<_CharT, _Traits>&
2284 operator<<(basic_ostream<_CharT, _Traits>& __os,
2285 const weekday_last& __wdl)
2288 basic_stringstream<_CharT> __os2;
2289 __os2.imbue(__os.getloc());
2290 __os2 << __wdl.weekday() << _GLIBCXX_WIDEN(
"[last]");
2291 __os << __os2.view();
2295 template<
typename _CharT,
typename _Traits>
2296 inline basic_ostream<_CharT, _Traits>&
2297 operator<<(basic_ostream<_CharT, _Traits>& __os,
const month_day& __md)
2300 basic_stringstream<_CharT> __os2;
2301 __os2.imbue(__os.getloc());
2302 __os2 << __md.month();
2303 if constexpr (is_same_v<_CharT, char>)
2307 __os2 << __md.day();
2308 __os << __os2.view();
2314 template<
typename _CharT,
typename _Traits>
2315 inline basic_ostream<_CharT, _Traits>&
2316 operator<<(basic_ostream<_CharT, _Traits>& __os,
2317 const month_day_last& __mdl)
2320 basic_stringstream<_CharT> __os2;
2321 __os2.imbue(__os.getloc());
2322 __os2 << __mdl.month();
2323 if constexpr (is_same_v<_CharT, char>)
2327 __os << __os2.view();
2331 template<
typename _CharT,
typename _Traits>
2332 inline basic_ostream<_CharT, _Traits>&
2333 operator<<(basic_ostream<_CharT, _Traits>& __os,
2334 const month_weekday& __mwd)
2337 basic_stringstream<_CharT> __os2;
2338 __os2.imbue(__os.getloc());
2339 __os2 << __mwd.month();
2340 if constexpr (is_same_v<_CharT, char>)
2344 __os2 << __mwd.weekday_indexed();
2345 __os << __os2.view();
2349 template<
typename _CharT,
typename _Traits>
2350 inline basic_ostream<_CharT, _Traits>&
2351 operator<<(basic_ostream<_CharT, _Traits>& __os,
2352 const month_weekday_last& __mwdl)
2355 basic_stringstream<_CharT> __os2;
2356 __os2.imbue(__os.getloc());
2357 __os2 << __mwdl.month();
2358 if constexpr (is_same_v<_CharT, char>)
2362 __os2 << __mwdl.weekday_last();
2363 __os << __os2.view();
2367 template<
typename _CharT,
typename _Traits>
2368 inline basic_ostream<_CharT, _Traits>&
2369 operator<<(basic_ostream<_CharT, _Traits>& __os,
const year_month& __ym)
2372 basic_stringstream<_CharT> __os2;
2373 __os2.imbue(__os.getloc());
2374 __os2 << __ym.year();
2375 if constexpr (is_same_v<_CharT, char>)
2379 __os2 << __ym.month();
2380 __os << __os2.view();
2386 template<
typename _CharT,
typename _Traits>
2387 inline basic_ostream<_CharT, _Traits>&
2388 operator<<(basic_ostream<_CharT, _Traits>& __os,
2389 const year_month_day& __ymd)
2391 using _Ctx = __conditional_t<is_same_v<_CharT, char>,
2392 format_context, wformat_context>;
2393 using _Str = basic_string_view<_CharT>;
2394 _Str __s = _GLIBCXX_WIDEN(
"{:%F} is not a valid date");
2395 __os <<
std::vformat(__ymd.ok() ? __s.substr(0, 5) : __s,
2396 make_format_args<_Ctx>(__ymd));
2402 template<
typename _CharT,
typename _Traits>
2403 inline basic_ostream<_CharT, _Traits>&
2404 operator<<(basic_ostream<_CharT, _Traits>& __os,
2405 const year_month_day_last& __ymdl)
2408 basic_stringstream<_CharT> __os2;
2409 __os2.imbue(__os.getloc());
2410 __os2 << __ymdl.year();
2411 if constexpr (is_same_v<_CharT, char>)
2415 __os2 << __ymdl.month_day_last();
2416 __os << __os2.view();
2420 template<
typename _CharT,
typename _Traits>
2421 inline basic_ostream<_CharT, _Traits>&
2422 operator<<(basic_ostream<_CharT, _Traits>& __os,
2423 const year_month_weekday& __ymwd)
2427 basic_stringstream<_CharT> __os2;
2428 __os2.imbue(__os.getloc());
2430 if constexpr (is_same_v<_CharT, char>)
2434 __os2 << __ymwd.year() << __slash << __ymwd.month() << __slash
2435 << __ymwd.weekday_indexed();
2436 __os << __os2.view();
2440 template<
typename _CharT,
typename _Traits>
2441 inline basic_ostream<_CharT, _Traits>&
2442 operator<<(basic_ostream<_CharT, _Traits>& __os,
2443 const year_month_weekday_last& __ymwdl)
2447 basic_stringstream<_CharT> __os2;
2448 __os2.imbue(__os.getloc());
2450 if constexpr (is_same_v<_CharT, char>)
2454 __os2 << __ymwdl.year() << __slash << __ymwdl.month() << __slash
2455 << __ymwdl.weekday_last();
2456 __os << __os2.view();
2460 template<
typename _CharT,
typename _Traits,
typename _Duration>
2461 inline basic_ostream<_CharT, _Traits>&
2462 operator<<(basic_ostream<_CharT, _Traits>& __os,
2463 const hh_mm_ss<_Duration>& __hms)
2465 return __os << format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%T}"), __hms);
2468#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
2470 template<
typename _CharT,
typename _Traits>
2471 basic_ostream<_CharT, _Traits>&
2472 operator<<(basic_ostream<_CharT, _Traits>& __os,
const sys_info& __i)
2474 __os <<
'[' << __i.begin <<
',' << __i.end
2475 <<
',' << hh_mm_ss(__i.offset) <<
',' << __i.save
2476 <<
',' << __i.abbrev <<
']';
2481 template<
typename _CharT,
typename _Traits>
2482 basic_ostream<_CharT, _Traits>&
2483 operator<<(basic_ostream<_CharT, _Traits>& __os,
const local_info& __li)
2486 if (__li.result == local_info::unique)
2490 if (__li.result == local_info::nonexistent)
2491 __os <<
"nonexistent";
2493 __os <<
"ambiguous";
2494 __os <<
" local time between " << __li.first;
2495 __os <<
" and " << __li.second;
2501 template<
typename _CharT,
typename _Traits,
typename _Duration,
2502 typename _TimeZonePtr>
2503 inline basic_ostream<_CharT, _Traits>&
2504 operator<<(basic_ostream<_CharT, _Traits>& __os,
2505 const zoned_time<_Duration, _TimeZonePtr>& __t)
2507 __os << format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T %Z}"), __t);
2512 template<
typename _CharT,
typename _Traits,
typename _Duration>
2513 requires (!treat_as_floating_point_v<typename _Duration::rep>)
2514 && ratio_less_v<typename _Duration::period, days::period>
2515 inline basic_ostream<_CharT, _Traits>&
2516 operator<<(basic_ostream<_CharT, _Traits>& __os,
2517 const sys_time<_Duration>& __tp)
2519 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __tp);
2523 template<
typename _CharT,
typename _Traits>
2524 inline basic_ostream<_CharT, _Traits>&
2525 operator<<(basic_ostream<_CharT, _Traits>& __os,
const sys_days& __dp)
2527 __os << year_month_day{__dp};
2533 template<
typename _CharT,
typename _Traits,
typename _Duration>
2534 inline basic_ostream<_CharT, _Traits>&
2535 operator<<(basic_ostream<_CharT, _Traits>& __os,
2536 const utc_time<_Duration>& __t)
2538 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
2544 template<
typename _CharT,
typename _Traits,
typename _Duration>
2545 inline basic_ostream<_CharT, _Traits>&
2546 operator<<(basic_ostream<_CharT, _Traits>& __os,
2547 const tai_time<_Duration>& __t)
2549 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
2555 template<
typename _CharT,
typename _Traits,
typename _Duration>
2556 inline basic_ostream<_CharT, _Traits>&
2557 operator<<(basic_ostream<_CharT, _Traits>& __os,
2558 const gps_time<_Duration>& __t)
2560 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
2567 template<
typename _CharT,
typename _Traits,
typename _Duration>
2568 inline basic_ostream<_CharT, _Traits>&
2569 operator<<(basic_ostream<_CharT, _Traits>& __os,
2570 const file_time<_Duration>& __t)
2572 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
2578 template<
typename _CharT,
typename _Traits,
typename _Duration>
2579 inline basic_ostream<_CharT, _Traits>&
2580 operator<<(basic_ostream<_CharT, _Traits>& __os,
2581 const local_time<_Duration>& __lt)
2583 __os << sys_time<_Duration>{__lt.time_since_epoch()};
2588#undef _GLIBCXX_WIDEN
2593_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 > seconds
seconds
duration< int64_t, ratio< 86400 > > days
days
basic_ostream< _CharT, _Traits > & operator<<(std::basic_ostream< _CharT, _Traits > &__os, const duration< _Rep, _Period > &__d)
duration< int64_t, ratio< 60 > > minutes
minutes
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
ISO C++ entities toplevel namespace is std.
constexpr bitset< _Nb > operator|(const bitset< _Nb > &__x, const bitset< _Nb > &__y) noexcept
Global bitwise operations on bitsets.
ISO C++ 2011 namespace for date and time utilities.
static constexpr bool is_signed
Container class for localization functionality.
static const locale & classic()
Return reference to the C locale.