30#ifndef _GLIBCXX_CHRONO_IO_H
31#define _GLIBCXX_CHRONO_IO_H 1
34#pragma GCC system_header
37#if __cplusplus >= 202002L
47namespace std _GLIBCXX_VISIBILITY(default)
49_GLIBCXX_BEGIN_NAMESPACE_VERSION
59#define _GLIBCXX_WIDEN_(C, S) ::std::__format::_Widen<C>(S, L##S)
60#define _GLIBCXX_WIDEN(S) _GLIBCXX_WIDEN_(_CharT, S)
62 template<
typename _Period,
typename _CharT>
64 __units_suffix()
noexcept
69#define _GLIBCXX_UNITS_SUFFIX(period, suffix) \
70 if constexpr (is_same_v<_Period, period>) \
71 return _GLIBCXX_WIDEN(suffix); \
74 _GLIBCXX_UNITS_SUFFIX(atto,
"as")
75 _GLIBCXX_UNITS_SUFFIX(femto,
"fs")
76 _GLIBCXX_UNITS_SUFFIX(pico,
"ps")
77 _GLIBCXX_UNITS_SUFFIX(nano,
"ns")
78 _GLIBCXX_UNITS_SUFFIX(milli,
"ms")
79#if _GLIBCXX_USE_ALT_MICROSECONDS_SUFFIX
82 _GLIBCXX_UNITS_SUFFIX(micro,
"\u00b5s")
84 _GLIBCXX_UNITS_SUFFIX(micro,
"us")
86 _GLIBCXX_UNITS_SUFFIX(centi,
"cs")
87 _GLIBCXX_UNITS_SUFFIX(deci,
"ds")
89 _GLIBCXX_UNITS_SUFFIX(deca,
"das")
90 _GLIBCXX_UNITS_SUFFIX(hecto,
"hs")
91 _GLIBCXX_UNITS_SUFFIX(kilo,
"ks")
92 _GLIBCXX_UNITS_SUFFIX(mega,
"Ms")
93 _GLIBCXX_UNITS_SUFFIX(giga,
"Gs")
94 _GLIBCXX_UNITS_SUFFIX(tera,
"Ts")
95 _GLIBCXX_UNITS_SUFFIX(tera,
"Ts")
96 _GLIBCXX_UNITS_SUFFIX(peta,
"Ps")
97 _GLIBCXX_UNITS_SUFFIX(exa,
"Es")
101#undef _GLIBCXX_UNITS_SUFFIX
105 template<
typename _Period,
typename _CharT,
typename _Out>
107 __fmt_units_suffix(_Out __out)
noexcept
109 if (
auto __s = __detail::__units_suffix<_Period, _CharT>(); __s.size())
110 return __format::__write(
std::move(__out), __s);
111 else if constexpr (_Period::den == 1)
112 return std::format_to(
std::move(__out), _GLIBCXX_WIDEN(
"[{}]s"),
113 (uintmax_t)_Period::num);
115 return std::format_to(
std::move(__out), _GLIBCXX_WIDEN(
"[{}/{}]s"),
116 (uintmax_t)_Period::num,
117 (uintmax_t)_Period::den);
126 template<
typename _CharT,
typename _Traits,
127 typename _Rep,
typename _Period>
133 using period =
typename _Period::type;
141 __detail::__fmt_units_suffix<period, _CharT>(_Out(__s));
151 template<
typename _Duration>
152 struct __local_time_fmt
154 local_time<_Duration> _M_time;
155 const string* _M_abbrev;
161 template<
typename _Duration>
162 using __local_time_fmt_for
163 = __local_time_fmt<common_type_t<_Duration, seconds>>;
176 template<
typename _Duration>
177 inline __detail::__local_time_fmt<_Duration>
179 const string* __abbrev =
nullptr,
180 const seconds* __offset_sec =
nullptr)
181 {
return {__time, __abbrev, __offset_sec}; }
189 [[noreturn,__gnu__::__always_inline__]]
191 __not_valid_for_duration()
192 { __throw_format_error(
"format error: chrono-format-spec not valid for "
193 "chrono::duration"); }
195 [[noreturn,__gnu__::__always_inline__]]
197 __invalid_chrono_spec()
198 { __throw_format_error(
"format error: chrono-format-spec not valid for "
204 enum class _ChronoParts :
unsigned short {
205 _None = 0, _TotalSeconds = 1u, _Subseconds = 1u << 2,
208 _EpochUnits = 1u << 3, _UnitSuffix = 1u << 4,
209 _EpochSeconds = _EpochUnits | _TotalSeconds,
212 _LocalDays = 1u << 5,
213 _LocalSeconds = _LocalDays | _TotalSeconds,
215 _Year = 1u << 6, _Month = 1u << 7, _Day = 1u << 8,
216 _Weekday = 1u << 9, _WeekdayIndex = 1u << 10, _DayOfYear = 1u << 11,
217 _IndexedWeekday = _Weekday | _WeekdayIndex,
218 _YearMonthDay = _Year | _Month | _Day,
219 _Date = _LocalDays | _YearMonthDay | _IndexedWeekday | _DayOfYear,
221 _HoursMinutesSeconds = 1u << 12,
222 _TimeOfDay = _HoursMinutesSeconds | _Subseconds,
223 _Time = _TimeOfDay | _TotalSeconds,
224 _EpochTime = _Time | _EpochUnits | _UnitSuffix,
225 _DateTime = _Date | _Time,
227 _ZoneAbbrev = 1u << 13, _ZoneOffset = 1u << 14,
228 _TimeZone = _ZoneAbbrev | _ZoneOffset,
229 _ZonedDateTime = _DateTime | _TimeZone,
232 [[__gnu__::__always_inline__]]
233 constexpr _ChronoParts
234 operator&(_ChronoParts __x, _ChronoParts __y)
noexcept
235 {
return static_cast<_ChronoParts
>((unsigned)__x & (unsigned)__y); }
237 [[__gnu__::__always_inline__]]
238 constexpr _ChronoParts&
239 operator&=(_ChronoParts& __x, _ChronoParts __y)
noexcept
240 {
return __x = __x & __y; }
242 [[__gnu__::__always_inline__]]
243 constexpr _ChronoParts
244 operator|(_ChronoParts __x, _ChronoParts __y)
noexcept
245 {
return static_cast<_ChronoParts
>((
unsigned short)__x | (
unsigned short)__y); }
247 [[__gnu__::__always_inline__]]
248 constexpr _ChronoParts&
249 operator|=(_ChronoParts& __x, _ChronoParts __y)
noexcept
250 {
return __x = __x | __y; }
253 [[__gnu__::__always_inline__]]
254 constexpr _ChronoParts
255 operator-(_ChronoParts __x, _ChronoParts __y)
noexcept
256 {
return static_cast<_ChronoParts
>((
unsigned short)__x & ~(
unsigned short)__y); }
259 [[__gnu__::__always_inline__]]
260 constexpr _ChronoParts&
261 operator-=(_ChronoParts& __x, _ChronoParts __y)
noexcept
262 {
return __x = __x - __y; }
264 [[__gnu__::__always_inline__]]
266 operator==(_ChronoParts __x,
decltype(
nullptr)) noexcept
267 {
return (
unsigned short)__x == 0; }
269 template<
typename _CharT>
270 struct _ChronoSpec : _Spec<_CharT>
281 unsigned _M_locale_specific : 1;
284 unsigned _M_needs_ok_check : 1;
286 unsigned _M_floating_point_rep : 1;
288 unsigned _M_custom_rep : 1;
289 unsigned _M_unused : 4;
292 _ChronoParts _M_needed;
293 basic_string_view<_CharT> _M_chrono_specs;
295 [[__gnu__::__always_inline__]]
297 _M_needs(_ChronoParts __parts)
const
298 {
return (_M_needed & __parts) != 0; }
301 template<
typename _CharT>
302 struct _ChronoFormats
304 using _String_view = basic_string_view<_CharT>;
309 {
return _GLIBCXX_WIDEN(
"%F %T %Z"); }
314 {
return _S_ftz().substr(0, 5); }
319 {
return _S_ftz().substr(0, 2); }
324 {
return _S_ftz().substr(3, 2); }
329 {
return _GLIBCXX_WIDEN(
"%Y/%b/%d"); }
334 {
return _S_ymd().substr(0, 5); }
339 {
return _S_ymd().substr(3); }
344 {
return _S_ymd().substr(0, 2); }
349 {
return _S_ymd().substr(3, 2); }
354 {
return _S_ymd().substr(6, 2); }
360 {
return _String_view(_GLIBCXX_WIDEN(
"%Y/%b/%a[%\0]"), 12); }
365 {
return _S_ymwi().substr(3); }
370 {
return _S_ymwi().substr(6); }
375 {
return _S_ymwi().substr(6, 2); }
380 {
return _GLIBCXX_WIDEN(
"%Y/%b/%a[last]"); }
385 {
return _S_ymwl().substr(3); }
390 {
return _S_ymwl().substr(6); }
395 {
return _GLIBCXX_WIDEN(
"%Y/%b/last"); }
400 {
return _S_yml().substr(3); }
403 template<
typename _CharT>
406 static constexpr unsigned _S_max_prec = 18;
407 using _Attoseconds = chrono::duration<__UINT_LEAST64_TYPE__, atto>;
410 = basic_format_context<_Sink_iter<_CharT>, _CharT>;
411 using _FormatArgs = basic_format_args<_FormatContext>;
412 static inline auto _S_args = std::make_format_args<_FormatContext>();
414 _ChronoData() =
default;
415 _ChronoData(_ChronoData&&) =
delete;
418 chrono::seconds _M_eseconds;
421 _Attoseconds _M_subseconds;
425 _FormatArgs _M_ereps = _S_args;
426 basic_string_view<_CharT> _M_unit_suffix;
429 chrono::local_seconds _M_lseconds;
430 chrono::local_days _M_ldays;
432 chrono::year _M_year;
433 chrono::month _M_month;
435 chrono::weekday _M_weekday;
436 unsigned char _M_weekday_index;
437 chrono::days _M_day_of_year;
440 chrono::hours _M_hours;
441 chrono::minutes _M_minutes;
442 chrono::seconds _M_seconds;
444 chrono::seconds _M_zone_offset;
445 basic_string_view<_CharT> _M_zone_abbrev;
446 const char* _M_zone_cstr =
"";
448 template<
typename _YearMonth>
449 [[__gnu__::__always_inline__]]
451 _M_fill_year_month(
const _YearMonth& __ym, _ChronoParts __parts)
453 _M_year = __ym.year();
454 __parts -= _ChronoParts::_Year;
455 _M_month = __ym.month();
456 __parts -= _ChronoParts::_Month;
460 [[__gnu__::__always_inline__]]
462 _M_fill_day(chrono::day __d, _ChronoParts __parts)
465 __parts -= _ChronoParts::_Day;
466 _M_weekday_index = ((unsigned)__d + 6u) / 7u;
467 __parts -= _ChronoParts::_WeekdayIndex;
471 [[__gnu__::__always_inline__]]
473 _M_fill_weekday(chrono::weekday_indexed __wi, _ChronoParts __parts)
475 _M_weekday = __wi.weekday();
476 __parts -= _ChronoParts::_Weekday;
477 _M_weekday_index = __wi.index();
478 __parts -= _ChronoParts::_WeekdayIndex;
483 [[__gnu__::__always_inline__]]
485 _M_fill_aux(chrono::local_days __ld, _ChronoParts __parts)
487 using namespace chrono;
488 if ((__parts & _ChronoParts::_Weekday) != 0)
489 _M_weekday = weekday(__ld);
490 __parts -= _ChronoParts::_Weekday;
491 if ((__parts & _ChronoParts::_DayOfYear) != 0)
494 _M_day_of_year = __ld - local_days(_M_year/January/0);
495 __parts -= _ChronoParts::_DayOfYear;
500 [[__gnu__::__always_inline__]]
502 _M_fill_ldays(chrono::local_days __ld, _ChronoParts __parts)
505 __parts -= _ChronoParts::_LocalDays;
506 return _M_fill_aux(__ld, __parts);
510 _M_fill_time(chrono::seconds __d)
512 chrono::hh_mm_ss<chrono::seconds> __hms(__d);
513 _M_hours = __hms.hours();
514 _M_minutes = __hms.minutes();
515 _M_seconds = __hms.seconds();
519 _M_fill_date_time(chrono::local_seconds __ls, _ChronoParts __parts)
521 _M_ldays = chrono::floor<chrono::days>(__ls);
522 __parts -= _ChronoParts::_LocalDays;
523 if ((__parts & _ChronoParts::_HoursMinutesSeconds) != 0)
524 _M_fill_time(_M_lseconds - _M_ldays);
526 if ((__parts & _ChronoParts::_Date) != 0)
528 const chrono::year_month_day __ymd(_M_ldays);
529 _M_fill_year_month(__ymd, __parts);
530 _M_fill_day(__ymd.day(), __parts);
531 _M_fill_aux(_M_ldays, __parts);
536 _M_fill_zone(
const char* __abbrev,
const wchar_t* __wabbrev)
538 if constexpr (is_same_v<_CharT, char>)
539 _M_zone_abbrev = __abbrev;
541 _M_zone_abbrev = __wabbrev;
542 _M_zone_cstr = __abbrev;
545 [[__gnu__::__always_inline__]]
548 { _M_fill_zone(
"UTC", L
"UTC"); }
552 template<
typename _CharT>
553 struct __formatter_chrono
555 using __string_view = basic_string_view<_CharT>;
556 using __string = basic_string<_CharT>;
558 __formatter_chrono() =
default;
561 __formatter_chrono(_ChronoSpec<_CharT> __spec) noexcept
565 constexpr typename basic_format_parse_context<_CharT>::iterator
566 _M_parse(basic_format_parse_context<_CharT>& __pc, _ChronoParts __parts,
567 const _ChronoSpec<_CharT>& __def)
569 auto __first = __pc.
begin();
570 auto __last = __pc.end();
572 _ChronoSpec<_CharT> __spec = __def;
574 auto __finalize = [
this, &__spec, &__def] {
575 using enum _ChronoParts;
576 _ChronoParts __checked
577 = __spec._M_debug ? _YearMonthDay|_IndexedWeekday
581 __spec._M_needs_ok_check
582 = __spec._M_needs(__def._M_needed & __checked);
586 auto __finished = [&] {
587 if (__first == __last || *__first ==
'}')
598 __first = __spec._M_parse_fill_and_align(__first, __last);
602 __first = __spec._M_parse_width(__first, __last, __pc);
608 if ((__parts & _ChronoParts::_EpochUnits) == 0
609 || !__spec._M_floating_point_rep)
610 __throw_format_error(
"format error: invalid precision for duration");
613 __first = _Spec<_CharT>()._M_parse_precision(__first, __last, __pc);
615 __spec._M_prec_kind = _WP_value;
620 __spec._M_localized =
false;
621 __first = __spec._M_parse_locale(__first, __last);
628 __string_view __str(__first, __last - __first);
629 auto __end = __str.find(
'}');
630 if (__end != __str.npos)
632 __str.remove_suffix(__str.length() - __end);
633 __last = __first + __end;
635 if (__str.find(
'{') != __str.npos)
636 __throw_format_error(
"chrono format error: '{' in chrono-specs");
642 __spec._M_debug =
false;
643 __spec._M_locale_specific =
false;
644 __spec._M_needed = _ChronoParts::_None;
645 __spec._M_chrono_specs = __string_view();
647 const auto __chrono_specs = __first++;
648 if (*__chrono_specs !=
'%')
649 __throw_format_error(
"chrono format error: no '%' at start of "
654 while (__first != __last)
656 enum _Mods { _Mod_none, _Mod_E, _Mod_O, _Mod_E_O };
657 _Mods __allowed_mods = _Mod_none;
659 _ChronoParts __needed = _ChronoParts::_None;
660 bool __locale_specific =
false;
662 _CharT __c = *__first++;
665 using enum _ChronoParts;
669 __locale_specific =
true;
675 __locale_specific =
true;
678 __needed = _Date|_HoursMinutesSeconds;
679 __allowed_mods = _Mod_E;
680 __locale_specific =
true;
684 __allowed_mods = _Mod_E;
689 __allowed_mods = _Mod_O;
693 __needed = _YearMonthDay;
698 __needed = _LocalDays|_Year|_DayOfYear|_Weekday;
702 __needed = _HoursMinutesSeconds;
703 __allowed_mods = _Mod_O;
706 __needed = __parts & _DayOfYear;
709 if (__needed == _None)
710 __needed = _HoursMinutesSeconds;
714 __allowed_mods = _Mod_O;
717 __needed = _HoursMinutesSeconds;
718 __allowed_mods = _Mod_O;
722 __locale_specific =
true;
725 __needed = _HoursMinutesSeconds;
728 __needed = _TimeOfDay;
731 __needed = _UnitSuffix;
734 __needed = _EpochUnits;
737 __needed = _TimeOfDay;
738 __allowed_mods = _Mod_O;
743 __allowed_mods = _Mod_O;
747 __needed = _DayOfYear|_Weekday;
748 __allowed_mods = _Mod_O;
752 __locale_specific =
true;
753 __allowed_mods = _Mod_E;
756 __needed = _HoursMinutesSeconds;
757 __locale_specific =
true;
758 __allowed_mods = _Mod_E;
762 __allowed_mods = _Mod_E_O;
766 __allowed_mods = _Mod_E;
769 __needed = _ZoneOffset;
770 __allowed_mods = _Mod_E_O;
773 __needed = _ZoneAbbrev;
781 if (__mod) [[unlikely]]
783 __allowed_mods = _Mod_none;
789 __throw_format_error(
"chrono format error: invalid specifier "
793 if ((__mod ==
'E' && !(__allowed_mods & _Mod_E))
794 || (__mod ==
'O' && !(__allowed_mods & _Mod_O)))
795 __throw_format_error(
"chrono format error: invalid modifier "
797 if (__mod && __c !=
'z')
798 __locale_specific =
true;
802 if (__locale_specific)
803 __needed -= _ChronoParts::_Subseconds;
805 if ((__parts & __needed) != __needed)
806 __throw_format_error(
"chrono format error: format argument does "
807 "not contain the information required by the "
809 __spec._M_needed |= __needed;
810 __spec._M_locale_specific |= __locale_specific;
813 size_t __pos = __string_view(__first, __last - __first).find(
'%');
818 if (__pos == __string_view::npos)
824 __first += __pos + 1;
829 if (__conv || __mod != _CharT())
830 __throw_format_error(
"chrono format error: unescaped '%' in "
833 __spec._M_chrono_specs
834 = __string_view(__chrono_specs, __first - __chrono_specs);
841 template<
typename _FormatContext>
842 typename _FormatContext::iterator
843 _M_format(
const _ChronoData<_CharT>& __t, _FormatContext& __fc)
const
845#if defined _GLIBCXX_USE_NL_LANGINFO_L && __CHAR_BIT__ == 8
849 if constexpr (is_same_v<_CharT, char>)
850 if constexpr (__unicode::__literal_encoding_is_utf8())
851 if (_M_spec._M_localized && _M_spec._M_locale_specific)
853 extern locale __with_encoding_conversion(
const locale&);
857 locale __loc = __fc.locale();
858 if (__loc != locale::classic())
859 __fc._M_loc = __with_encoding_conversion(__loc);
863 const size_t __padwidth = _M_spec._M_get_width(__fc);
865 return _M_format_to(__t, __fc.out(), __fc);
867 using _Out =
typename _FormatContext::iterator;
868 _Padding_sink<_Out, _CharT> __sink(__fc.out(), __padwidth);
869 _M_format_to(__t, __sink.out(), __fc);
870 return __sink._M_finish(_M_spec._M_align, _M_spec._M_fill);
873 _ChronoSpec<_CharT> _M_spec;
876 static constexpr const _CharT* _S_chars
877 = _GLIBCXX_WIDEN(
"0123456789.Lf:/ +-{}");
878 static constexpr _CharT _S_dot = _S_chars[10];
879 static constexpr _CharT _S_colon = _S_chars[13];
880 static constexpr _CharT _S_slash = _S_chars[14];
881 static constexpr _CharT _S_space = _S_chars[15];
882 static constexpr const _CharT* _S_fp_fmt = _S_chars + 11;
883 static constexpr const _CharT* _S_plus_minus = _S_chars + 16;
884 static constexpr const _CharT* _S_minus_empty_spec = _S_chars + 17;
885 static constexpr const _CharT* _S_empty_spec = _S_chars + 18;
887 [[__gnu__::__always_inline__]]
888 static _Runtime_format_string<_CharT>
890 {
return _Runtime_format_string<_CharT>(_S_empty_spec); }
892 static constexpr const _CharT* _S_weekdays[]
894 _GLIBCXX_WIDEN(
"Sunday"),
895 _GLIBCXX_WIDEN(
"Monday"),
896 _GLIBCXX_WIDEN(
"Tuesday"),
897 _GLIBCXX_WIDEN(
"Wednesday"),
898 _GLIBCXX_WIDEN(
"Thursday"),
899 _GLIBCXX_WIDEN(
"Friday"),
900 _GLIBCXX_WIDEN(
"Saturday"),
903 static constexpr const _CharT* _S_months[]
905 _GLIBCXX_WIDEN(
"January"),
906 _GLIBCXX_WIDEN(
"February"),
907 _GLIBCXX_WIDEN(
"March"),
908 _GLIBCXX_WIDEN(
"April"),
909 _GLIBCXX_WIDEN(
"May"),
910 _GLIBCXX_WIDEN(
"June"),
911 _GLIBCXX_WIDEN(
"July"),
912 _GLIBCXX_WIDEN(
"August"),
913 _GLIBCXX_WIDEN(
"September"),
914 _GLIBCXX_WIDEN(
"October"),
915 _GLIBCXX_WIDEN(
"November"),
916 _GLIBCXX_WIDEN(
"December"),
920 template<
typename _OutIter>
922 _M_write(_OutIter __out,
const locale& __loc, __string_view __s)
const
924#if defined _GLIBCXX_USE_NL_LANGINFO_L && __CHAR_BIT__ == 8
929 if constexpr (is_same_v<_CharT, char>)
930 if constexpr (__unicode::__literal_encoding_is_utf8())
931 if (_M_spec._M_localized && _M_spec._M_locale_specific
932 && __loc != locale::classic())
935 __locale_encoding_to_utf8(
const locale&, string_view,
void*);
937 __s = __locale_encoding_to_utf8(__loc, __s, &__buf);
940 return __format::__write(
std::move(__out), __s);
943 [[__gnu__::__always_inline__]]
945 _S_localized_spec(_CharT __conv, _CharT __mod)
969 template<
typename _Iter>
971 _M_locale_fmt(_Iter __out,
const locale& __loc,
const struct tm& __tm,
972 char __fmt,
char __mod)
const
974 basic_ostringstream<_CharT> __os;
976 const auto& __tp = use_facet<time_put<_CharT>>(__loc);
977 __tp.put(__os, __os, _S_space, &__tm, __fmt, __mod);
979 __out = _M_write(
std::move(__out), __loc, __os.view());
984 _M_check_ok(
const _ChronoData<_CharT>& __t, _CharT& __conv)
const
986 if (!_M_spec._M_debug)
992 if (!__t._M_weekday.ok()) [[unlikely]]
993 __throw_format_error(
"format error: invalid weekday");
998 if (!__t._M_month.ok()) [[unlikely]]
999 __throw_format_error(
"format error: invalid month");
1004 return __string_view();
1011 if (__t._M_weekday_index < 1 || __t._M_weekday_index > 5) [[unlikely]]
1012 return _GLIBCXX_WIDEN(
"index");
1016 if (!__t._M_weekday.ok()) [[unlikely]]
1019 return _GLIBCXX_WIDEN(
"weekday");
1025 if (!__t._M_month.ok()) [[unlikely]]
1028 return _GLIBCXX_WIDEN(
"month");
1033 if (!__t._M_day.ok()) [[unlikely]]
1034 return _GLIBCXX_WIDEN(
"day");
1037 if (!(__t._M_year/__t._M_month/__t._M_day).ok()) [[unlikely]]
1038 return _GLIBCXX_WIDEN(
"date");
1041 if (!__t._M_year.ok()) [[unlikely]]
1042 return _GLIBCXX_WIDEN(
"year");
1047 return __string_view();
1050 template<
typename _OutIter,
typename _FormatContext>
1052 _M_format_to(
const _ChronoData<_CharT>& __t, _OutIter __out,
1053 _FormatContext& __fc)
const
1055 auto __first = _M_spec._M_chrono_specs.begin();
1056 const auto __last = _M_spec._M_chrono_specs.end();
1058 auto __print_sign = [__is_neg = __t._M_is_neg, &__out] ()
mutable {
1061 *__out++ = _S_plus_minus[1];
1068 bool __use_locale_fmt =
false;
1069 if (_M_spec._M_localized && _M_spec._M_locale_specific)
1070 if (__fc.locale() != locale::classic())
1072 __use_locale_fmt =
true;
1074 __tm.tm_year = (int)__t._M_year - 1900;
1075 __tm.tm_yday = __t._M_day_of_year.count();
1076 __tm.tm_mon = (unsigned)__t._M_month - 1;
1077 __tm.tm_mday = (unsigned)__t._M_day;
1078 __tm.tm_wday = __t._M_weekday.c_encoding();
1079 __tm.tm_hour = __t._M_hours.count();
1080 __tm.tm_min = __t._M_minutes.count();
1081 __tm.tm_sec = __t._M_seconds.count();
1089#ifdef _GLIBCXX_USE_STRUCT_TM_TM_ZONE
1092 if (__t._M_zone_cstr)
1093 __tm.tm_zone =
const_cast<char*
>(__t._M_zone_cstr);
1098 constexpr const _CharT* __literals = _GLIBCXX_WIDEN(
"\n\t%");
1105 _CharT __c = *__first++;
1106 __string_view __invalid;
1107 if (_M_spec._M_needs_ok_check)
1108 __invalid = _M_check_ok(__t, __c);
1110 if (__invalid.empty() &&__use_locale_fmt
1111 && _S_localized_spec(__c, __mod)) [[unlikely]]
1112 __out = _M_locale_fmt(
std::move(__out), __fc.locale(),
1118 __out = _M_wi(__t._M_weekday_index,
std::move(__out));
1122 __out = _M_a_A(__t._M_weekday,
std::move(__out), __c ==
'A');
1127 __out = _M_b_B(__t._M_month,
std::move(__out), __c ==
'B');
1135 __out = _M_C_y_Y(__t._M_year,
std::move(__out), __c);
1139 __out = _M_d_e(__t._M_day,
std::move(__out), __c);
1151 __out = _M_g_G_V(__t,
std::move(__out), __c);
1155 __out = _M_H_I(__t._M_hours, __print_sign(), __c);
1158 __out = _M_j(__t, __print_sign());
1161 __out = _M_m(__t._M_month,
std::move(__out));
1164 __out = _M_M(__t._M_minutes, __print_sign());
1167 __out = _M_p(__t._M_hours,
std::move(__out));
1170 __out = _M_q(__t._M_unit_suffix,
std::move(__out));
1173 __out = _M_Q(__t, __print_sign(), __fc);
1176 __out = _M_r(__t, __print_sign());
1180 __out = _M_R_X(__t, __print_sign(), __c !=
'R');
1183 __out = _M_T(__t, __print_sign(), __fc);
1186 __out = _M_S(__t, __print_sign(), __fc, __mod !=
'O');
1190 __out = _M_u_w(__t._M_weekday,
std::move(__out), __c);
1194 __out = _M_U_W(__t,
std::move(__out), __c);
1197 __out = _M_z(__t._M_zone_offset,
std::move(__out), (
bool)__mod);
1200 __out = _M_Z(__t._M_zone_abbrev,
std::move(__out));
1203 *__out++ = __literals[0];
1206 *__out++ = __literals[1];
1209 *__out++ = __literals[2];
1220 if (!__invalid.empty())
1222 constexpr __string_view __pref = _GLIBCXX_WIDEN(
" is not a valid ");
1223 __out = __format::__write(
std::move(__out), __pref);
1224 __out = __format::__write(
std::move(__out), __invalid);
1229 __string_view __str(__first, __last - __first);
1230 size_t __pos = __str.find(
'%');
1235 if (__pos == __str.npos)
1239 __str.remove_suffix(__str.length() - __pos);
1240 __first += __pos + 1;
1242 __out = __format::__write(
std::move(__out), __str);
1245 while (__first != __last);
1249 template<
typename _OutIter>
1251 _M_wi(
unsigned __wi, _OutIter __out)
const
1255 __out = __format::__write(
std::move(__out), _S_str_d1(__buf, __wi));
1259 template<
typename _OutIter>
1261 _M_a_A(chrono::weekday __wd, _OutIter __out,
bool __full)
const
1265 __string_view __str = _S_weekdays[__wd.c_encoding()];
1267 __str = __str.substr(0, 3);
1268 return __format::__write(
std::move(__out), __str);
1271 template<
typename _OutIter>
1273 _M_b_B(chrono::month __m, _OutIter __out,
bool __full)
const
1277 __string_view __str = _S_months[(unsigned)__m - 1];
1279 __str = __str.substr(0, 3);
1280 return __format::__write(
std::move(__out), __str);
1283 template<
typename _OutIter>
1285 _M_c(
const _ChronoData<_CharT>& __t, _OutIter __out)
const
1290 __out = _M_a_A(__t._M_weekday,
std::move(__out),
false);
1292 __out = _M_b_B(__t._M_month,
std::move(++__out),
false);
1294 __out = _M_d_e(__t._M_day,
std::move(++__out),
'e');
1296 __out = _M_R_X(__t,
std::move(++__out),
true);
1298 return _M_C_y_Y(__t._M_year,
std::move(++__out),
'Y');
1301 template<
typename _OutIter>
1303 _M_C_y_Y(chrono::year __y, _OutIter __out, _CharT __conv)
const
1313 int __yi = (int)__y;
1314 const bool __is_neg = __yi < 0;
1315 __yi = __builtin_abs(__yi);
1316 int __ci = __yi / 100;
1318 if (__conv ==
'C' && __is_neg && (__ci * 100) != __yi) [[unlikely]]
1321 if (__conv !=
'y' && __ci >= 100) [[unlikely]]
1323 using _FmtStr = _Runtime_format_string<_CharT>;
1324 __string_view __fs = _S_minus_empty_spec + !__is_neg;
1325 __out = std::format_to(
std::move(__out), _FmtStr(__fs),
1326 __conv ==
'C' ? __ci : __yi);
1331 __buf[0] = _S_plus_minus[1];
1332 __string_view __sv(__buf + 3, __buf + 3);
1335 _S_fill_two_digits(__buf + 1, __ci);
1336 __sv = __string_view(__buf + !__is_neg, __buf + 3);
1340 _S_fill_two_digits(__buf + 3, __yi % 100);
1341 __sv = __string_view(__sv.data(), __buf + 5);
1343 __out = __format::__write(
std::move(__out), __sv);
1348 template<
typename _OutIter>
1350 _M_D_x(
const _ChronoData<_CharT>& __t, _OutIter __out)
const
1356 auto __di = (unsigned)__t._M_day;
1357 auto __mi = (unsigned)__t._M_month;
1358 auto __yi = __builtin_abs((
int)__t._M_year) % 100;
1360 if (__mi >= 100 || __di >= 100) [[unlikely]]
1362 using _FmtStr = _Runtime_format_string<_CharT>;
1363 __string_view __fs = _GLIBCXX_WIDEN(
"{:02d}/{:02d}/{:02d}");
1364 __out = std::format_to(
std::move(__out), _FmtStr(__fs),
1370 __buf[2] = _S_slash;
1371 __buf[5] = _S_slash;
1372 __string_view __sv(__buf, __buf + 8);
1374 _S_fill_two_digits(__buf, __mi);
1375 _S_fill_two_digits(__buf + 3, __di);
1376 _S_fill_two_digits(__buf + 6, __yi);
1377 __out = __format::__write(
std::move(__out), __sv);
1382 template<
typename _OutIter>
1384 _M_d_e(chrono::day __d, _OutIter __out, _CharT __conv)
const
1391 unsigned __i = (unsigned)__d;
1394 auto __sv = _S_str_d2(__buf, __i);
1395 if (__conv == _CharT(
'e') && __i < 10)
1398 __buf[0] = _S_space;
1402 __out = __format::__write(
std::move(__out), __sv);
1406 template<
typename _OutIter>
1408 _M_F(
const _ChronoData<_CharT>& __t, _OutIter __out)
const
1410 auto __di = (unsigned)__t._M_day;
1411 auto __mi = (unsigned)__t._M_month;
1412 auto __yi = (int)__t._M_year;
1413 const bool __is_neg = __yi < 0;
1414 __yi = __builtin_abs(__yi);
1416 if (__yi >= 10000 || __mi >= 100 || __di >= 100) [[unlikely]]
1418 using _FmtStr = _Runtime_format_string<_CharT>;
1420 = _GLIBCXX_WIDEN(
"-{:04d}-{:02d}-{:02d}") + !__is_neg;
1421 __out = std::format_to(
std::move(__out), _FmtStr(__fs),
1427 __buf[0] = _S_plus_minus[1];
1428 __buf[5] = _S_plus_minus[1];
1429 __buf[8] = _S_plus_minus[1];
1430 __string_view __sv(__buf + !__is_neg, __buf + 11);
1432 _S_fill_two_digits(__buf + 1, __yi / 100);
1433 _S_fill_two_digits(__buf + 3, __yi % 100);
1434 _S_fill_two_digits(__buf + 6, __mi);
1435 _S_fill_two_digits(__buf + 9, __di);
1436 __out = __format::__write(
std::move(__out), __sv);
1442 template<
typename _OutIter>
1444 _M_g_G_V(
const _ChronoData<_CharT>& __t, _OutIter __out,
1445 _CharT __conv)
const
1456 using namespace chrono;
1458 const days __offset = (__t._M_weekday - Monday) -
days(3);
1460 const local_days __ild = __t._M_ldays - __offset;
1462 days __idoy = __t._M_day_of_year - __offset;
1466 if (__idoy <=
days(0))
1467 __iyear = __t._M_year -
years(1);
1468 else if (__idoy <=
days(365))
1469 __iyear = __t._M_year;
1470 else if (__idoy ==
days(366) && __t._M_year.is_leap())
1471 __iyear = __t._M_year;
1472 else if (__idoy <=
days(730))
1473 __iyear = __t._M_year +
years(1);
1475 __iyear = year_month_day(__ild).year();
1478 return _M_C_y_Y(__iyear,
std::move(__out),
"yY"[__conv ==
'G']);
1480 if (__iyear != __t._M_year)
1481 __idoy = __ild - local_days(__iyear/January/0);
1483 const auto __wi = chrono::floor<weeks>(__idoy -
days(1)).count() + 1;
1484 return __format::__write(
std::move(__out), _S_two_digits(__wi));
1487 template<
typename _OutIter>
1489 _M_H_I(chrono::hours __h, _OutIter __out, _CharT __conv)
const
1496 int __i = __h.count();
1498 if (__conv == _CharT(
'I'))
1504 else if (__i >= 100) [[unlikely]]
1505 return std::format_to(
std::move(__out), _S_empty_fs(), __i);
1507 return __format::__write(
std::move(__out), _S_two_digits(__i));
1510 template<
typename _OutIter>
1512 _M_j(
const _ChronoData<_CharT>& __t, _OutIter __out)
const
1514 if (!_M_spec._M_needs(_ChronoParts::_DayOfYear))
1517 auto __d = chrono::floor<chrono::days>(__t._M_hours).count();
1518 return std::format_to(
std::move(__out), _S_empty_fs(), __d);
1521 auto __d = __t._M_day_of_year.count();
1522 if (__d >= 1000) [[unlikely]]
1523 return std::format_to(
std::move(__out), _S_empty_fs(), __d);
1526 return __format::__write(
std::move(__out), _S_str_d3(__buf, __d));
1529 template<
typename _OutIter>
1531 _M_m(chrono::month __m, _OutIter __out)
const
1535 auto __i = (unsigned)__m;
1536 if (__i == 0 && _M_spec._M_debug) [[unlikely]]
1538 return __format::__write(
std::move(__out), _S_digit(0));
1541 return __format::__write(
std::move(__out), _S_str_d2(__buf, __i));
1544 template<
typename _OutIter>
1546 _M_M(chrono::minutes __m, _OutIter __out)
const
1551 auto __i = __m.count();
1552 return __format::__write(
std::move(__out), _S_two_digits(__i));
1555 template<
typename _OutIter>
1557 _M_p(chrono::hours __h, _OutIter __out)
const
1562 _S_fill_ampm(__buf, __h);
1563 return __format::__write(
std::move(__out), __string_view(__buf, 2));
1566 template<
typename _OutIter>
1568 _M_q(__string_view __us, _OutIter __out)
const
1571 return __format::__write(
std::move(__out), __us);
1574 template<
typename _OutIter,
typename _FormatContext>
1576 _M_Q(
const _ChronoData<_CharT>& __t, _OutIter __out,
1577 _FormatContext&)
const
1580 return std::vformat_to(
std::move(__out), _S_empty_spec, __t._M_ereps);
1583 template<
typename _OutIter>
1585 _M_r(
const _ChronoData<_CharT>& __t, _OutIter __out)
const
1588 auto __hi = __t._M_hours.count() % 12;
1593 __buf[2] = _S_colon;
1594 __buf[5] = _S_colon;
1595 __buf[8] = _S_space;
1596 _S_fill_two_digits(__buf, __hi);
1597 _S_fill_two_digits(__buf + 3, __t._M_minutes.count());
1598 _S_fill_two_digits(__buf + 6, __t._M_seconds.count());
1599 _S_fill_ampm(__buf + 9, __t._M_hours);
1601 return __format::__write(
std::move(__out), __string_view(__buf, 11));
1604 template<
typename _OutIter>
1606 _M_R_X(
const _ChronoData<_CharT>& __t, _OutIter __out,
1613 auto __hi = __t._M_hours.count();
1616 __buf[2] = _S_colon;
1617 __buf[5] = _S_colon;
1618 __string_view __sv(__buf, 8);
1620 if (__hi >= 100) [[unlikely]]
1622 __out = std::format_to(
std::move(__out), _S_empty_fs(), __hi);
1623 __sv.remove_prefix(2);
1626 _S_fill_two_digits(__buf, __hi);
1628 _S_fill_two_digits(__buf + 3, __t._M_minutes.count());
1630 _S_fill_two_digits(__buf + 6, __t._M_seconds.count());
1632 __sv.remove_suffix(3);
1634 return __format::__write(
std::move(__out), __sv);
1637 template<
typename _OutIter,
typename _FormatContext>
1639 _M_S(
const _ChronoData<_CharT>& __t, _OutIter __out,
1640 _FormatContext& __ctx,
bool __subs =
true)
const
1644 auto __s = __t._M_seconds;
1646 __out = __format::__write(
std::move(__out),
1647 _S_two_digits(__s.count()));
1649 __out = _M_subsecs(__t,
std::move(__out), __ctx);
1653 template<
typename _OutIter,
typename _FormatContext>
1655 _M_subsecs(
const _ChronoData<_CharT>& __t, _OutIter __out,
1656 _FormatContext& __ctx)
const
1658 unsigned __prec = _M_spec._M_prec_kind != _WP_none
1659 ? _M_spec._M_get_precision(__ctx)
1664 _CharT __dot = _S_dot;
1665 if (_M_spec._M_localized) [[unlikely]]
1667 auto __loc = __ctx.locale();
1668 const auto& __np = use_facet<numpunct<_CharT>>(__loc);
1669 __dot = __np.decimal_point();
1674 if (_M_spec._M_floating_point_rep)
1676 _Str_sink<_CharT> __sink;
1677 if (_M_spec._M_localized && _M_spec._M_custom_rep) [[unlikely]]
1678 std::vformat_to(__sink.out(), __ctx.locale(),
1679 _GLIBCXX_WIDEN(
"{1:0.{2}Lf}"), __t._M_ereps);
1681 std::vformat_to(__sink.out(),
1682 _GLIBCXX_WIDEN(
"{1:0.{2}f}"), __t._M_ereps);
1684 auto __sv = __sink.view();
1686 __sv.remove_prefix(2);
1687 return __format::__write(
std::move(__out), __sv);
1690 constexpr unsigned __max_prec = _ChronoData<_CharT>::_S_max_prec;
1691 constexpr typename _ChronoData<_CharT>::_Attoseconds::rep __pow10t[]
1695 10'000u, 100'000u, 1000'000u,
1696 10'000'000u, 100'000'000u, 1000'000'000u,
1697 10'000'000'000u, 100'000'000'000u, 1000'000'000'000u,
1698 10'000'000'000'000u, 100'000'000'000'000u, 1000'000'000'000'000u,
1699 10'000'000'000'000'000u, 100'000'000'000'000'000u, 1000'000'000'000'000'000u,
1702 auto __subs = __t._M_subseconds.count();
1703 if (__prec < __max_prec)
1704 __subs /= __pow10t[__max_prec - __prec];
1705 else if (__prec > __max_prec)
1706 __prec = __max_prec;
1708 using _FmtStr = _Runtime_format_string<_CharT>;
1709 return std::format_to(__out, _FmtStr(_GLIBCXX_WIDEN(
"{0:0{1}}")),
1715 template<
typename _OutIter,
typename _FormatContext>
1717 _M_T(
const _ChronoData<_CharT>& __t, _OutIter __out,
1718 _FormatContext& __ctx)
const
1721 __out = _M_R_X(__t,
std::move(__out),
true);
1722 return _M_subsecs(__t,
std::move(__out), __ctx);
1725 template<
typename _OutIter>
1727 _M_u_w(chrono::weekday __wd, _OutIter __out, _CharT __conv)
const
1733 unsigned __wdi = __conv ==
'u' ? __wd.iso_encoding()
1734 : __wd.c_encoding();
1736 return __format::__write(
std::move(__out), _S_str_d1(__buf, __wdi));
1739 template<
typename _OutIter>
1741 _M_U_W(
const _ChronoData<_CharT>& __t, _OutIter __out,
1742 _CharT __conv)
const
1749 using namespace chrono;
1750 const weekday __weekstart = __conv ==
'U' ? Sunday : Monday;
1751 const days __offset = __t._M_weekday - __weekstart;
1752 auto __weeks = chrono::floor<weeks>(__t._M_day_of_year - __offset -
days(1));
1753 return __format::__write(
std::move(__out), _S_two_digits(__weeks.count() + 1));
1756 template<
typename _OutIter>
1758 _M_z(chrono::seconds __ts, _OutIter __out,
bool __mod =
false)
const
1762 __string_view __zero
1763 = __mod ? _GLIBCXX_WIDEN(
"+00:00") : _GLIBCXX_WIDEN(
"+0000");
1764 return __format::__write(
std::move(__out), __zero);
1767 chrono::hh_mm_ss<chrono::seconds> __hms(__ts);
1768 unsigned __mo = 3 + __mod;
1771 __buf[0] = _S_plus_minus[__hms.is_negative()];
1772 __buf[3] = _S_colon;
1773 _S_fill_two_digits(__buf + 1, __hms.hours().count());
1774 _S_fill_two_digits(__buf + __mo, __hms.minutes().count());
1776 __string_view __sv(__buf, __mo + 2);
1777 return __format::__write(
std::move(__out), __sv);
1780 template<
typename _OutIter>
1782 _M_Z(__string_view __abbrev, _OutIter __out)
const
1783 {
return __format::__write(
std::move(__out), __abbrev); }
1788 static basic_string_view<_CharT>
1789 _S_digit(
int __n)
noexcept
1792 return { _GLIBCXX_WIDEN(
"0123456789999999") + (__n & 0xf), 1 };
1796 static basic_string_view<_CharT>
1797 _S_two_digits(
int __n)
noexcept
1800 _GLIBCXX_WIDEN(
"0001020304050607080910111213141516171819"
1801 "2021222324252627282930313233343536373839"
1802 "4041424344454647484950515253545556575859"
1803 "6061626364656667686970717273747576777879"
1804 "8081828384858687888990919293949596979899"
1805 "9999999999999999999999999999999999999999"
1806 "9999999999999999") + 2 * (__n & 0x7f),
1812 [[__gnu__::__always_inline__]]
1814 _S_fill_two_digits(_CharT* __buf,
unsigned __n)
1816 auto __sv = _S_two_digits(__n);
1822 [[__gnu__::__always_inline__]]
1824 _S_fill_ampm(_CharT* __buf, chrono::hours __h)
1826 auto __hi = __h.count();
1827 if (__hi >= 24) [[unlikely]]
1830 constexpr const _CharT* __apm = _GLIBCXX_WIDEN(
"APM");
1831 __buf[0] = __apm[__hi >= 12];
1832 __buf[1] = __apm[2];
1837 [[__gnu__::__always_inline__]]
1838 static basic_string_view<_CharT>
1839 _S_str_d1(span<_CharT, 3> __buf,
unsigned __n)
1841 if (__n < 10) [[likely]]
1842 return _S_digit(__n);
1843 return _S_str_d2(__buf, __n);
1848 [[__gnu__::__always_inline__]]
1849 static basic_string_view<_CharT>
1850 _S_str_d2(span<_CharT, 3> __buf,
unsigned __n)
1852 if (__n < 100) [[likely]]
1853 return _S_two_digits(__n);
1854 return _S_str_d3(__buf, __n);
1859 [[__gnu__::__always_inline__]]
1860 static basic_string_view<_CharT>
1861 _S_str_d3(span<_CharT, 3> __buf,
unsigned __n)
1863 _S_fill_two_digits(__buf.data(), __n / 10);
1864 __buf[2] = _S_chars[__n % 10];
1865 return __string_view(__buf.data(), 3);
1869 template<
typename _CharT>
1870 struct __formatter_duration :
private __formatter_chrono<_CharT>
1872 template<
typename _Rep,
typename _Period>
1873 constexpr static auto
1874 _S_subseconds(
const chrono::duration<_Rep, _Period>& __d)
1876 if constexpr (chrono::treat_as_floating_point_v<_Rep>)
1877 return chrono::duration<_Rep>(__d);
1878 else if constexpr (_Period::den == 1)
1879 return chrono::seconds(0);
1882 using _Attoseconds = _ChronoData<_CharT>::_Attoseconds;
1883 using _CRep = common_type_t<_Rep, typename _Attoseconds::rep>;
1884 chrono::duration<_CRep, _Period> subs(__d.count());
1885 return chrono::duration_cast<_Attoseconds>(subs);
1890 template<
typename _Duration>
1893 _S_spec_for(_ChronoParts __parts)
1895 using _Rep =
typename _Duration::rep;
1896 using enum _ChronoParts;
1898 _ChronoSpec<_CharT> __res{};
1899 __res._M_floating_point_rep = chrono::treat_as_floating_point_v<_Rep>;
1900 __res._M_custom_rep = !is_arithmetic_v<_Rep>;
1901 __res._M_prec = chrono::hh_mm_ss<_Duration>::fractional_width;
1902 if ((__parts & _TimeOfDay) != 0)
1903 __res._M_localized = __res._M_prec > 0 || __res._M_floating_point_rep;
1905 if ((__parts & _TimeOfDay) != 0)
1906 __res._M_needed |= _TimeOfDay;
1907 if ((__parts & _Date) != 0)
1908 __res._M_needed |= _YearMonthDay;
1909 if ((__parts & _ZoneAbbrev) != 0)
1910 __res._M_needed |= _ZoneAbbrev;
1914 case _ZonedDateTime:
1915 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ftz();
1918 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ft();
1921 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_f();
1924 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_t();
1929 __builtin_unreachable();
1934 template<
typename _Duration>
1939 using enum _ChronoParts;
1941 constexpr bool __stream_insertable =
1942 requires (basic_ostream<_CharT>& __os, chrono::sys_time<_Duration> __t)
1944 if constexpr (!__stream_insertable)
1945 return _S_spec_for<_Duration>(_None);
1946 else if constexpr (is_convertible_v<_Duration, chrono::days>)
1947 return _S_spec_for<_Duration>(_Date);
1949 return _S_spec_for<_Duration>(_DateTime);
1952 using __formatter_chrono<_CharT>::__formatter_chrono;
1953 using __formatter_chrono<_CharT>::_M_spec;
1955 template<
typename _Duration>
1956 constexpr typename basic_format_parse_context<_CharT>::iterator
1957 _M_parse(basic_format_parse_context<_CharT>& __pc, _ChronoParts __parts,
1958 const _ChronoSpec<_CharT>& __def)
1960 using _Rep =
typename _Duration::rep;
1961 using enum _ChronoParts;
1964 = __formatter_chrono<_CharT>::_M_parse(__pc, __parts, __def);
1967 _M_spec._M_needs_ok_check =
false;
1972 if constexpr (!is_floating_point_v<_Rep>)
1973 if constexpr (chrono::treat_as_floating_point_v<_Rep>)
1974 if (_M_spec._M_needs(_Subseconds|_EpochUnits)
1975 || _M_spec._M_prec_kind != _WP_none
1976 || _M_spec._M_prec_value > 0)
1978 constexpr const _CharT* __fs = _GLIBCXX_WIDEN(
"#02.5Lf");
1979 basic_format_parse_context<_CharT> __npc(__fs);
1980 formatter<_Rep, _CharT> __fmtter;
1981 __fmtter.parse(__npc);
1987 template<
typename _FormatContext>
1989 _M_locale(_FormatContext& __fc)
const
1991 if (!_M_spec._M_localized)
1994 return __fc.locale();
1998 template<
typename _Rep,
typename _Period,
typename _FormatContext>
1999 typename _FormatContext::iterator
2000 _M_format_to_ostream(
const chrono::duration<_Rep, _Period>& __d,
2002 _FormatContext& __fc)
const
2004 basic_ostringstream<_CharT> __os;
2005 __os.imbue(this->_M_locale(__fc));
2007 if (__is_neg) [[unlikely]]
2008 __os << this->_S_plus_minus[1];
2012 return __format::__write_padded_as_spec(__str, __str.size(),
2016 template<
typename _Rep1,
typename _Period1,
2017 typename _Rep2,
typename _Period2,
2018 typename _FormatContext>
2019 typename _FormatContext::iterator
2020 _M_format_units(_ChronoData<_CharT>& __cd,
2021 const chrono::duration<_Rep1, _Period1>& __ed,
2022 const chrono::duration<_Rep2, _Period2>& __ss,
2023 _FormatContext& __fc)
const
2025 __format::_Str_sink<_CharT> __suffix_store;
2026 constexpr auto _S_unit_suffix
2027 = chrono::__detail::__units_suffix<_Period1, _CharT>();
2028 if constexpr (!_S_unit_suffix.empty())
2029 __cd._M_unit_suffix = _S_unit_suffix;
2030 else if (_M_spec._M_needs(_ChronoParts::_UnitSuffix))
2033 __fmt_units_suffix<_Period1, _CharT>(__suffix_store.out());
2034 __cd._M_unit_suffix = __suffix_store.view();
2037 const auto __prec = _M_spec._M_prec_kind != _WP_none
2038 ? _M_spec._M_get_precision(__fc)
2041 using _ErasedContext =
typename _ChronoData<_CharT>::_FormatContext;
2044 auto __ereps = +__ed.count();
2045 if (!_M_spec._M_needs(_ChronoParts::_Subseconds))
2049 = std::make_format_args<_ErasedContext>(__ereps, __ssreps, __prec);
2050 __cd._M_ereps = __args_store;
2051 return this->_M_format(__cd, __fc);
2054 using _Attoseconds = _ChronoData<_CharT>::_Attoseconds;
2055 auto __nss = _S_subseconds(__ss);
2056 __cd._M_subseconds = chrono::duration_cast<_Attoseconds>(__nss);
2058 auto __ssreps = __nss.count();
2060 = std::make_format_args<_ErasedContext>(__ereps, __ssreps, __prec);
2061 __cd._M_ereps = __args_store;
2063 return this->_M_format(__cd, __fc);
2067 template<
typename _Rep1,
typename _Period1,
typename _FormatContext>
2068 typename _FormatContext::iterator
2069 _M_format_time_point(_ChronoData<_CharT>& __cd,
2070 const chrono::duration<_Rep1, _Period1>& __ed,
2071 _FormatContext& __fc)
const
2073 auto __parts = _M_spec._M_needed - _ChronoParts::_TotalSeconds;
2074 if ((__parts & _ChronoParts::_DateTime) != 0)
2075 __cd._M_fill_date_time(__cd._M_lseconds, __parts);
2076 return _M_format_units(__cd, __ed, __ed - __cd._M_eseconds, __fc);
2080#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
2081 template<
typename _CharT>
2082 struct __formatter_chrono_info
2084 constexpr typename basic_format_parse_context<_CharT>::iterator
2085 parse(basic_format_parse_context<_CharT>& __pc)
2086 {
return _M_f._M_parse(__pc, _ChronoParts(), {}); }
2088 template<
typename _Info,
typename _Out>
2089 typename basic_format_context<_Out, _CharT>::iterator
2090 format(
const _Info& __i,
2091 basic_format_context<_Out, _CharT>& __fc)
const
2095 if (!_M_f._M_spec._M_chrono_specs.empty()) [[unlikely]]
2096 return _M_f._M_format(_ChronoData<_CharT>{}, __fc);
2098 const size_t __padwidth = _M_f._M_spec._M_get_width(__fc);
2099 if (__padwidth == 0)
2100 return _M_format_to(__fc.out(), __i);
2102 _Padding_sink<_Out, _CharT> __sink(__fc.out(), __padwidth);
2103 _M_format_to(__sink.out(), __i);
2104 return __sink._M_finish(_M_f._M_spec._M_align, _M_f._M_spec._M_fill);
2108 template<
typename _Out>
2110 _M_format_to(_Out __out,
const chrono::sys_info& __si)
const
2112 using _FmtStr = _Runtime_format_string<_CharT>;
2116 constexpr auto* __fs
2117 = _GLIBCXX_WIDEN(
"[{0:%F %T},{1:%F %T},{2:%T},{3:%Q%q},{0:%Z}]");
2118 const chrono::local_seconds __lb(__si.begin.time_since_epoch());
2119 return std::format_to(
std::move(__out), _FmtStr(__fs),
2120 chrono::local_time_format(__lb, &__si.abbrev),
2121 __si.end, __si.offset, __si.save);
2124 template<
typename _Out>
2126 _M_format_to(_Out __out,
const chrono::local_info& __li)
const
2128 *__out = _Separators<_CharT>::_S_squares()[0];
2130 if (__li.result == chrono::local_info::unique)
2131 __out = _M_format_to(
std::move(__out), __li.first);
2134 basic_string_view<_CharT> __sv;
2135 if (__li.result == chrono::local_info::nonexistent)
2136 __sv =_GLIBCXX_WIDEN(
"nonexistent");
2138 __sv = _GLIBCXX_WIDEN(
"ambiguous");
2139 __out = __format::__write(
std::move(__out), __sv);
2141 __sv = _GLIBCXX_WIDEN(
" local time between ");
2142 __out = __format::__write(
std::move(__out), __sv);
2143 __out = _M_format_to(
std::move(__out), __li.first);
2145 __sv = _GLIBCXX_WIDEN(
" and ");
2146 __out = __format::__write(
std::move(__out), __sv);
2147 __out = _M_format_to(
std::move(__out), __li.second);
2149 *__out = _Separators<_CharT>::_S_squares()[1];
2154 __formatter_chrono<_CharT> _M_f;
2161 template<
typename _Rep,
typename _Period,
typename _CharT>
2162 requires __format::__formattable_impl<_Rep, _CharT>
2163 struct formatter<
chrono::duration<_Rep, _Period>, _CharT>
2165 constexpr typename basic_format_parse_context<_CharT>::iterator
2166 parse(basic_format_parse_context<_CharT>& __pc)
2168 using enum __format::_ChronoParts;
2169 return _M_f.template _M_parse<_Duration>(__pc, _EpochTime, __defSpec);
2172 template<
typename _Out>
2173 typename basic_format_context<_Out, _CharT>::iterator
2174 format(
const chrono::duration<_Rep, _Period>& __d,
2175 basic_format_context<_Out, _CharT>& __fc)
const
2177 if constexpr (numeric_limits<_Rep>::is_signed)
2178 if (__d < __d.zero()) [[unlikely]]
2180 if constexpr (is_integral_v<_Rep>)
2184 using _URep = make_unsigned_t<_Rep>;
2185 auto __ucnt = -
static_cast<_URep
>(__d.count());
2186 auto __ud = chrono::duration<_URep, _Period>(__ucnt);
2187 return _M_format(__ud,
true, __fc);
2190 return _M_format(-__d,
true, __fc);
2192 return _M_format(__d,
false, __fc);
2196 using _Duration = chrono::duration<_Rep, _Period>;
2198 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2200 using enum __format::_ChronoParts;
2201 auto __res = __format::__formatter_duration<_CharT>::
2202 template _S_spec_for<_Duration>(_None);
2203 __res._M_localized = !is_integral_v<_Rep>;
2205 if constexpr (is_integral_v<_Rep>)
2207 __res._M_needed = _EpochUnits|_UnitSuffix;
2208 __res._M_chrono_specs = _GLIBCXX_WIDEN(
"%Q%q");
2213 template<
typename _Rep2,
typename _Out>
2214 typename basic_format_context<_Out, _CharT>::iterator
2215 _M_format(
const chrono::duration<_Rep2, _Period>& __d,
2217 basic_format_context<_Out, _CharT>& __fc)
const
2219 using namespace chrono;
2220 using enum __format::_ChronoParts;
2221 if constexpr (!is_integral_v<_Rep>)
2222 if (_M_f._M_spec._M_chrono_specs.empty())
2223 return _M_f._M_format_to_ostream(__d, __is_neg, __fc);
2225 __format::_ChronoData<_CharT> __cd;
2226 __cd._M_is_neg = __is_neg;
2227 auto __ts = chrono::floor<chrono::seconds>(__d);
2228 __cd._M_eseconds = __ts;
2229 if (_M_f._M_spec._M_needs(_HoursMinutesSeconds))
2230 __cd._M_fill_time(__ts);
2231 return _M_f._M_format_units(__cd, __d, __d - __ts, __fc);
2234 __format::__formatter_duration<_CharT> _M_f{__defSpec};
2237#if __glibcxx_print >= 202406L
2240 template<
typename _Rep,
typename _Period>
2242 enable_nonlocking_formatter_optimization<chrono::duration<_Rep, _Period>>
2243 = is_arithmetic_v<_Rep>;
2246 template<__format::__
char _CharT>
2247 struct formatter<
chrono::day, _CharT>
2249 constexpr typename basic_format_parse_context<_CharT>::iterator
2250 parse(basic_format_parse_context<_CharT>& __pc)
2252 using enum __format::_ChronoParts;
2253 return _M_f._M_parse(__pc, _Day|_WeekdayIndex, __defSpec);
2256 template<
typename _Out>
2257 typename basic_format_context<_Out, _CharT>::iterator
2258 format(
const chrono::day& __t,
2259 basic_format_context<_Out, _CharT>& __fc)
const
2261 __format::_ChronoData<_CharT> __cd{};
2262 __cd._M_fill_day(__t, __defSpec._M_needed);
2263 return _M_f._M_format(__cd, __fc);
2267 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2269 using __format::_ChronoFormats;
2270 using enum __format::_ChronoParts;
2272 __format::_ChronoSpec<_CharT> __res{};
2273 __res._M_debug =
true;
2274 __res._M_needed = _Day;
2275 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_d();
2279 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2282#if __glibcxx_print >= 202406L
2284 inline constexpr bool
2285 enable_nonlocking_formatter_optimization<chrono::day> =
true;
2288 template<__format::__
char _CharT>
2289 struct formatter<
chrono::month, _CharT>
2291 constexpr typename basic_format_parse_context<_CharT>::iterator
2292 parse(basic_format_parse_context<_CharT>& __pc)
2294 using enum __format::_ChronoParts;
2295 return _M_f._M_parse(__pc, _Month, __defSpec);
2298 template<
typename _Out>
2299 typename basic_format_context<_Out, _CharT>::iterator
2300 format(
const chrono::month& __t,
2301 basic_format_context<_Out, _CharT>& __fc)
const
2303 __format::_ChronoData<_CharT> __cd{};
2304 __cd._M_month = __t;
2305 return _M_f._M_format(__cd, __fc);
2309 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2311 using __format::_ChronoFormats;
2312 using enum __format::_ChronoParts;
2314 __format::_ChronoSpec<_CharT> __res{};
2315 __res._M_debug =
true;
2316 __res._M_localized =
true;
2317 __res._M_locale_specific =
true;
2318 __res._M_needed = _Month;
2319 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_m();
2323 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2326#if __glibcxx_print >= 202406L
2328 inline constexpr bool
2329 enable_nonlocking_formatter_optimization<chrono::month> =
true;
2332 template<__format::__
char _CharT>
2333 struct formatter<
chrono::year, _CharT>
2335 constexpr typename basic_format_parse_context<_CharT>::iterator
2336 parse(basic_format_parse_context<_CharT>& __pc)
2338 using enum __format::_ChronoParts;
2339 return _M_f._M_parse(__pc, _Year, __defSpec);
2342 template<
typename _Out>
2343 typename basic_format_context<_Out, _CharT>::iterator
2344 format(
const chrono::year& __t,
2345 basic_format_context<_Out, _CharT>& __fc)
const
2347 __format::_ChronoData<_CharT> __cd{};
2349 return _M_f._M_format(__cd, __fc);
2353 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2355 using __format::_ChronoFormats;
2356 using enum __format::_ChronoParts;
2358 __format::_ChronoSpec<_CharT> __res{};
2359 __res._M_debug =
true;
2360 __res._M_needed = _Year;
2361 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_y();
2365 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2368#if __glibcxx_print >= 202406L
2370 inline constexpr bool
2371 enable_nonlocking_formatter_optimization<chrono::year> =
true;
2374 template<__format::__
char _CharT>
2375 struct formatter<
chrono::weekday, _CharT>
2377 constexpr typename basic_format_parse_context<_CharT>::iterator
2378 parse(basic_format_parse_context<_CharT>& __pc)
2380 using enum __format::_ChronoParts;
2381 return _M_f._M_parse(__pc, _Weekday, __defSpec);
2384 template<
typename _Out>
2385 typename basic_format_context<_Out, _CharT>::iterator
2386 format(
const chrono::weekday& __t,
2387 basic_format_context<_Out, _CharT>& __fc)
const
2389 __format::_ChronoData<_CharT> __cd{};
2390 __cd._M_weekday = __t;
2391 return _M_f._M_format(__cd, __fc);
2395 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2397 using __format::_ChronoFormats;
2398 using enum __format::_ChronoParts;
2400 __format::_ChronoSpec<_CharT> __res{};
2401 __res._M_debug =
true;
2402 __res._M_localized =
true;
2403 __res._M_locale_specific =
true;
2404 __res._M_needed = _Weekday;
2405 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_w();
2409 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2412#if __glibcxx_print >= 202406L
2414 inline constexpr bool
2415 enable_nonlocking_formatter_optimization<chrono::weekday> =
true;
2418 template<__format::__
char _CharT>
2419 struct formatter<
chrono::weekday_indexed, _CharT>
2421 constexpr typename basic_format_parse_context<_CharT>::iterator
2422 parse(basic_format_parse_context<_CharT>& __pc)
2424 using enum __format::_ChronoParts;
2425 return _M_f._M_parse(__pc, _IndexedWeekday, __defSpec);
2428 template<
typename _Out>
2429 typename basic_format_context<_Out, _CharT>::iterator
2430 format(
const chrono::weekday_indexed& __t,
2431 basic_format_context<_Out, _CharT>& __fc)
const
2433 __format::_ChronoData<_CharT> __cd{};
2434 __cd._M_fill_weekday(__t, __defSpec._M_needed);
2435 return _M_f._M_format(__cd, __fc);
2439 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2441 using __format::_ChronoFormats;
2442 using enum __format::_ChronoParts;
2444 __format::_ChronoSpec<_CharT> __res{};
2445 __res._M_debug =
true;
2446 __res._M_localized =
true;
2447 __res._M_locale_specific =
true;
2448 __res._M_needed = _IndexedWeekday;
2449 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_wi();
2453 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2456#if __glibcxx_print >= 202406L
2458 inline constexpr bool
2459 enable_nonlocking_formatter_optimization<chrono::weekday_indexed> =
true;
2462 template<__format::__
char _CharT>
2463 struct formatter<
chrono::weekday_last, _CharT>
2465 constexpr typename basic_format_parse_context<_CharT>::iterator
2466 parse(basic_format_parse_context<_CharT>& __pc)
2468 using enum __format::_ChronoParts;
2469 return _M_f._M_parse(__pc, _Weekday, __defSpec);
2472 template<
typename _Out>
2473 typename basic_format_context<_Out, _CharT>::iterator
2474 format(
const chrono::weekday_last& __t,
2475 basic_format_context<_Out, _CharT>& __fc)
const
2477 __format::_ChronoData<_CharT> __cd{};
2478 __cd._M_weekday = __t.weekday();
2479 return _M_f._M_format(__cd, __fc);
2483 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2485 using __format::_ChronoFormats;
2486 using enum __format::_ChronoParts;
2488 __format::_ChronoSpec<_CharT> __res{};
2489 __res._M_debug =
true;
2490 __res._M_localized =
true;
2491 __res._M_locale_specific =
true;
2492 __res._M_needed = _Weekday;
2493 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_wl();
2497 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2500#if __glibcxx_print >= 202406L
2502 inline constexpr bool
2503 enable_nonlocking_formatter_optimization<chrono::weekday_last> =
true;
2506 template<__format::__
char _CharT>
2507 struct formatter<
chrono::month_day, _CharT>
2509 constexpr typename basic_format_parse_context<_CharT>::iterator
2510 parse(basic_format_parse_context<_CharT>& __pc)
2512 using enum __format::_ChronoParts;
2513 return _M_f._M_parse(__pc, _Month|_Day|_WeekdayIndex, __defSpec);
2516 template<
typename _Out>
2517 typename basic_format_context<_Out, _CharT>::iterator
2518 format(
const chrono::month_day& __t,
2519 basic_format_context<_Out, _CharT>& __fc)
const
2521 __format::_ChronoData<_CharT> __cd{};
2522 __cd._M_month = __t.month();
2523 __cd._M_fill_day(__t.day(), __defSpec._M_needed);
2524 return _M_f._M_format(__cd, __fc);
2528 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2530 using __format::_ChronoFormats;
2531 using enum __format::_ChronoParts;
2533 __format::_ChronoSpec<_CharT> __res{};
2534 __res._M_debug =
true;
2535 __res._M_localized =
true;
2536 __res._M_locale_specific =
true;
2537 __res._M_needed = _Month|_Day;
2538 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_md();
2542 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2545#if __glibcxx_print >= 202406L
2547 inline constexpr bool
2548 enable_nonlocking_formatter_optimization<chrono::month_day> =
true;
2551 template<__format::__
char _CharT>
2552 struct formatter<
chrono::month_day_last, _CharT>
2554 constexpr typename basic_format_parse_context<_CharT>::iterator
2555 parse(basic_format_parse_context<_CharT>& __pc)
2557 using enum __format::_ChronoParts;
2558 return _M_f._M_parse(__pc, _Month, __defSpec);
2561 template<
typename _Out>
2562 typename basic_format_context<_Out, _CharT>::iterator
2563 format(
const chrono::month_day_last& __t,
2564 basic_format_context<_Out, _CharT>& __fc)
const
2566 __format::_ChronoData<_CharT> __cd{};
2567 __cd._M_month = __t.month();
2568 return _M_f._M_format(__cd, __fc);
2572 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2574 using __format::_ChronoFormats;
2575 using enum __format::_ChronoParts;
2577 __format::_ChronoSpec<_CharT> __res{};
2578 __res._M_debug =
true;
2579 __res._M_localized =
true;
2580 __res._M_locale_specific =
true;
2581 __res._M_needed = _Month;
2582 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ml();
2586 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2589#if __glibcxx_print >= 202406L
2591 inline constexpr bool
2592 enable_nonlocking_formatter_optimization<chrono::month_day_last> =
true;
2595 template<__format::__
char _CharT>
2596 struct formatter<
chrono::month_weekday, _CharT>
2598 constexpr typename basic_format_parse_context<_CharT>::iterator
2599 parse(basic_format_parse_context<_CharT>& __pc)
2601 using enum __format::_ChronoParts;
2602 return _M_f._M_parse(__pc, _Month|_IndexedWeekday, __defSpec);
2605 template<
typename _Out>
2606 typename basic_format_context<_Out, _CharT>::iterator
2607 format(
const chrono::month_weekday& __t,
2608 basic_format_context<_Out, _CharT>& __fc)
const
2610 __format::_ChronoData<_CharT> __cd{};
2611 __cd._M_month = __t.month();
2612 __cd._M_fill_weekday(__t.weekday_indexed(), __defSpec._M_needed);
2613 return _M_f._M_format(__cd, __fc);
2617 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2619 using __format::_ChronoFormats;
2620 using enum __format::_ChronoParts;
2622 __format::_ChronoSpec<_CharT> __res{};
2623 __res._M_debug =
true;
2624 __res._M_localized =
true;
2625 __res._M_locale_specific =
true;
2626 __res._M_needed = _Month|_IndexedWeekday;
2627 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_mwi();
2631 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2634#if __glibcxx_print >= 202406L
2636 inline constexpr bool
2637 enable_nonlocking_formatter_optimization<chrono::month_weekday> =
true;
2640 template<__format::__
char _CharT>
2641 struct formatter<
chrono::month_weekday_last, _CharT>
2643 constexpr typename basic_format_parse_context<_CharT>::iterator
2644 parse(basic_format_parse_context<_CharT>& __pc)
2646 using enum __format::_ChronoParts;
2647 return _M_f._M_parse(__pc, _Month|_Weekday, __defSpec);
2650 template<
typename _Out>
2651 typename basic_format_context<_Out, _CharT>::iterator
2652 format(
const chrono::month_weekday_last& __t,
2653 basic_format_context<_Out, _CharT>& __fc)
const
2655 __format::_ChronoData<_CharT> __cd{};
2656 __cd._M_month = __t.month();
2657 __cd._M_weekday = __t.weekday_last().weekday();
2658 return _M_f._M_format(__cd, __fc);
2662 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2664 using __format::_ChronoFormats;
2665 using enum __format::_ChronoParts;
2667 __format::_ChronoSpec<_CharT> __res{};
2668 __res._M_debug =
true;
2669 __res._M_localized =
true;
2670 __res._M_locale_specific =
true;
2671 __res._M_needed = _Month|_Weekday;
2672 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_mwl();
2676 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2679#if __glibcxx_print >= 202406L
2681 inline constexpr bool
2682 enable_nonlocking_formatter_optimization<chrono::month_weekday_last> =
true;
2685 template<__format::__
char _CharT>
2686 struct formatter<
chrono::year_month, _CharT>
2688 constexpr typename basic_format_parse_context<_CharT>::iterator
2689 parse(basic_format_parse_context<_CharT>& __pc)
2691 using enum __format::_ChronoParts;
2692 return _M_f._M_parse(__pc, _Year|_Month, __defSpec);
2695 template<
typename _Out>
2696 typename basic_format_context<_Out, _CharT>::iterator
2697 format(
const chrono::year_month& __t,
2698 basic_format_context<_Out, _CharT>& __fc)
const
2700 __format::_ChronoData<_CharT> __cd{};
2701 __cd._M_fill_year_month(__t, __defSpec._M_needed);
2702 return _M_f._M_format(__cd, __fc);
2706 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2708 using __format::_ChronoFormats;
2709 using enum __format::_ChronoParts;
2711 __format::_ChronoSpec<_CharT> __res{};
2712 __res._M_debug =
true;
2713 __res._M_localized =
true;
2714 __res._M_locale_specific =
true;
2715 __res._M_needed = _Year|_Month;
2716 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ym();
2720 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2723#if __glibcxx_print >= 202406L
2725 inline constexpr bool
2726 enable_nonlocking_formatter_optimization<chrono::year_month> =
true;
2729 template<__format::__
char _CharT>
2730 struct formatter<
chrono::year_month_day, _CharT>
2732 constexpr typename basic_format_parse_context<_CharT>::iterator
2733 parse(basic_format_parse_context<_CharT>& __pc)
2735 using enum __format::_ChronoParts;
2736 return _M_f._M_parse(__pc, _Date, __defSpec);
2739 template<
typename _Out>
2740 typename basic_format_context<_Out, _CharT>::iterator
2741 format(
const chrono::year_month_day& __t,
2742 basic_format_context<_Out, _CharT>& __fc)
const
2744 __format::_ChronoData<_CharT> __cd{};
2745 auto __parts = _M_f._M_spec._M_needed;
2746 __parts = __cd._M_fill_year_month(__t, __parts);
2747 __parts = __cd._M_fill_day(__t.day(), __parts);
2749 return _M_f._M_format(__cd, __fc);
2751 __cd._M_fill_ldays(chrono::local_days(__t), __parts);
2752 return _M_f._M_format(__cd, __fc);
2756 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2758 using __format::_ChronoFormats;
2759 using enum __format::_ChronoParts;
2761 __format::_ChronoSpec<_CharT> __res{};
2762 __res._M_debug =
true;
2763 __res._M_needed = _YearMonthDay;
2764 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_f();
2768 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2771#if __glibcxx_print >= 202406L
2773 inline constexpr bool
2774 enable_nonlocking_formatter_optimization<chrono::year_month_day> =
true;
2777 template<__format::__
char _CharT>
2778 struct formatter<
chrono::year_month_day_last, _CharT>
2780 constexpr typename basic_format_parse_context<_CharT>::iterator
2781 parse(basic_format_parse_context<_CharT>& __pc)
2783 using enum __format::_ChronoParts;
2784 return _M_f._M_parse(__pc, _Date, __defSpec);
2787 template<
typename _Out>
2788 typename basic_format_context<_Out, _CharT>::iterator
2789 format(
const chrono::year_month_day_last& __t,
2790 basic_format_context<_Out, _CharT>& __fc)
const
2792 using enum __format::_ChronoParts;
2794 __format::_ChronoData<_CharT> __cd{};
2795 auto __parts = _M_f._M_spec._M_needed;
2796 __parts = __cd._M_fill_year_month(__t, __parts);
2797 if (_M_f._M_spec._M_needs(_Day|_WeekdayIndex))
2798 __parts = __cd._M_fill_day(__t.day(), __parts);
2800 return _M_f._M_format(__cd, __fc);
2802 __cd._M_fill_ldays(chrono::local_days(__t), __parts);
2803 return _M_f._M_format(__cd, __fc);
2807 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2809 using __format::_ChronoFormats;
2810 using enum __format::_ChronoParts;
2812 __format::_ChronoSpec<_CharT> __res{};
2813 __res._M_debug =
true;
2814 __res._M_localized =
true;
2815 __res._M_locale_specific =
true;
2816 __res._M_needed = _Year|_Month;
2817 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_yml();
2821 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2824#if __glibcxx_print >= 202406L
2826 inline constexpr bool
2827 enable_nonlocking_formatter_optimization<chrono::year_month_day_last> =
true;
2830 template<__format::__
char _CharT>
2831 struct formatter<
chrono::year_month_weekday, _CharT>
2833 constexpr typename basic_format_parse_context<_CharT>::iterator
2834 parse(basic_format_parse_context<_CharT>& __pc)
2836 using enum __format::_ChronoParts;
2837 return _M_f._M_parse(__pc, _Date, __defSpec);
2840 template<
typename _Out>
2841 typename basic_format_context<_Out, _CharT>::iterator
2842 format(
const chrono::year_month_weekday& __t,
2843 basic_format_context<_Out, _CharT>& __fc)
const
2845 __format::_ChronoData<_CharT> __cd{};
2846 auto __parts = _M_f._M_spec._M_needed;
2847 __parts = __cd._M_fill_year_month(__t, __parts);
2848 __parts = __cd._M_fill_weekday(__t.weekday_indexed(), __parts);
2849 if (__t.index() == 0) [[unlikely]]
2852 __parts -= __format::_ChronoParts::_Day;
2854 return _M_f._M_format(__cd, __fc);
2856 chrono::local_days __ld(__t);
2857 __parts = __cd._M_fill_ldays(__ld, __parts);
2859 return _M_f._M_format(__cd, __fc);
2861 auto __dom = __ld - chrono::local_days(__t.year()/__t.month()/0);
2863 __cd._M_day = chrono::day(__dom.count());
2864 return _M_f._M_format(__cd, __fc);
2868 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2870 using __format::_ChronoFormats;
2871 using enum __format::_ChronoParts;
2873 __format::_ChronoSpec<_CharT> __res{};
2874 __res._M_debug =
true;
2875 __res._M_localized =
true;
2876 __res._M_locale_specific =
true;
2877 __res._M_needed = _Year|_Month|_IndexedWeekday;
2878 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ymwi();
2882 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2885#if __glibcxx_print >= 202406L
2887 inline constexpr bool
2888 enable_nonlocking_formatter_optimization<chrono::year_month_weekday> =
true;
2891 template<__format::__
char _CharT>
2892 struct formatter<
chrono::year_month_weekday_last, _CharT>
2894 constexpr typename basic_format_parse_context<_CharT>::iterator
2895 parse(basic_format_parse_context<_CharT>& __pc)
2897 using enum __format::_ChronoParts;
2898 return _M_f._M_parse(__pc, _Date, __defSpec);
2901 template<
typename _Out>
2902 typename basic_format_context<_Out, _CharT>::iterator
2903 format(
const chrono::year_month_weekday_last& __t,
2904 basic_format_context<_Out, _CharT>& __fc)
const
2906 __format::_ChronoData<_CharT> __cd{};
2907 auto __parts = _M_f._M_spec._M_needed;
2908 __parts = __cd._M_fill_year_month(__t, __parts);
2909 __cd._M_weekday = __t.weekday_last().weekday();
2910 __parts -= __format::_ChronoParts::_Weekday;
2912 return _M_f._M_format(__cd, __fc);
2914 chrono::local_days __ld(__t);
2915 __parts = __cd._M_fill_ldays(__ld, __parts);
2917 return _M_f._M_format(__cd, __fc);
2919 auto __dom = __ld - chrono::local_days(__t.year()/__t.month()/0);
2920 __cd._M_fill_day(chrono::day(__dom.count()), __parts);
2921 return _M_f._M_format(__cd, __fc);
2925 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2927 using __format::_ChronoFormats;
2928 using enum __format::_ChronoParts;
2930 __format::_ChronoSpec<_CharT> __res{};
2931 __res._M_debug =
true;
2932 __res._M_localized =
true;
2933 __res._M_locale_specific =
true;
2934 __res._M_needed = _Year|_Month|_Weekday;
2935 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ymwl();
2939 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2942#if __glibcxx_print >= 202406L
2944 inline constexpr bool
2945 enable_nonlocking_formatter_optimization<chrono::year_month_weekday_last> =
true;
2948 template<
typename _Rep,
typename _Period, __format::__
char _CharT>
2949 struct formatter<
chrono::hh_mm_ss<chrono::duration<_Rep, _Period>>, _CharT>
2951 constexpr typename basic_format_parse_context<_CharT>::iterator
2952 parse(basic_format_parse_context<_CharT>& __pc)
2954 using enum __format::_ChronoParts;
2955 return _M_f.template _M_parse<_Precision>(__pc, _Time, __defSpec);
2958 template<
typename _Out>
2959 typename basic_format_context<_Out, _CharT>::iterator
2960 format(
const chrono::hh_mm_ss<chrono::duration<_Rep, _Period>>& __t,
2961 basic_format_context<_Out, _CharT>& __fc)
const
2963 using enum __format::_ChronoParts;
2965 __format::_ChronoData<_CharT> __cd;
2966 __cd._M_is_neg = __t.is_negative();
2967 __cd._M_hours = __t.hours();
2968 __cd._M_minutes = __t.minutes();
2969 __cd._M_seconds = __t.seconds();
2974 if (_M_f._M_spec._M_needs(_EpochUnits))
2975 __d = __t.to_duration();
2976 if (_M_f._M_spec._M_needs(_TotalSeconds))
2978 = __cd._M_hours + __cd._M_minutes + __cd._M_seconds;
2979 return _M_f._M_format_units(__cd, __d, __t.subseconds(), __fc);
2984 =
typename chrono::hh_mm_ss<chrono::duration<_Rep, _Period>>::precision;
2985 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
2986 __format::__formatter_duration<_CharT>::
2987 template _S_spec_for<_Precision>(__format::_ChronoParts::_Time);
2989 __format::__formatter_duration<_CharT> _M_f{__defSpec};
2992#if __glibcxx_print >= 202406L
2995 template<
typename _Duration>
2997 enable_nonlocking_formatter_optimization<chrono::hh_mm_ss<_Duration>>
2998 = enable_nonlocking_formatter_optimization<_Duration>;
3001#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
3002 template<__format::__
char _CharT>
3003 struct formatter<
chrono::sys_info, _CharT>
3005 constexpr typename basic_format_parse_context<_CharT>::iterator
3006 parse(basic_format_parse_context<_CharT>& __pc)
3007 {
return _M_f.parse(__pc); }
3009 template<
typename _Out>
3010 typename basic_format_context<_Out, _CharT>::iterator
3011 format(
const chrono::sys_info& __i,
3012 basic_format_context<_Out, _CharT>& __fc)
const
3013 {
return _M_f.format(__i, __fc); }
3016 __format::__formatter_chrono_info<_CharT> _M_f;
3019#if __glibcxx_print >= 202406L
3021 inline constexpr bool
3022 enable_nonlocking_formatter_optimization<chrono::sys_info> =
true;
3025 template<__format::__
char _CharT>
3026 struct formatter<
chrono::local_info, _CharT>
3028 constexpr typename basic_format_parse_context<_CharT>::iterator
3029 parse(basic_format_parse_context<_CharT>& __pc)
3030 {
return _M_f.parse(__pc); }
3032 template<
typename _Out>
3033 typename basic_format_context<_Out, _CharT>::iterator
3034 format(
const chrono::local_info& __i,
3035 basic_format_context<_Out, _CharT>& __fc)
const
3036 {
return _M_f.format(__i, __fc); }
3039 __format::__formatter_chrono_info<_CharT> _M_f;
3042#if __glibcxx_print >= 202406L
3044 inline constexpr bool
3045 enable_nonlocking_formatter_optimization<chrono::local_info> =
true;
3049 template<
typename _Duration, __format::__
char _CharT>
3050 struct formatter<
chrono::sys_time<_Duration>, _CharT>
3052 constexpr typename basic_format_parse_context<_CharT>::iterator
3053 parse(basic_format_parse_context<_CharT>& __pc)
3055 using enum __format::_ChronoParts;
3057 = _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3058 if constexpr (__defSpec._M_chrono_specs.empty())
3059 if (_M_f._M_spec._M_chrono_specs.empty())
3060 __format::__invalid_chrono_spec();
3064 template<
typename _Out>
3065 typename basic_format_context<_Out, _CharT>::iterator
3066 format(
const chrono::sys_time<_Duration>& __t,
3067 basic_format_context<_Out, _CharT>& __fc)
const
3069 __format::_ChronoData<_CharT> __cd{};
3070 __cd._M_fill_utc_zone();
3072 _Duration __ed = __t.time_since_epoch();
3073 __cd._M_eseconds = chrono::floor<chrono::seconds>(__ed);
3074 __cd._M_lseconds = chrono::local_seconds(__cd._M_eseconds);
3075 return _M_f._M_format_time_point(__cd, __ed, __fc);
3079 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3080 __format::__formatter_duration<_CharT>::template _S_spec_for_tp<_Duration>();
3082 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3085#if __glibcxx_print >= 202406L
3088 template<
typename _Duration>
3090 enable_nonlocking_formatter_optimization<chrono::sys_time<_Duration>>
3091 = enable_nonlocking_formatter_optimization<_Duration>;
3094 template<
typename _Duration, __format::__
char _CharT>
3095 struct formatter<
chrono::utc_time<_Duration>, _CharT>
3097 constexpr typename basic_format_parse_context<_CharT>::iterator
3098 parse(basic_format_parse_context<_CharT>& __pc)
3100 using enum __format::_ChronoParts;
3101 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3104 template<
typename _Out>
3105 typename basic_format_context<_Out, _CharT>::iterator
3106 format(
const chrono::utc_time<_Duration>& __t,
3107 basic_format_context<_Out, _CharT>& __fc)
const
3109 using __format::_ChronoParts;
3110 using namespace chrono;
3111 __format::_ChronoData<_CharT> __cd{};
3112 __cd._M_fill_utc_zone();
3114 _Duration __ed = __t.time_since_epoch();
3115 __cd._M_eseconds = chrono::floor<seconds>(__ed);
3119 const auto __li = chrono::get_leap_second_info(__t);
3120 __cd._M_lseconds = local_seconds(__cd._M_eseconds - __li.elapsed);
3121 auto __parts = _M_f._M_spec._M_needed - _ChronoParts::_TotalSeconds;
3122 if ((__parts & _ChronoParts::_DateTime) != 0)
3124 __cd._M_fill_date_time(__cd._M_lseconds, __parts);
3125 __cd._M_seconds +=
seconds(__li.is_leap_second);
3127 return _M_f._M_format_units(__cd, __ed, __ed - __cd._M_eseconds, __fc);
3131 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3132 __format::__formatter_duration<_CharT>::
3133 template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
3135 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3138#if __glibcxx_print >= 202406L
3141 template<
typename _Duration>
3143 enable_nonlocking_formatter_optimization<chrono::utc_time<_Duration>>
3144 = enable_nonlocking_formatter_optimization<_Duration>;
3147 template<
typename _Duration, __format::__
char _CharT>
3148 struct formatter<
chrono::tai_time<_Duration>, _CharT>
3150 constexpr typename basic_format_parse_context<_CharT>::iterator
3151 parse(basic_format_parse_context<_CharT>& __pc)
3153 using enum __format::_ChronoParts;
3154 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3157 template<
typename _Out>
3158 typename basic_format_context<_Out, _CharT>::iterator
3159 format(
const chrono::tai_time<_Duration>& __t,
3160 basic_format_context<_Out, _CharT>& __fc)
const
3162 using namespace chrono;
3163 __format::_ChronoData<_CharT> __cd{};
3164 __cd._M_fill_zone(
"TAI", L
"TAI");
3166 _Duration __ed = __t.time_since_epoch();
3167 __cd._M_eseconds = chrono::floor<seconds>(__ed);
3169 constexpr chrono::days __tai_offset = chrono::days(4383);
3170 __cd._M_lseconds = local_seconds(__cd._M_eseconds - __tai_offset);
3171 return _M_f._M_format_time_point(__cd, __ed, __fc);
3175 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3176 __format::__formatter_duration<_CharT>::
3177 template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
3179 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3182#if __glibcxx_print >= 202406L
3185 template<
typename _Duration>
3187 enable_nonlocking_formatter_optimization<chrono::tai_time<_Duration>>
3188 = enable_nonlocking_formatter_optimization<_Duration>;
3191 template<
typename _Duration, __format::__
char _CharT>
3192 struct formatter<
chrono::gps_time<_Duration>, _CharT>
3194 constexpr typename basic_format_parse_context<_CharT>::iterator
3195 parse(basic_format_parse_context<_CharT>& __pc)
3197 using enum __format::_ChronoParts;
3198 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3201 template<
typename _Out>
3202 typename basic_format_context<_Out, _CharT>::iterator
3203 format(
const chrono::gps_time<_Duration>& __t,
3204 basic_format_context<_Out, _CharT>& __fc)
const
3206 using namespace chrono;
3207 __format::_ChronoData<_CharT> __cd{};
3208 __cd._M_fill_zone(
"GPS", L
"GPS");
3210 _Duration __ed = __t.time_since_epoch();
3211 __cd._M_eseconds = chrono::floor<seconds>(__ed);
3213 constexpr chrono::days __gps_offset = chrono::days(3657);
3214 __cd._M_lseconds = local_seconds(__cd._M_eseconds + __gps_offset);
3215 return _M_f._M_format_time_point(__cd, __ed, __fc);
3219 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3220 __format::__formatter_duration<_CharT>::
3221 template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
3223 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3226#if __glibcxx_print >= 202406L
3229 template<
typename _Duration>
3231 enable_nonlocking_formatter_optimization<chrono::gps_time<_Duration>>
3232 = enable_nonlocking_formatter_optimization<_Duration>;
3235 template<
typename _Duration, __format::__
char _CharT>
3236 struct formatter<
chrono::file_time<_Duration>, _CharT>
3238 constexpr typename basic_format_parse_context<_CharT>::iterator
3239 parse(basic_format_parse_context<_CharT>& __pc)
3241 using enum __format::_ChronoParts;
3242 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3245 template<
typename _Out>
3246 typename basic_format_context<_Out, _CharT>::iterator
3247 format(
const chrono::file_time<_Duration>& __t,
3248 basic_format_context<_Out, _CharT>& __fc)
const
3250 using namespace chrono;
3251 __format::_ChronoData<_CharT> __cd{};
3252 __cd._M_fill_utc_zone();
3254 _Duration __ed = __t.time_since_epoch();
3255 __cd._M_eseconds = chrono::floor<seconds>(__ed);
3256 auto __st = chrono::clock_cast<system_clock>(__t);
3258 = local_seconds(chrono::floor<seconds>(__st.time_since_epoch()));
3259 return _M_f._M_format_time_point(__cd, __ed, __fc);
3263 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3264 __format::__formatter_duration<_CharT>::
3265 template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
3267 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3270#if __glibcxx_print >= 202406L
3273 template<
typename _Duration>
3275 enable_nonlocking_formatter_optimization<chrono::file_time<_Duration>>
3276 = enable_nonlocking_formatter_optimization<_Duration>;
3279 template<
typename _Duration, __format::__
char _CharT>
3280 struct formatter<
chrono::local_time<_Duration>, _CharT>
3282 constexpr typename basic_format_parse_context<_CharT>::iterator
3283 parse(basic_format_parse_context<_CharT>& __pc)
3285 using enum __format::_ChronoParts;
3287 = _M_f.template _M_parse<_Duration>(__pc, _DateTime, __defSpec);
3288 if constexpr (__defSpec._M_chrono_specs.empty())
3289 if (_M_f._M_spec._M_chrono_specs.empty())
3290 __format::__invalid_chrono_spec();
3294 template<
typename _Out>
3295 typename basic_format_context<_Out, _CharT>::iterator
3296 format(
const chrono::local_time<_Duration>& __lt,
3297 basic_format_context<_Out, _CharT>& __fc)
const
3299 __format::_ChronoData<_CharT> __cd{};
3300 _Duration __ed = __lt.time_since_epoch();
3301 __cd._M_lseconds = chrono::floor<chrono::seconds>(__lt);
3302 __cd._M_eseconds = __cd._M_lseconds.time_since_epoch();
3303 return _M_f._M_format_time_point(__cd, __ed, __fc);
3307 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3308 __format::__formatter_duration<_CharT>::template _S_spec_for_tp<_Duration>();
3310 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3313#if __glibcxx_print >= 202406L
3316 template<
typename _Duration>
3318 enable_nonlocking_formatter_optimization<chrono::local_time<_Duration>>
3319 = enable_nonlocking_formatter_optimization<_Duration>;
3322 template<
typename _Duration, __format::__
char _CharT>
3323 struct formatter<
chrono::__detail::__local_time_fmt<_Duration>, _CharT>
3325 constexpr typename basic_format_parse_context<_CharT>::iterator
3326 parse(basic_format_parse_context<_CharT>& __pc)
3328 using enum __format::_ChronoParts;
3329 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3332 template<
typename _Out>
3333 typename basic_format_context<_Out, _CharT>::iterator
3334 format(
const chrono::__detail::__local_time_fmt<_Duration>& __zt,
3335 basic_format_context<_Out, _CharT>& __fc)
const
3337 using enum __format::_ChronoParts;
3338 __format::_ChronoData<_CharT> __cd{};
3340 if (_M_f._M_spec._M_needs(_ZoneOffset))
3342 if (!__zt._M_offset_sec)
3343 std::__throw_format_error(
"format error: no timezone available for %z");
3344 __cd._M_zone_offset = *__zt._M_offset_sec;
3347 basic_string<_CharT> __zone_store;
3348 if (_M_f._M_spec._M_needs(_ZoneAbbrev))
3350 if (!__zt._M_abbrev)
3351 std::__throw_format_error(
"format error: no timezone available for %Z");
3353 __cd._M_zone_cstr = __zt._M_abbrev->data();
3354 if constexpr (is_same_v<_CharT, char>)
3355 __cd._M_zone_abbrev = *__zt._M_abbrev;
3359 __zone_store.resize(__zt._M_abbrev->size());
3360 auto& __ct = use_facet<ctype<_CharT>>(_M_f._M_locale(__fc));
3361 __ct.widen(__zt._M_abbrev->data(),
3362 __zt._M_abbrev->data() + __zt._M_abbrev->size(),
3363 __zone_store.data());
3364 __cd._M_zone_abbrev = __zone_store;
3368 _Duration __ed = __zt._M_time.time_since_epoch();
3369 __cd._M_lseconds = chrono::floor<chrono::seconds>(__zt._M_time);
3370 __cd._M_eseconds = __cd._M_lseconds.time_since_epoch();
3371 return _M_f._M_format_time_point(__cd, __ed, __fc);
3375 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3376 __format::__formatter_duration<_CharT>::
3377 template _S_spec_for<_Duration>(__format::_ChronoParts::_ZonedDateTime);
3379 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3382#if __glibcxx_print >= 202406L
3385 template<
typename _Duration>
3387 enable_nonlocking_formatter_optimization<
3388 chrono::__detail::__local_time_fmt<_Duration>>
3389 = enable_nonlocking_formatter_optimization<_Duration>;
3392#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
3393 template<
typename _Duration,
typename _TimeZonePtr, __format::__
char _CharT>
3394 struct formatter<
chrono::zoned_time<_Duration, _TimeZonePtr>, _CharT>
3395 : formatter<chrono::__detail::__local_time_fmt_for<_Duration>, _CharT>
3397 template<
typename _Out>
3398 typename basic_format_context<_Out, _CharT>::iterator
3399 format(
const chrono::zoned_time<_Duration, _TimeZonePtr>& __tp,
3400 basic_format_context<_Out, _CharT>& __fc)
const
3402 using _Ltf = chrono::__detail::__local_time_fmt_for<_Duration>;
3403 using _Base = formatter<_Ltf, _CharT>;
3404 const chrono::sys_info __info = __tp.get_info();
3405 const auto __lf = chrono::local_time_format(__tp.get_local_time(),
3408 return _Base::format(__lf, __fc);
3412#if __glibcxx_print >= 202406L
3415 template<
typename _Duration>
3417 enable_nonlocking_formatter_optimization<
3418 chrono::zoned_time<_Duration, const chrono::time_zone*>>
3419 = enable_nonlocking_formatter_optimization<_Duration>;
3431 template<
typename _Duration = seconds>
3434 static_assert(is_same_v<common_type_t<_Duration, seconds>, _Duration>);
3437 _Parser(__format::_ChronoParts __need) : _M_need(__need) { }
3439 _Parser(_Parser&&) =
delete;
3440 void operator=(_Parser&&) =
delete;
3442 _Duration _M_time{};
3443 sys_days _M_sys_days{};
3444 year_month_day _M_ymd{};
3446 __format::_ChronoParts _M_need;
3447 unsigned _M_is_leap_second : 1 {};
3448 unsigned _M_reserved : 15 {};
3450 template<
typename _CharT,
typename _Traits,
typename _Alloc>
3451 basic_istream<_CharT, _Traits>&
3452 operator()(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3453 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3454 minutes* __offset =
nullptr);
3459 template<
typename _CharT,
typename _Traits>
3460 static int_least32_t
3461 _S_read_unsigned(basic_istream<_CharT, _Traits>& __is,
3462 ios_base::iostate& __err,
int __n)
3464 int_least32_t __val = _S_try_read_digit(__is, __err);
3465 if (__val == -1) [[unlikely]]
3466 __err |= ios_base::failbit;
3471 for (
int __i = 1; __i < __n1; ++__i)
3472 if (
auto __dig = _S_try_read_digit(__is, __err); __dig != -1)
3478 while (__n1++ < __n) [[unlikely]]
3479 if (
auto __dig = _S_try_read_digit(__is, __err); __dig != -1)
3481 if (__builtin_mul_overflow(__val, 10, &__val)
3482 || __builtin_add_overflow(__val, __dig, &__val))
3484 __err |= ios_base::failbit;
3494 template<
typename _CharT,
typename _Traits>
3495 static int_least32_t
3496 _S_read_signed(basic_istream<_CharT, _Traits>& __is,
3497 ios_base::iostate& __err,
int __n)
3499 auto __sign = __is.peek();
3500 if (__sign ==
'-' || __sign ==
'+')
3502 int_least32_t __val = _S_read_unsigned(__is, __err, __n);
3503 if (__err & ios_base::failbit)
3505 if (__sign ==
'-') [[unlikely]]
3513 template<
typename _CharT,
typename _Traits>
3514 static int_least32_t
3515 _S_try_read_digit(basic_istream<_CharT, _Traits>& __is,
3516 ios_base::iostate& __err)
3518 int_least32_t __val = -1;
3519 auto __i = __is.peek();
3520 if (!_Traits::eq_int_type(__i, _Traits::eof())) [[likely]]
3522 _CharT __c = _Traits::to_char_type(__i);
3523 if (_CharT(
'0') <= __c && __c <= _CharT(
'9')) [[likely]]
3526 __val = __c - _CharT(
'0');
3530 __err |= ios_base::eofbit;
3536 template<
typename _CharT,
typename _Traits>
3538 _S_read_chr(basic_istream<_CharT, _Traits>& __is,
3539 ios_base::iostate& __err, _CharT __c)
3541 auto __i = __is.peek();
3542 if (_Traits::eq_int_type(__i, _Traits::eof()))
3543 __err |= ios_base::eofbit;
3544 else if (_Traits::to_char_type(__i) == __c) [[likely]]
3549 __err |= ios_base::failbit;
3554 template<
typename _Duration>
3555 using _Parser_t = _Parser<common_type_t<_Duration, seconds>>;
3557 template<
typename _Duration>
3561 if constexpr (_Duration::period::den == 1)
3563 switch (_Duration::period::num)
3565 case minutes::period::num:
3566 case hours::period::num:
3567 case days::period::num:
3568 case weeks::period::num:
3569 case years::period::num:
3586 template<
typename _ToDur,
typename _Tp>
3588 __round(
const _Tp& __t)
3590 if constexpr (__is_duration_v<_Tp>)
3592 if constexpr (treat_as_floating_point_v<typename _Tp::rep>)
3594 else if constexpr (__detail::__use_floor<_ToDur>())
3601 static_assert(__is_time_point_v<_Tp>);
3602 using _Tpt = time_point<typename _Tp::clock, _ToDur>;
3603 return _Tpt(__detail::__round<_ToDur>(__t.time_since_epoch()));
3610 template<
typename _CharT,
typename _Traits,
typename _Rep,
typename _Period,
3611 typename _Alloc = allocator<_CharT>>
3612 inline basic_istream<_CharT, _Traits>&
3613 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3615 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3618 auto __need = __format::_ChronoParts::_TimeOfDay;
3619 __detail::_Parser_t<duration<_Rep, _Period>> __p(__need);
3620 if (__p(__is, __fmt, __abbrev, __offset))
3621 __d = __detail::__round<duration<_Rep, _Period>>(__p._M_time);
3625 template<
typename _CharT,
typename _Traits>
3626 inline basic_ostream<_CharT, _Traits>&
3627 operator<<(basic_ostream<_CharT, _Traits>& __os,
const day& __d)
3629 using _Ctx = __format::__format_context<_CharT>;
3630 using _Str = basic_string_view<_CharT>;
3631 _Str __s = _GLIBCXX_WIDEN(
"{:02d} is not a valid day");
3633 __s = __s.substr(0, 6);
3634 auto __u = (unsigned)__d;
3635 __os << std::vformat(__s, make_format_args<_Ctx>(__u));
3639 template<
typename _CharT,
typename _Traits,
3640 typename _Alloc = allocator<_CharT>>
3641 inline basic_istream<_CharT, _Traits>&
3642 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3644 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3647 __detail::_Parser<> __p(__format::_ChronoParts::_Day);
3648 if (__p(__is, __fmt, __abbrev, __offset))
3649 __d = __p._M_ymd.day();
3653 template<
typename _CharT,
typename _Traits>
3654 inline basic_ostream<_CharT, _Traits>&
3655 operator<<(basic_ostream<_CharT, _Traits>& __os,
const month& __m)
3657 using _Ctx = __format::__format_context<_CharT>;
3658 using _Str = basic_string_view<_CharT>;
3659 _Str __s = _GLIBCXX_WIDEN(
"{:L%b}{} is not a valid month");
3661 __os << std::vformat(__os.getloc(), __s.substr(0, 6),
3662 make_format_args<_Ctx>(__m));
3665 auto __u = (unsigned)__m;
3666 __os << std::vformat(__s.substr(6), make_format_args<_Ctx>(__u));
3671 template<
typename _CharT,
typename _Traits,
3672 typename _Alloc = allocator<_CharT>>
3673 inline basic_istream<_CharT, _Traits>&
3674 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3676 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3679 __detail::_Parser<> __p(__format::_ChronoParts::_Month);
3680 if (__p(__is, __fmt, __abbrev, __offset))
3681 __m = __p._M_ymd.month();
3685 template<
typename _CharT,
typename _Traits>
3686 inline basic_ostream<_CharT, _Traits>&
3687 operator<<(basic_ostream<_CharT, _Traits>& __os,
const year& __y)
3689 using _Ctx = __format::__format_context<_CharT>;
3690 using _Str = basic_string_view<_CharT>;
3691 _Str __s = _GLIBCXX_WIDEN(
"-{:04d} is not a valid year");
3693 __s = __s.substr(0, 7);
3695 if (__i >= 0) [[likely]]
3696 __s.remove_prefix(1);
3699 __os << std::vformat(__s, make_format_args<_Ctx>(__i));
3703 template<
typename _CharT,
typename _Traits,
3704 typename _Alloc = allocator<_CharT>>
3705 inline basic_istream<_CharT, _Traits>&
3706 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3708 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3711 __detail::_Parser<> __p(__format::_ChronoParts::_Year);
3712 if (__p(__is, __fmt, __abbrev, __offset))
3713 __y = __p._M_ymd.year();
3717 template<
typename _CharT,
typename _Traits>
3718 inline basic_ostream<_CharT, _Traits>&
3719 operator<<(basic_ostream<_CharT, _Traits>& __os,
const weekday& __wd)
3721 using _Ctx = __format::__format_context<_CharT>;
3722 using _Str = basic_string_view<_CharT>;
3723 _Str __s = _GLIBCXX_WIDEN(
"{:L%a}{} is not a valid weekday");
3725 __os << std::vformat(__os.getloc(), __s.substr(0, 6),
3726 make_format_args<_Ctx>(__wd));
3729 auto __c = __wd.c_encoding();
3730 __os << std::vformat(__s.substr(6), make_format_args<_Ctx>(__c));
3735 template<
typename _CharT,
typename _Traits,
3736 typename _Alloc = allocator<_CharT>>
3737 inline basic_istream<_CharT, _Traits>&
3738 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3740 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3743 __detail::_Parser<> __p(__format::_ChronoParts::_Weekday);
3744 if (__p(__is, __fmt, __abbrev, __offset))
3749 template<
typename _CharT,
typename _Traits>
3750 inline basic_ostream<_CharT, _Traits>&
3751 operator<<(basic_ostream<_CharT, _Traits>& __os,
3752 const weekday_indexed& __wdi)
3757 basic_stringstream<_CharT> __os2;
3758 __os2.imbue(__os.getloc());
3759 __os2 << __wdi.weekday();
3760 const auto __i = __wdi.index();
3761 basic_string_view<_CharT> __s
3762 = _GLIBCXX_WIDEN(
"[ is not a valid index]");
3764 __os2 << std::format(_GLIBCXX_WIDEN(
"{}"), __i);
3765 if (__i >= 1 && __i <= 5)
3766 __os2 << __s.back();
3768 __os2 << __s.substr(1);
3769 __os << __os2.view();
3773 template<
typename _CharT,
typename _Traits>
3774 inline basic_ostream<_CharT, _Traits>&
3775 operator<<(basic_ostream<_CharT, _Traits>& __os,
3776 const weekday_last& __wdl)
3779 basic_stringstream<_CharT> __os2;
3780 __os2.imbue(__os.getloc());
3781 __os2 << __wdl.weekday() << _GLIBCXX_WIDEN(
"[last]");
3782 __os << __os2.view();
3786 template<
typename _CharT,
typename _Traits>
3787 inline basic_ostream<_CharT, _Traits>&
3788 operator<<(basic_ostream<_CharT, _Traits>& __os,
const month_day& __md)
3791 basic_stringstream<_CharT> __os2;
3792 __os2.imbue(__os.getloc());
3793 __os2 << __md.month();
3794 if constexpr (is_same_v<_CharT, char>)
3798 __os2 << __md.day();
3799 __os << __os2.view();
3803 template<
typename _CharT,
typename _Traits,
3804 typename _Alloc = allocator<_CharT>>
3805 inline basic_istream<_CharT, _Traits>&
3806 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3808 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3811 using __format::_ChronoParts;
3812 auto __need = _ChronoParts::_Month | _ChronoParts::_Day;
3813 __detail::_Parser<> __p(__need);
3814 if (__p(__is, __fmt, __abbrev, __offset))
3815 __md = month_day(__p._M_ymd.month(), __p._M_ymd.day());
3819 template<
typename _CharT,
typename _Traits>
3820 inline basic_ostream<_CharT, _Traits>&
3821 operator<<(basic_ostream<_CharT, _Traits>& __os,
3822 const month_day_last& __mdl)
3825 basic_stringstream<_CharT> __os2;
3826 __os2.imbue(__os.getloc());
3827 __os2 << __mdl.month() << _GLIBCXX_WIDEN(
"/last");
3828 __os << __os2.view();
3832 template<
typename _CharT,
typename _Traits>
3833 inline basic_ostream<_CharT, _Traits>&
3834 operator<<(basic_ostream<_CharT, _Traits>& __os,
3835 const month_weekday& __mwd)
3838 basic_stringstream<_CharT> __os2;
3839 __os2.imbue(__os.getloc());
3840 __os2 << __mwd.month();
3841 if constexpr (is_same_v<_CharT, char>)
3845 __os2 << __mwd.weekday_indexed();
3846 __os << __os2.view();
3850 template<
typename _CharT,
typename _Traits>
3851 inline basic_ostream<_CharT, _Traits>&
3852 operator<<(basic_ostream<_CharT, _Traits>& __os,
3853 const month_weekday_last& __mwdl)
3856 basic_stringstream<_CharT> __os2;
3857 __os2.imbue(__os.getloc());
3858 __os2 << __mwdl.month();
3859 if constexpr (is_same_v<_CharT, char>)
3863 __os2 << __mwdl.weekday_last();
3864 __os << __os2.view();
3868 template<
typename _CharT,
typename _Traits>
3869 inline basic_ostream<_CharT, _Traits>&
3870 operator<<(basic_ostream<_CharT, _Traits>& __os,
const year_month& __ym)
3873 basic_stringstream<_CharT> __os2;
3874 __os2.imbue(__os.getloc());
3875 __os2 << __ym.year();
3876 if constexpr (is_same_v<_CharT, char>)
3880 __os2 << __ym.month();
3881 __os << __os2.view();
3885 template<
typename _CharT,
typename _Traits,
3886 typename _Alloc = allocator<_CharT>>
3887 inline basic_istream<_CharT, _Traits>&
3888 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3890 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3893 using __format::_ChronoParts;
3894 auto __need = _ChronoParts::_Year | _ChronoParts::_Month;
3895 __detail::_Parser<> __p(__need);
3896 if (__p(__is, __fmt, __abbrev, __offset))
3897 __ym = year_month(__p._M_ymd.year(), __p._M_ymd.month());
3901 template<
typename _CharT,
typename _Traits>
3902 inline basic_ostream<_CharT, _Traits>&
3903 operator<<(basic_ostream<_CharT, _Traits>& __os,
3904 const year_month_day& __ymd)
3906 using _Ctx = __format::__format_context<_CharT>;
3907 using _Str = basic_string_view<_CharT>;
3908 _Str __s = _GLIBCXX_WIDEN(
"{:%F} is not a valid date");
3909 __os << std::vformat(__ymd.ok() ? __s.substr(0, 5) : __s,
3910 make_format_args<_Ctx>(__ymd));
3914 template<
typename _CharT,
typename _Traits,
3915 typename _Alloc = allocator<_CharT>>
3916 inline basic_istream<_CharT, _Traits>&
3918 year_month_day& __ymd,
3922 using __format::_ChronoParts;
3923 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
3924 | _ChronoParts::_Day;
3925 __detail::_Parser<> __p(__need);
3926 if (__p(__is, __fmt, __abbrev, __offset))
3931 template<
typename _CharT,
typename _Traits>
3934 const year_month_day_last& __ymdl)
3939 __os2 << __ymdl.year();
3940 if constexpr (is_same_v<_CharT, char>)
3944 __os2 << __ymdl.month_day_last();
3945 __os << __os2.view();
3949 template<
typename _CharT,
typename _Traits>
3950 inline basic_ostream<_CharT, _Traits>&
3951 operator<<(basic_ostream<_CharT, _Traits>& __os,
3952 const year_month_weekday& __ymwd)
3956 basic_stringstream<_CharT> __os2;
3957 __os2.
imbue(__os.getloc());
3959 if constexpr (is_same_v<_CharT, char>)
3963 __os2 << __ymwd.year() << __slash << __ymwd.month() << __slash
3964 << __ymwd.weekday_indexed();
3965 __os << __os2.view();
3969 template<
typename _CharT,
typename _Traits>
3970 inline basic_ostream<_CharT, _Traits>&
3971 operator<<(basic_ostream<_CharT, _Traits>& __os,
3972 const year_month_weekday_last& __ymwdl)
3976 basic_stringstream<_CharT> __os2;
3977 __os2.imbue(__os.getloc());
3979 if constexpr (is_same_v<_CharT, char>)
3983 __os2 << __ymwdl.year() << __slash << __ymwdl.month() << __slash
3984 << __ymwdl.weekday_last();
3985 __os << __os2.view();
3989 template<
typename _CharT,
typename _Traits,
typename _Duration>
3990 inline basic_ostream<_CharT, _Traits>&
3991 operator<<(basic_ostream<_CharT, _Traits>& __os,
3994 return __os << format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%T}"), __hms);
3997#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
3999 template<
typename _CharT,
typename _Traits>
4000 basic_ostream<_CharT, _Traits>&
4001 operator<<(basic_ostream<_CharT, _Traits>& __os,
const sys_info& __i)
4003 return __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{}"), __i);
4007 template<
typename _CharT,
typename _Traits>
4008 basic_ostream<_CharT, _Traits>&
4009 operator<<(basic_ostream<_CharT, _Traits>& __os,
const local_info& __li)
4011 __os << __format::_Separators<_CharT>::_S_squares()[0];
4012 if (__li.result == local_info::unique)
4016 if (__li.result == local_info::nonexistent)
4017 __os << _GLIBCXX_WIDEN(
"nonexistent");
4019 __os << _GLIBCXX_WIDEN(
"ambiguous");
4020 __os << _GLIBCXX_WIDEN(
" local time between ") << __li.first;
4021 __os << _GLIBCXX_WIDEN(
" and ") << __li.second;
4023 __os << __format::_Separators<_CharT>::_S_squares()[1];
4027 template<
typename _CharT,
typename _Traits,
typename _Duration,
4028 typename _TimeZonePtr>
4029 inline basic_ostream<_CharT, _Traits>&
4030 operator<<(basic_ostream<_CharT, _Traits>& __os,
4031 const zoned_time<_Duration, _TimeZonePtr>& __t)
4033 __os << format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T %Z}"), __t);
4038 template<
typename _CharT,
typename _Traits,
typename _Duration>
4039 requires (!treat_as_floating_point_v<typename _Duration::rep>)
4040 && ratio_less_v<typename _Duration::period, days::period>
4041 inline basic_ostream<_CharT, _Traits>&
4042 operator<<(basic_ostream<_CharT, _Traits>& __os,
4043 const sys_time<_Duration>& __tp)
4045 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __tp);
4049 template<
typename _CharT,
typename _Traits>
4050 inline basic_ostream<_CharT, _Traits>&
4051 operator<<(basic_ostream<_CharT, _Traits>& __os,
const sys_days& __dp)
4053 __os << year_month_day{__dp};
4057 template<
typename _CharT,
typename _Traits,
typename _Duration,
4058 typename _Alloc = allocator<_CharT>>
4059 basic_istream<_CharT, _Traits>&
4060 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
4061 sys_time<_Duration>& __tp,
4062 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
4068 using __format::_ChronoParts;
4069 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
4070 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
4071 __detail::_Parser_t<_Duration> __p(__need);
4072 if (__p(__is, __fmt, __abbrev, __offset))
4074 if (__p._M_is_leap_second)
4078 auto __st = __p._M_sys_days + __p._M_time - *__offset;
4079 __tp = __detail::__round<_Duration>(__st);
4085 template<
typename _CharT,
typename _Traits,
typename _Duration>
4086 inline basic_ostream<_CharT, _Traits>&
4087 operator<<(basic_ostream<_CharT, _Traits>& __os,
4088 const utc_time<_Duration>& __t)
4090 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
4094 template<
typename _CharT,
typename _Traits,
typename _Duration,
4095 typename _Alloc = allocator<_CharT>>
4096 inline basic_istream<_CharT, _Traits>&
4097 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
4098 utc_time<_Duration>& __tp,
4099 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
4105 using __format::_ChronoParts;
4106 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
4107 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
4108 __detail::_Parser_t<_Duration> __p(__need);
4109 if (__p(__is, __fmt, __abbrev, __offset))
4113 auto __ut = utc_clock::from_sys(__p._M_sys_days) + __p._M_time
4115 __tp = __detail::__round<_Duration>(__ut);
4120 template<
typename _CharT,
typename _Traits,
typename _Duration>
4121 inline basic_ostream<_CharT, _Traits>&
4122 operator<<(basic_ostream<_CharT, _Traits>& __os,
4123 const tai_time<_Duration>& __t)
4125 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
4129 template<
typename _CharT,
typename _Traits,
typename _Duration,
4130 typename _Alloc = allocator<_CharT>>
4131 inline basic_istream<_CharT, _Traits>&
4132 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
4133 tai_time<_Duration>& __tp,
4134 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
4140 using __format::_ChronoParts;
4141 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
4142 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
4143 __detail::_Parser_t<_Duration> __p(__need);
4144 if (__p(__is, __fmt, __abbrev, __offset))
4146 if (__p._M_is_leap_second)
4150 constexpr sys_days __epoch(-
days(4383));
4151 auto __d = __p._M_sys_days - __epoch + __p._M_time - *__offset;
4152 tai_time<common_type_t<_Duration, seconds>> __tt(__d);
4153 __tp = __detail::__round<_Duration>(__tt);
4159 template<
typename _CharT,
typename _Traits,
typename _Duration>
4160 inline basic_ostream<_CharT, _Traits>&
4161 operator<<(basic_ostream<_CharT, _Traits>& __os,
4162 const gps_time<_Duration>& __t)
4164 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
4168 template<
typename _CharT,
typename _Traits,
typename _Duration,
4169 typename _Alloc = allocator<_CharT>>
4170 inline basic_istream<_CharT, _Traits>&
4171 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
4172 gps_time<_Duration>& __tp,
4173 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
4179 using __format::_ChronoParts;
4180 auto __need = _ChronoParts::_YearMonthDay | _ChronoParts::_TimeOfDay;
4181 __detail::_Parser_t<_Duration> __p(__need);
4182 if (__p(__is, __fmt, __abbrev, __offset))
4184 if (__p._M_is_leap_second)
4188 constexpr sys_days __epoch(
days(3657));
4189 auto __d = __p._M_sys_days - __epoch + __p._M_time - *__offset;
4190 gps_time<common_type_t<_Duration, seconds>> __gt(__d);
4191 __tp = __detail::__round<_Duration>(__gt);
4197 template<
typename _CharT,
typename _Traits,
typename _Duration>
4198 inline basic_ostream<_CharT, _Traits>&
4199 operator<<(basic_ostream<_CharT, _Traits>& __os,
4200 const file_time<_Duration>& __t)
4202 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
4206 template<
typename _CharT,
typename _Traits,
typename _Duration,
4207 typename _Alloc = allocator<_CharT>>
4208 inline basic_istream<_CharT, _Traits>&
4209 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
4210 file_time<_Duration>& __tp,
4211 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
4214 sys_time<_Duration> __st;
4215 if (chrono::from_stream(__is, __fmt, __st, __abbrev, __offset))
4216 __tp = __detail::__round<_Duration>(file_clock::from_sys(__st));
4220 template<
typename _CharT,
typename _Traits,
typename _Duration>
4221 inline basic_ostream<_CharT, _Traits>&
4222 operator<<(basic_ostream<_CharT, _Traits>& __os,
4223 const local_time<_Duration>& __lt)
4226 requires requires(
const sys_time<_Duration>& __st) { __os << __st; }
4228 __os << sys_time<_Duration>{__lt.time_since_epoch()};
4232 template<
typename _CharT,
typename _Traits,
typename _Duration,
4233 typename _Alloc = allocator<_CharT>>
4234 basic_istream<_CharT, _Traits>&
4235 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
4236 local_time<_Duration>& __tp,
4237 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
4240 using __format::_ChronoParts;
4241 auto __need = _ChronoParts::_YearMonthDay | _ChronoParts::_TimeOfDay;
4242 __detail::_Parser_t<_Duration> __p(__need);
4243 if (__p(__is, __fmt, __abbrev, __offset))
4245 days __d = __p._M_sys_days.time_since_epoch();
4246 auto __t = local_days(__d) + __p._M_time;
4247 __tp = __detail::__round<_Duration>(__t);
4258 void from_stream() =
delete;
4260 template<
typename _Parsable,
typename _CharT,
4261 typename _Traits = std::char_traits<_CharT>,
4262 typename... _OptArgs>
4263 concept __parsable =
requires (basic_istream<_CharT, _Traits>& __is,
4264 const _CharT* __fmt, _Parsable& __tp,
4265 _OptArgs*... __args)
4266 { from_stream(__is, __fmt, __tp, __args...); };
4268 template<
typename _Parsable,
typename _CharT,
4269 typename _Traits = char_traits<_CharT>,
4270 typename _Alloc = allocator<_CharT>>
4274 using __string_type = basic_string<_CharT, _Traits, _Alloc>;
4277 _Parse(
const _CharT* __fmt, _Parsable& __tp,
4278 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
4281 _M_abbrev(__abbrev), _M_offset(__offset)
4284 _Parse(_Parse&&) =
delete;
4285 _Parse& operator=(_Parse&&) =
delete;
4288 using __stream_type = basic_istream<_CharT, _Traits>;
4290 const _CharT*
const _M_fmt;
4291 _Parsable*
const _M_tp;
4292 __string_type*
const _M_abbrev;
4295 friend __stream_type&
4296 operator>>(__stream_type& __is, _Parse&& __p)
4299 from_stream(__is, __p._M_fmt, *__p._M_tp, __p._M_abbrev,
4301 else if (__p._M_abbrev)
4302 from_stream(__is, __p._M_fmt, *__p._M_tp, __p._M_abbrev);
4304 from_stream(__is, __p._M_fmt, *__p._M_tp);
4308 friend void operator>>(__stream_type&, _Parse&) =
delete;
4309 friend void operator>>(__stream_type&,
const _Parse&) =
delete;
4313 template<
typename _CharT, __detail::__parsable<_CharT> _Parsable>
4314 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
4316 parse(
const _CharT* __fmt, _Parsable& __tp)
4317 {
return __detail::_Parse<_Parsable, _CharT>(__fmt, __tp); }
4319 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4320 __detail::__parsable<_CharT, _Traits> _Parsable>
4323 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp)
4325 return __detail::_Parse<_Parsable, _CharT, _Traits>(__fmt.c_str(), __tp);
4328 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4329 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
4330 __detail::__parsable<_CharT, _Traits, _StrT> _Parsable>
4331 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
4333 parse(
const _CharT* __fmt, _Parsable& __tp,
4334 basic_string<_CharT, _Traits, _Alloc>& __abbrev)
4337 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt, __tp,
4341 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4342 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
4343 __detail::__parsable<_CharT, _Traits, _StrT> _Parsable>
4346 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp,
4347 basic_string<_CharT, _Traits, _Alloc>& __abbrev)
4350 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt.c_str(),
4354 template<
typename _CharT,
typename _Traits =
char_traits<_CharT>,
4355 typename _StrT = basic_
string<_CharT, _Traits>,
4356 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
4357 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
4359 parse(
const _CharT* __fmt, _Parsable& __tp,
minutes& __offset)
4361 return __detail::_Parse<_Parsable, _CharT>(__fmt, __tp,
nullptr,
4365 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4366 typename _StrT = basic_string<_CharT, _Traits>,
4367 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
4370 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp,
4373 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt.c_str(),
4378 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4379 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
4380 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
4381 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
4383 parse(
const _CharT* __fmt, _Parsable& __tp,
4384 basic_string<_CharT, _Traits, _Alloc>& __abbrev,
minutes& __offset)
4387 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt, __tp,
4392 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4393 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
4394 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
4397 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp,
4398 basic_string<_CharT, _Traits, _Alloc>& __abbrev,
minutes& __offset)
4401 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt.c_str(),
4407 template<
typename _Duration>
4408 template<
typename _CharT,
typename _Traits,
typename _Alloc>
4409 basic_istream<_CharT, _Traits>&
4410 __detail::_Parser<_Duration>::
4411 operator()(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
4412 basic_string<_CharT, _Traits, _Alloc>* __abbrev,
4415 using sentry =
typename basic_istream<_CharT, _Traits>::sentry;
4417 if (sentry __cerb(__is,
true); __cerb)
4419 locale __loc = __is.getloc();
4424 struct _Stream_state
4427 _Stream_state(basic_istream<_CharT, _Traits>& __i)
4429 _M_flags(__i.flags(ios_base::
skipws | ios_base::
dec)),
4435 _M_is.flags(_M_flags);
4439 _Stream_state(_Stream_state&&) =
delete;
4441 basic_istream<_CharT, _Traits>& _M_is;
4442 ios_base::fmtflags _M_flags;
4452 auto __read_unsigned = [&] (
int __n) {
4453 return _S_read_unsigned(__is, __err, __n);
4458 auto __read_signed = [&] (
int __n) {
4459 return _S_read_signed(__is, __err, __n);
4463 auto __read_chr = [&__is, &__err] (_CharT __c) {
4464 return _S_read_chr(__is, __err, __c);
4467 using __format::_ChronoParts;
4468 _ChronoParts __parts{};
4470 const year __bad_y = --year::min();
4471 const month __bad_mon(255);
4472 const day __bad_day(255);
4473 const weekday __bad_wday(255);
4474 const hours __bad_h(-1);
4475 const minutes __bad_min(-9999);
4478 year __y = __bad_y, __yy = __bad_y;
4479 year __iso_y = __bad_y, __iso_yy = __bad_y;
4480 month __m = __bad_mon;
4481 day __d = __bad_day;
4482 weekday __wday = __bad_wday;
4483 hours __h = __bad_h, __h12 = __bad_h;
4485 _Duration __s = __bad_sec;
4487 int __iso_wk = -1, __sunday_wk = -1, __monday_wk = -1;
4489 int __dayofyear = -1;
4491 minutes __tz_offset = __bad_min;
4492 basic_string<_CharT, _Traits> __tz_abbr;
4494 if ((_M_need & _ChronoParts::_TimeOfDay) != 0
4495 && (_M_need & _ChronoParts::_Year) != 0)
4501 __parts = _ChronoParts::_TimeOfDay;
4508 bool __is_flag =
false;
4510 constexpr bool __is_floating
4511 = treat_as_floating_point_v<typename _Duration::rep>;
4530 _CharT __c = *__fmt++;
4537 else if (!__read_chr(__c)) [[unlikely]]
4548 if (__mod || __num) [[unlikely]]
4553 __tmget.get(__is, {}, __is, __err, &__tm,
4555 if (!__is_failed(__err))
4556 __wday = weekday(__tm.tm_wday);
4558 __parts |= _ChronoParts::_Weekday;
4564 if (__mod || __num) [[unlikely]]
4572 __tmget.get(__is, {}, __is, __err, &__tm,
4574 if (!__is_failed(__err))
4575 __m = month(__tm.tm_mon + 1);
4577 __parts |= _ChronoParts::_Month;
4581 if (__mod ==
'O' || __num) [[unlikely]]
4586 __tmget.get(__is, {}, __is, __err, &__tm,
4587 __fmt - 2 - (__mod ==
'E'), __fmt);
4588 if (!__is_failed(__err))
4590 __y = year(__tm.tm_year + 1900);
4591 __m = month(__tm.tm_mon + 1);
4592 __d = day(__tm.tm_mday);
4593 __h =
hours(__tm.tm_hour);
4598 __parts |= _ChronoParts::_DateTime;
4602 if (!__mod) [[likely]]
4604 auto __v = __read_signed(__num ? __num : 2);
4605 if (!__is_failed(__err))
4607 int __cmin = (int)year::min() / 100;
4608 int __cmax = (int)year::max() / 100;
4609 if (__cmin <= __v && __v <= __cmax)
4610 __century = __v * 100;
4615 else if (__mod ==
'E')
4618 __tmget.get(__is, {}, __is, __err, &__tm,
4620 if (!__is_failed(__err))
4621 __century = __tm.tm_year;
4630 if (!__mod) [[likely]]
4632 auto __v = __read_unsigned(__num ? __num : 2);
4633 if (!__is_failed(__err))
4636 else if (__mod ==
'O')
4639 __tmget.get(__is, {}, __is, __err, &__tm,
4641 if (!__is_failed(__err))
4642 __d = day(__tm.tm_mday);
4646 __parts |= _ChronoParts::_Day;
4650 if (__mod || __num) [[unlikely]]
4654 auto __month = __read_unsigned(2);
4656 auto __day = __read_unsigned(2);
4658 auto __year = __read_unsigned(2);
4659 if (__is_failed(__err))
4661 __y = year(__year + 1900 + 100 *
int(__year < 69));
4662 __m = month(__month);
4664 if (!year_month_day(__y, __m, __d).ok())
4666 __y = __yy = __iso_y = __iso_yy = __bad_y;
4672 __parts |= _ChronoParts::_Date;
4676 if (__mod) [[unlikely]]
4680 auto __year = __read_signed(__num ? __num : 4);
4682 auto __month = __read_unsigned(2);
4684 auto __day = __read_unsigned(2);
4685 if (__is_failed(__err))
4688 __m = month(__month);
4690 if (!year_month_day(__y, __m, __d).ok())
4692 __y = __yy = __iso_y = __iso_yy = __bad_y;
4698 __parts |= _ChronoParts::_Date;
4702 if (__mod) [[unlikely]]
4706 auto __val = __read_unsigned(__num ? __num : 2);
4707 if (__val >= 0 && __val <= 99)
4709 __iso_yy = year(__val);
4710 if (__century == -1)
4714 __iso_yy = __iso_y = __y = __yy = __bad_y;
4716 __parts |= _ChronoParts::_Year;
4720 if (__mod) [[unlikely]]
4723 __iso_y = year(__read_unsigned(__num ? __num : 4));
4724 __parts |= _ChronoParts::_Year;
4729 if (__mod ==
'E') [[unlikely]]
4731 else if (__mod ==
'O')
4736 __tmget.get(__is, {}, __is, __err, &__tm,
4738 if (!__is_failed(__err))
4742 __h12 =
hours(__tm.tm_hour);
4746 __h =
hours(__tm.tm_hour);
4755 auto __val = __read_unsigned(__num ? __num : 2);
4756 if (__c ==
'I' && __val >= 1 && __val <= 12)
4758 __h12 =
hours(__val);
4761 else if (__c ==
'H' && __val >= 0 && __val <= 23)
4768 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4773 __parts |= _ChronoParts::_TimeOfDay;
4777 if (__mod) [[unlikely]]
4779 else if (_M_need == _ChronoParts::_TimeOfDay)
4781 auto __val = __read_signed(__num ? __num : 3);
4782 if (!__is_failed(__err))
4785 __parts |= _ChronoParts::_TimeOfDay;
4790 __dayofyear = __read_unsigned(__num ? __num : 3);
4797 if (__mod ==
'E') [[unlikely]]
4799 else if (__mod ==
'O')
4802 __tmget.get(__is, {}, __is, __err, &__tm,
4804 if (!__is_failed(__err))
4805 __m = month(__tm.tm_mon + 1);
4809 auto __val = __read_unsigned(__num ? __num : 2);
4810 if (__val >= 1 && __val <= 12)
4815 __parts |= _ChronoParts::_Month;
4819 if (__mod ==
'E') [[unlikely]]
4821 else if (__mod ==
'O')
4824 __tmget.get(__is, {}, __is, __err, &__tm,
4826 if (!__is_failed(__err))
4831 auto __val = __read_unsigned(__num ? __num : 2);
4832 if (0 <= __val && __val < 60)
4836 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4841 __parts |= _ChronoParts::_TimeOfDay;
4851 const _CharT* __ampms[2];
4852 __tmpunct._M_am_pm(__ampms);
4853 int __n = 0, __which = 3;
4854 while (__which != 0)
4856 auto __i = __is.peek();
4857 if (_Traits::eq_int_type(__i, _Traits::eof()))
4867 else if (__ampms[0][__n + 1] == _CharT())
4878 else if (__ampms[1][__n + 1] == _CharT())
4889 if (__which == 0 || __which == 3)
4902 __tmget.get(__is, {}, __is, __err, &__tm,
4904 if (!__is_failed(__err))
4906 __h =
hours(__tm.tm_hour);
4911 __parts |= _ChronoParts::_TimeOfDay;
4916 if (__mod || __num) [[unlikely]]
4923 auto __val = __read_unsigned(2);
4924 if (__val == -1 || __val > 23) [[unlikely]]
4926 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4930 if (!__read_chr(
':')) [[unlikely]]
4934 __val = __read_unsigned(2);
4935 if (__val == -1 || __val > 60) [[unlikely]]
4937 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4945 __parts |= _ChronoParts::_TimeOfDay;
4948 else if (!__read_chr(
':')) [[unlikely]]
4954 if (__mod ==
'E') [[unlikely]]
4956 else if (__mod ==
'O')
4959 __tmget.get(__is, {}, __is, __err, &__tm,
4961 if (!__is_failed(__err))
4964 else if constexpr (_Duration::period::den == 1
4967 auto __val = __read_unsigned(__num ? __num : 2);
4968 if (0 <= __val && __val <= 59) [[likely]]
4972 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4979 basic_stringstream<_CharT> __buf;
4980 auto __digit = _S_try_read_digit(__is, __err);
4983 __buf.put(_CharT(
'0') + __digit);
4984 __digit = _S_try_read_digit(__is, __err);
4986 __buf.put(_CharT(
'0') + __digit);
4989 auto __i = __is.peek();
4990 if (_Traits::eq_int_type(__i, _Traits::eof()))
4998 __dp = __np.decimal_point();
5000 _CharT __c = _Traits::to_char_type(__i);
5006 = hh_mm_ss<_Duration>::fractional_width;
5009 __digit = _S_try_read_digit(__is, __err);
5011 __buf.put(_CharT(
'0') + __digit);
5019 if (!__is_failed(__err)) [[likely]]
5021 long double __val{};
5022#if __cpp_lib_to_chars
5024 auto __first = __str.data();
5025 auto __last = __first + __str.size();
5029 if ((
bool)ec || ptr != __last) [[unlikely]]
5037 if constexpr (__is_floating)
5044 __parts |= _ChronoParts::_TimeOfDay;
5049 if (__mod ==
'E') [[unlikely]]
5051 else if (__mod ==
'O')
5056 __tmget.get(__is, {}, __is, __err, &__tm,
5058 if (!__is_failed(__err))
5059 __wday = weekday(__tm.tm_wday);
5066 const int __lo = __c ==
'u' ? 1 : 0;
5067 const int __hi = __lo + 6;
5068 auto __val = __read_unsigned(__num ? __num : 1);
5069 if (__lo <= __val && __val <= __hi)
5070 __wday = weekday(__val);
5073 __wday = __bad_wday;
5077 __parts |= _ChronoParts::_Weekday;
5083 if (__mod ==
'E') [[unlikely]]
5085 else if (__mod ==
'O')
5087 if (__c ==
'V') [[unlikely]]
5097 const int __lo = __c ==
'V' ? 1 : 0;
5098 const int __hi = 53;
5099 auto __val = __read_unsigned(__num ? __num : 2);
5100 if (__lo <= __val && __val <= __hi)
5105 __sunday_wk = __val;
5111 __monday_wk = __val;
5116 __iso_wk = __sunday_wk = __monday_wk = -1;
5122 if (__mod ==
'O' || __num) [[unlikely]]
5127 __tmget.get(__is, {}, __is, __err, &__tm,
5128 __fmt - 2 - (__mod ==
'E'), __fmt);
5129 if (!__is_failed(__err))
5131 __y = year(__tm.tm_year + 1900);
5132 __m = month(__tm.tm_mon + 1);
5133 __d = day(__tm.tm_mday);
5136 __parts |= _ChronoParts::_Date;
5140 if (__mod ==
'O' || __num) [[unlikely]]
5145 __tmget.get(__is, {}, __is, __err, &__tm,
5146 __fmt - 2 - (__mod ==
'E'), __fmt);
5147 if (!__is_failed(__err))
5149 __h =
hours(__tm.tm_hour);
5154 __parts |= _ChronoParts::_TimeOfDay;
5158 if (__mod) [[unlikely]]
5161 __tmget.get(__is, {}, __is, __err, &__tm,
5163 if (!__is_failed(__err))
5165 int __cent = __tm.tm_year < 2000 ? 1900 : 2000;
5166 __yy = year(__tm.tm_year - __cent);
5167 if (__century == -1)
5173 auto __val = __read_unsigned(__num ? __num : 2);
5174 if (__val >= 0 && __val <= 99)
5177 if (__century == -1)
5178 __century = __val < 69 ? 2000 : 1900;
5181 __y = __yy = __iso_yy = __iso_y = __bad_y;
5183 __parts |= _ChronoParts::_Year;
5187 if (__mod ==
'O') [[unlikely]]
5189 else if (__mod ==
'E')
5192 __tmget.get(__is, {}, __is, __err, &__tm,
5194 if (!__is_failed(__err))
5195 __y = year(__tm.tm_year);
5199 auto __val = __read_unsigned(__num ? __num : 4);
5200 if (!__is_failed(__err))
5203 __parts |= _ChronoParts::_Year;
5207 if (__num) [[unlikely]]
5214 auto __i = __is.peek();
5215 if (_Traits::eq_int_type(__i, _Traits::eof()))
5220 _CharT __ic = _Traits::to_char_type(__i);
5221 const bool __neg = __ic == _CharT(
'-');
5222 if (__ic == _CharT(
'-') || __ic == _CharT(
'+'))
5229 __hh = __read_unsigned(2);
5234 __hh = 10 * _S_try_read_digit(__is, __err);
5235 __hh += _S_try_read_digit(__is, __err);
5238 if (__is_failed(__err))
5242 if (_Traits::eq_int_type(__i, _Traits::eof()))
5245 __tz_offset =
minutes(__hh * (__neg ? -60 : 60));
5248 __ic = _Traits::to_char_type(__i);
5250 bool __read_mm =
false;
5253 if (__ic == _GLIBCXX_WIDEN(
":")[0])
5260 else if (_CharT(
'0') <= __ic && __ic <= _CharT(
'9'))
5266 int_least32_t __mm = 0;
5269 __mm = 10 * _S_try_read_digit(__is, __err);
5270 __mm += _S_try_read_digit(__is, __err);
5273 if (!__is_failed(__err))
5275 auto __z = __hh * 60 + __mm;
5276 __tz_offset =
minutes(__neg ? -__z : __z);
5282 if (__mod || __num) [[unlikely]]
5286 basic_string_view<_CharT> __x = _GLIBCXX_WIDEN(
"_/-+");
5290 auto __i = __is.peek();
5291 if (!_Traits::eq_int_type(__i, _Traits::eof()))
5293 _CharT __a = _Traits::to_char_type(__i);
5295 || __x.find(__a) != __x.npos)
5297 __tz_abbr.push_back(__a);
5306 if (__tz_abbr.empty())
5312 if (__mod || __num) [[unlikely]]
5316 _CharT __i = __is.peek();
5317 if (_Traits::eq_int_type(__i, _Traits::eof()))
5319 else if (
std::isspace(_Traits::to_char_type(__i), __loc))
5327 if (__mod || __num) [[unlikely]]
5331 _CharT __i = __is.peek();
5332 if (_Traits::eq_int_type(__i, _Traits::eof()))
5334 else if (
std::isspace(_Traits::to_char_type(__i), __loc))
5340 if (__mod || __num) [[unlikely]]
5348 if (__mod || __num) [[unlikely]]
5357 if (_CharT(
'1') <= __c && __c <= _CharT(
'9'))
5359 if (!__mod) [[likely]]
5362 auto __end = __fmt + _Traits::length(__fmt);
5364 = __format::__parse_integer(__fmt - 1, __end);
5365 if (__ptr) [[likely]]
5376 if (__is_failed(__err)) [[unlikely]]
5386 if (__yy != __bad_y && __y == __bad_y)
5387 __y =
years(__century) + __yy;
5388 if (__iso_yy != __bad_y && __iso_y == __bad_y)
5389 __iso_y =
years(__century) + __iso_yy;
5392 bool __can_use_doy =
false;
5393 bool __can_use_iso_wk =
false;
5394 bool __can_use_sun_wk =
false;
5395 bool __can_use_mon_wk =
false;
5398 if (__y != __bad_y && __dayofyear >= 0)
5400 __can_use_doy =
true;
5401 __parts |= _ChronoParts::_Date;
5403 else if (__y != __bad_y && __wday != __bad_wday && __sunday_wk >= 0)
5405 __can_use_sun_wk =
true;
5406 __parts |= _ChronoParts::_Date;
5408 else if (__y != __bad_y && __wday != __bad_wday && __monday_wk >= 0)
5410 __can_use_mon_wk =
true;
5411 __parts |= _ChronoParts::_Date;
5413 else if (__iso_y != __bad_y && __wday != __bad_wday && __iso_wk > 0)
5416 __can_use_iso_wk =
true;
5417 __parts |= _ChronoParts::_Date;
5420 if (__is_failed(__err)) [[unlikely]]
5422 else if (__is_flag) [[unlikely]]
5424 else if ((_M_need & __parts) == _M_need) [[likely]]
5446 const bool __need_wday = (_M_need & _ChronoParts::_Weekday) != 0;
5450 const bool __need_time = (_M_need & _ChronoParts::_TimeOfDay) != 0;
5452 if (__need_wday && __wday != __bad_wday)
5454 else if ((_M_need & _ChronoParts::_Date) != 0)
5458 const bool __need_ymd = !__need_wday && !__need_time;
5460 if (((_M_need & _ChronoParts::_Year) != 0 && __y == __bad_y)
5461 || ((_M_need & _ChronoParts::_Month) != 0 && __m == __bad_mon)
5462 || ((_M_need & _ChronoParts::_Day) != 0 && __d == __bad_day))
5469 if ((0 < __dayofyear && __dayofyear <= 365)
5470 || (__dayofyear == 366 && __y.is_leap()))
5473 _M_sys_days = sys_days(__y/January/1)
5474 +
days(__dayofyear - 1);
5476 _M_ymd = year_month_day(_M_sys_days);
5481 else if (__can_use_iso_wk)
5489 const sys_days __jan4(__iso_y/January/4);
5490 weekday __wd1(__jan4 -
days(3));
5491 if (__wd1 != Thursday)
5492 if (__wd1 != Wednesday || !__iso_y.is_leap())
5496 if (!__is_failed(__err)) [[likely]]
5499 sys_days __w(Thursday[1]/January/__iso_y);
5501 __w -= Thursday - Monday;
5503 __w += __wday - Monday;
5507 _M_ymd = year_month_day(_M_sys_days);
5510 else if (__can_use_sun_wk)
5513 sys_days __wk1(__y/January/Sunday[1]);
5514 _M_sys_days = __wk1 +
weeks(__sunday_wk - 1)
5515 +
days(__wday.c_encoding());
5516 _M_ymd = year_month_day(_M_sys_days);
5517 if (_M_ymd.year() != __y) [[unlikely]]
5520 else if (__can_use_mon_wk)
5523 sys_days __wk1(__y/January/Monday[1]);
5524 _M_sys_days = __wk1 +
weeks(__monday_wk - 1)
5525 +
days(__wday.c_encoding() - 1);
5526 _M_ymd = year_month_day(_M_sys_days);
5527 if (_M_ymd.year() != __y) [[unlikely]]
5539 if ((_M_need & _ChronoParts::_Year) != 0)
5541 if (!__y.ok()) [[unlikely]]
5544 else if (__y == __bad_y)
5547 if ((_M_need & _ChronoParts::_Month) != 0)
5549 if (!__m.ok()) [[unlikely]]
5552 else if (__m == __bad_mon)
5555 if ((_M_need & _ChronoParts::_Day) != 0)
5557 if (__d < day(1) || __d > (__y/__m/last).day())
5560 else if (__d == __bad_day)
5563 if (year_month_day __ymd(__y, __m, __d); __ymd.ok())
5566 if (__need_wday || __need_time)
5567 _M_sys_days = sys_days(_M_ymd);
5574 _M_wd = weekday(_M_sys_days);
5580 if (__h == __bad_h && __h12 != __bad_h)
5584 else if (__ampm == 2)
5585 __h = __h12 ==
hours(12) ? __h12 : __h12 +
hours(12);
5590 auto __t = _M_time.zero();
5599 if (__min != __bad_min)
5605 if (__s != __bad_sec)
5609 _M_is_leap_second = __s >=
seconds(60);
5618 if (!__is_failed(__err)) [[likely]]
5620 if (__offset && __tz_offset != __bad_min)
5621 *__offset = __tz_offset;
5622 if (__abbrev && !__tz_abbr.empty())
5630 __is.setstate(__err);
5634#undef _GLIBCXX_WIDEN
5639_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)
constexpr complex< _Tp > operator-(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x minus y.
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 bitset< _Nb > operator&(const bitset< _Nb > &__x, const bitset< _Nb > &__y) noexcept
Global bitwise operations on bitsets.
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.