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;
482 [[__gnu__::__always_inline__]]
484 _M_fill_aux(chrono::local_days __ld, _ChronoParts __parts)
486 using namespace chrono;
487 if ((__parts & _ChronoParts::_Weekday) != 0)
488 _M_weekday = weekday(__ld);
489 __parts -= _ChronoParts::_Weekday;
490 if ((__parts & _ChronoParts::_DayOfYear) != 0)
493 _M_day_of_year = __ld - local_days(_M_year/January/0);
494 __parts -= _ChronoParts::_DayOfYear;
498 [[__gnu__::__always_inline__]]
500 _M_fill_ldays(chrono::local_days __ld, _ChronoParts __parts)
503 __parts -= _ChronoParts::_LocalDays;
504 return _M_fill_aux(__ld, __parts);
508 _M_fill_time(chrono::seconds __d)
510 chrono::hh_mm_ss<chrono::seconds> __hms(__d);
511 _M_hours = __hms.hours();
512 _M_minutes = __hms.minutes();
513 _M_seconds = __hms.seconds();
517 _M_fill_date_time(chrono::local_seconds __ls, _ChronoParts __parts)
519 _M_ldays = chrono::floor<chrono::days>(__ls);
520 __parts -= _ChronoParts::_LocalDays;
521 if ((__parts & _ChronoParts::_HoursMinutesSeconds) != 0)
522 _M_fill_time(_M_lseconds - _M_ldays);
524 if ((__parts & _ChronoParts::_Date) != 0)
526 const chrono::year_month_day __ymd(_M_ldays);
527 _M_fill_year_month(__ymd, __parts);
528 _M_fill_day(__ymd.day(), __parts);
529 _M_fill_aux(_M_ldays, __parts);
534 _M_fill_zone(
const char* __abbrev,
const wchar_t* __wabbrev)
536 if constexpr (is_same_v<_CharT, char>)
537 _M_zone_abbrev = __abbrev;
539 _M_zone_abbrev = __wabbrev;
540 _M_zone_cstr = __abbrev;
543 [[__gnu__::__always_inline__]]
546 { _M_fill_zone(
"UTC", L
"UTC"); }
550 template<
typename _CharT>
551 struct __formatter_chrono
553 using __string_view = basic_string_view<_CharT>;
554 using __string = basic_string<_CharT>;
556 __formatter_chrono() =
default;
559 __formatter_chrono(_ChronoSpec<_CharT> __spec) noexcept
563 template<
typename _ParseContext>
564 constexpr typename _ParseContext::iterator
565 _M_parse(_ParseContext& __pc, _ChronoParts __parts,
566 const _ChronoSpec<_CharT>& __def)
568 auto __first = __pc.
begin();
569 auto __last = __pc.end();
571 _ChronoSpec<_CharT> __spec = __def;
573 auto __finalize = [
this, &__spec, &__def] {
574 using enum _ChronoParts;
575 _ChronoParts __checked
576 = __spec._M_debug ? _YearMonthDay|_IndexedWeekday
580 __spec._M_needs_ok_check
581 = __spec._M_needs(__def._M_needed & __checked);
585 auto __finished = [&] {
586 if (__first == __last || *__first ==
'}')
597 __first = __spec._M_parse_fill_and_align(__first, __last);
601 __first = __spec._M_parse_width(__first, __last, __pc);
607 if ((__parts & _ChronoParts::_EpochUnits) == 0
608 || !__spec._M_floating_point_rep)
609 __throw_format_error(
"format error: invalid precision for duration");
612 __first = _Spec<_CharT>()._M_parse_precision(__first, __last, __pc);
614 __spec._M_prec_kind = _WP_value;
619 __spec._M_localized =
false;
620 __first = __spec._M_parse_locale(__first, __last);
627 __string_view __str(__first, __last - __first);
628 auto __end = __str.find(
'}');
629 if (__end != __str.npos)
631 __str.remove_suffix(__str.length() - __end);
632 __last = __first + __end;
634 if (__str.find(
'{') != __str.npos)
635 __throw_format_error(
"chrono format error: '{' in chrono-specs");
641 __spec._M_debug =
false;
642 __spec._M_locale_specific =
false;
643 __spec._M_needed = _ChronoParts::_None;
644 __spec._M_chrono_specs = __string_view();
646 const auto __chrono_specs = __first++;
647 if (*__chrono_specs !=
'%')
648 __throw_format_error(
"chrono format error: no '%' at start of "
653 while (__first != __last)
655 enum _Mods { _Mod_none, _Mod_E, _Mod_O, _Mod_E_O };
656 _Mods __allowed_mods = _Mod_none;
658 _ChronoParts __needed = _ChronoParts::_None;
659 bool __locale_specific =
false;
661 _CharT __c = *__first++;
664 using enum _ChronoParts;
668 __locale_specific =
true;
674 __locale_specific =
true;
677 __needed = _Date|_HoursMinutesSeconds;
678 __allowed_mods = _Mod_E;
679 __locale_specific =
true;
683 __allowed_mods = _Mod_E;
688 __allowed_mods = _Mod_O;
692 __needed = _YearMonthDay;
697 __needed = _LocalDays|_Year|_DayOfYear|_Weekday;
701 __needed = _HoursMinutesSeconds;
702 __allowed_mods = _Mod_O;
705 __needed = __parts & _DayOfYear;
708 if (__needed == _None)
709 __needed = _HoursMinutesSeconds;
713 __allowed_mods = _Mod_O;
716 __needed = _HoursMinutesSeconds;
717 __allowed_mods = _Mod_O;
721 __locale_specific =
true;
724 __needed = _HoursMinutesSeconds;
727 __needed = _TimeOfDay;
730 __needed = _UnitSuffix;
733 __needed = _EpochUnits;
736 __needed = _TimeOfDay;
737 __allowed_mods = _Mod_O;
742 __allowed_mods = _Mod_O;
746 __needed = _DayOfYear|_Weekday;
747 __allowed_mods = _Mod_O;
751 __locale_specific =
true;
752 __allowed_mods = _Mod_E;
755 __needed = _HoursMinutesSeconds;
756 __locale_specific =
true;
757 __allowed_mods = _Mod_E;
761 __allowed_mods = _Mod_E_O;
765 __allowed_mods = _Mod_E;
768 __needed = _ZoneOffset;
769 __allowed_mods = _Mod_E_O;
772 __needed = _ZoneAbbrev;
780 if (__mod) [[unlikely]]
782 __allowed_mods = _Mod_none;
788 __throw_format_error(
"chrono format error: invalid "
789 " specifier in chrono-specs");
792 if ((__mod ==
'E' && !(__allowed_mods & _Mod_E))
793 || (__mod ==
'O' && !(__allowed_mods & _Mod_O)))
794 __throw_format_error(
"chrono format error: invalid "
795 " modifier in chrono-specs");
796 if (__mod && __c !=
'z')
797 __locale_specific =
true;
801 if (__locale_specific)
802 __needed -= _ChronoParts::_Subseconds;
804 if ((__parts & __needed) != __needed)
805 __throw_format_error(
"chrono format error: format argument "
806 "does not contain the information "
807 "required by the chrono-specs");
808 __spec._M_needed |= __needed;
809 __spec._M_locale_specific |= __locale_specific;
812 size_t __pos = __string_view(__first, __last - __first).find(
'%');
817 if (__pos == __string_view::npos)
823 __first += __pos + 1;
828 if (__conv || __mod != _CharT())
829 __throw_format_error(
"chrono format error: unescaped '%' in "
832 __spec._M_chrono_specs
833 = __string_view(__chrono_specs, __first - __chrono_specs);
840 template<
typename _FormatContext>
841 typename _FormatContext::iterator
842 _M_format(
const _ChronoData<_CharT>& __t, _FormatContext& __fc)
const
844#if defined _GLIBCXX_USE_NL_LANGINFO_L && __CHAR_BIT__ == 8
848 if constexpr (is_same_v<_CharT, char>)
849 if constexpr (__unicode::__literal_encoding_is_utf8())
850 if (_M_spec._M_localized && _M_spec._M_locale_specific)
852 extern locale __with_encoding_conversion(
const locale&);
856 locale __loc = __fc.locale();
857 if (__loc != locale::classic())
858 __fc._M_loc = __with_encoding_conversion(__loc);
862 const size_t __padwidth = _M_spec._M_get_width(__fc);
864 return _M_format_to(__t, __fc.out(), __fc);
866 using _Out =
typename _FormatContext::iterator;
867 _Padding_sink<_Out, _CharT> __sink(__fc.out(), __padwidth);
868 _M_format_to(__t, __sink.out(), __fc);
869 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 using __formatter_chrono<_CharT>::__formatter_chrono;
1935 using __formatter_chrono<_CharT>::_M_spec;
1937 template<
typename _Duration,
typename _ParseContext>
1938 constexpr typename _ParseContext::iterator
1939 _M_parse(_ParseContext& __pc, _ChronoParts __parts,
1940 const _ChronoSpec<_CharT>& __def = {})
1942 using _Rep =
typename _Duration::rep;
1943 using enum _ChronoParts;
1946 = __formatter_chrono<_CharT>::_M_parse(__pc, __parts, __def);
1949 _M_spec._M_needs_ok_check =
false;
1954 if constexpr (!is_floating_point_v<_Rep>)
1955 if constexpr (chrono::treat_as_floating_point_v<_Rep>)
1956 if (_M_spec._M_needs(_Subseconds|_EpochUnits)
1957 || _M_spec._M_prec_kind != _WP_none
1958 || _M_spec._M_prec_value > 0)
1960 constexpr const _CharT* __fs = _GLIBCXX_WIDEN(
"#02.5Lf");
1961 basic_format_parse_context<_CharT> __npc(__fs);
1962 formatter<_Rep, _CharT> __fmtter;
1963 __fmtter.parse(__npc);
1969 template<
typename _FormatContext>
1971 _M_locale(_FormatContext& __fc)
const
1973 if (!_M_spec._M_localized)
1976 return __fc.locale();
1980 template<
typename _Rep,
typename _Period,
typename _FormatContext>
1981 typename _FormatContext::iterator
1982 _M_format_to_ostream(
const chrono::duration<_Rep, _Period>& __d,
1984 _FormatContext& __fc)
const
1986 basic_ostringstream<_CharT> __os;
1987 __os.imbue(this->_M_locale(__fc));
1989 if (__is_neg) [[unlikely]]
1990 __os << this->_S_plus_minus[1];
1994 return __format::__write_padded_as_spec(__str, __str.size(),
1998 template<
typename _Rep1,
typename _Period1,
1999 typename _Rep2,
typename _Period2,
2000 typename _FormatContext>
2001 typename _FormatContext::iterator
2002 _M_format_units(_ChronoData<_CharT>& __cd,
2003 const chrono::duration<_Rep1, _Period1>& __ed,
2004 const chrono::duration<_Rep2, _Period2>& __ss,
2005 _FormatContext& __fc)
const
2007 __format::_Str_sink<_CharT> __suffix_store;
2008 constexpr auto _S_unit_suffix
2009 = chrono::__detail::__units_suffix<_Period1, _CharT>();
2010 if constexpr (!_S_unit_suffix.empty())
2011 __cd._M_unit_suffix = _S_unit_suffix;
2012 else if (_M_spec._M_needs(_ChronoParts::_UnitSuffix))
2015 __fmt_units_suffix<_Period1, _CharT>(__suffix_store.out());
2016 __cd._M_unit_suffix = __suffix_store.view();
2019 const auto __prec = _M_spec._M_prec_kind != _WP_none
2020 ? _M_spec._M_get_precision(__fc)
2023 using _ErasedContext =
typename _ChronoData<_CharT>::_FormatContext;
2026 auto __ereps = +__ed.count();
2027 if (!_M_spec._M_needs(_ChronoParts::_Subseconds))
2031 = std::make_format_args<_ErasedContext>(__ereps, __ssreps, __prec);
2032 __cd._M_ereps = __args_store;
2033 return this->_M_format(__cd, __fc);
2036 using _Attoseconds = _ChronoData<_CharT>::_Attoseconds;
2037 auto __nss = _S_subseconds(__ss);
2038 __cd._M_subseconds = chrono::duration_cast<_Attoseconds>(__nss);
2040 auto __ssreps = __nss.count();
2042 = std::make_format_args<_ErasedContext>(__ereps, __ssreps, __prec);
2043 __cd._M_ereps = __args_store;
2045 return this->_M_format(__cd, __fc);
2049 template<
typename _Rep1,
typename _Period1,
typename _FormatContext>
2050 typename _FormatContext::iterator
2051 _M_format_time_point(_ChronoData<_CharT>& __cd,
2052 const chrono::duration<_Rep1, _Period1>& __ed,
2053 _FormatContext& __fc)
const
2055 auto __parts = _M_spec._M_needed - _ChronoParts::_TotalSeconds;
2056 if ((__parts & _ChronoParts::_DateTime) != 0)
2057 __cd._M_fill_date_time(__cd._M_lseconds, __parts);
2058 return _M_format_units(__cd, __ed, __ed - __cd._M_eseconds, __fc);
2062#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
2063 template<
typename _CharT>
2064 struct __formatter_chrono_info
2066 constexpr typename basic_format_parse_context<_CharT>::iterator
2067 parse(basic_format_parse_context<_CharT>& __pc)
2068 {
return _M_f._M_parse(__pc, _ChronoParts(), {}); }
2070 template<
typename _Info,
typename _Out>
2071 typename basic_format_context<_Out, _CharT>::iterator
2072 format(
const _Info& __i,
2073 basic_format_context<_Out, _CharT>& __fc)
const
2077 if (!_M_f._M_spec._M_chrono_specs.empty()) [[unlikely]]
2078 return _M_f._M_format(_ChronoData<_CharT>{}, __fc);
2080 const size_t __padwidth = _M_f._M_spec._M_get_width(__fc);
2081 if (__padwidth == 0)
2082 return _M_format_to(__fc.out(), __i);
2084 _Padding_sink<_Out, _CharT> __sink(__fc.out(), __padwidth);
2085 _M_format_to(__sink.out(), __i);
2086 return __sink._M_finish(_M_f._M_spec._M_align, _M_f._M_spec._M_fill);
2090 template<
typename _Out>
2092 _M_format_to(_Out __out,
const chrono::sys_info& __si)
const
2094 using _FmtStr = _Runtime_format_string<_CharT>;
2098 constexpr auto* __fs
2099 = _GLIBCXX_WIDEN(
"[{0:%F %T},{1:%F %T},{2:%T},{3:%Q%q},{0:%Z}]");
2100 const chrono::local_seconds __lb(__si.begin.time_since_epoch());
2101 return std::format_to(
std::move(__out), _FmtStr(__fs),
2102 chrono::local_time_format(__lb, &__si.abbrev),
2103 __si.end, __si.offset, __si.save);
2106 template<
typename _Out>
2108 _M_format_to(_Out __out,
const chrono::local_info& __li)
const
2110 *__out = _Separators<_CharT>::_S_squares()[0];
2112 if (__li.result == chrono::local_info::unique)
2113 __out = _M_format_to(
std::move(__out), __li.first);
2116 basic_string_view<_CharT> __sv;
2117 if (__li.result == chrono::local_info::nonexistent)
2118 __sv =_GLIBCXX_WIDEN(
"nonexistent");
2120 __sv = _GLIBCXX_WIDEN(
"ambiguous");
2121 __out = __format::__write(
std::move(__out), __sv);
2123 __sv = _GLIBCXX_WIDEN(
" local time between ");
2124 __out = __format::__write(
std::move(__out), __sv);
2125 __out = _M_format_to(
std::move(__out), __li.first);
2127 __sv = _GLIBCXX_WIDEN(
" and ");
2128 __out = __format::__write(
std::move(__out), __sv);
2129 __out = _M_format_to(
std::move(__out), __li.second);
2131 *__out = _Separators<_CharT>::_S_squares()[1];
2136 __formatter_chrono<_CharT> _M_f;
2143 template<
typename _Rep,
typename _Period,
typename _CharT>
2144 requires __format::__formattable_impl<_Rep, _CharT>
2145 struct formatter<
chrono::duration<_Rep, _Period>, _CharT>
2147 constexpr typename basic_format_parse_context<_CharT>::iterator
2148 parse(basic_format_parse_context<_CharT>& __pc)
2150 using enum __format::_ChronoParts;
2151 return _M_f.template _M_parse<_Duration>(__pc, _EpochTime, __defSpec);
2154 template<
typename _Out>
2155 typename basic_format_context<_Out, _CharT>::iterator
2156 format(
const chrono::duration<_Rep, _Period>& __d,
2157 basic_format_context<_Out, _CharT>& __fc)
const
2159 if constexpr (numeric_limits<_Rep>::is_signed)
2160 if (__d < __d.zero()) [[unlikely]]
2162 if constexpr (is_integral_v<_Rep>)
2166 using _URep = make_unsigned_t<_Rep>;
2167 auto __ucnt = -
static_cast<_URep
>(__d.count());
2168 auto __ud = chrono::duration<_URep, _Period>(__ucnt);
2169 return _M_format(__ud,
true, __fc);
2172 return _M_format(-__d,
true, __fc);
2174 return _M_format(__d,
false, __fc);
2178 using _Duration = chrono::duration<_Rep, _Period>;
2180 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2182 using enum __format::_ChronoParts;
2183 auto __res = __format::__formatter_duration<_CharT>::
2184 template _S_spec_for<_Duration>(_None);
2185 __res._M_localized = !is_integral_v<_Rep>;
2187 if constexpr (is_integral_v<_Rep>)
2189 __res._M_needed = _EpochUnits|_UnitSuffix;
2190 __res._M_chrono_specs = _GLIBCXX_WIDEN(
"%Q%q");
2195 template<
typename _Rep2,
typename _Out>
2196 typename basic_format_context<_Out, _CharT>::iterator
2197 _M_format(
const chrono::duration<_Rep2, _Period>& __d,
2199 basic_format_context<_Out, _CharT>& __fc)
const
2201 using namespace chrono;
2202 using enum __format::_ChronoParts;
2203 if constexpr (!is_integral_v<_Rep>)
2204 if (_M_f._M_spec._M_chrono_specs.empty())
2205 return _M_f._M_format_to_ostream(__d, __is_neg, __fc);
2207 __format::_ChronoData<_CharT> __cd;
2208 __cd._M_is_neg = __is_neg;
2209 auto __ts = chrono::floor<chrono::seconds>(__d);
2210 __cd._M_eseconds = __ts;
2211 if (_M_f._M_spec._M_needs(_HoursMinutesSeconds))
2212 __cd._M_fill_time(__ts);
2213 return _M_f._M_format_units(__cd, __d, __d - __ts, __fc);
2216 __format::__formatter_duration<_CharT> _M_f{__defSpec};
2219 template<__format::__
char _CharT>
2220 struct formatter<
chrono::day, _CharT>
2222 constexpr typename basic_format_parse_context<_CharT>::iterator
2223 parse(basic_format_parse_context<_CharT>& __pc)
2225 using enum __format::_ChronoParts;
2226 return _M_f._M_parse(__pc, _Day|_WeekdayIndex, __defSpec);
2229 template<
typename _Out>
2230 typename basic_format_context<_Out, _CharT>::iterator
2231 format(
const chrono::day& __t,
2232 basic_format_context<_Out, _CharT>& __fc)
const
2234 __format::_ChronoData<_CharT> __cd{};
2235 __cd._M_fill_day(__t, __defSpec._M_needed);
2236 return _M_f._M_format(__cd, __fc);
2240 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2242 using __format::_ChronoFormats;
2243 using enum __format::_ChronoParts;
2245 __format::_ChronoSpec<_CharT> __res{};
2246 __res._M_debug =
true;
2247 __res._M_needed = _Day;
2248 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_d();
2252 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2255 template<__format::__
char _CharT>
2256 struct formatter<
chrono::month, _CharT>
2258 constexpr typename basic_format_parse_context<_CharT>::iterator
2259 parse(basic_format_parse_context<_CharT>& __pc)
2261 using enum __format::_ChronoParts;
2262 return _M_f._M_parse(__pc, _Month, __defSpec);
2265 template<
typename _Out>
2266 typename basic_format_context<_Out, _CharT>::iterator
2267 format(
const chrono::month& __t,
2268 basic_format_context<_Out, _CharT>& __fc)
const
2270 __format::_ChronoData<_CharT> __cd{};
2271 __cd._M_month = __t;
2272 return _M_f._M_format(__cd, __fc);
2276 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2278 using __format::_ChronoFormats;
2279 using enum __format::_ChronoParts;
2281 __format::_ChronoSpec<_CharT> __res{};
2282 __res._M_debug =
true;
2283 __res._M_localized =
true;
2284 __res._M_locale_specific =
true;
2285 __res._M_needed = _Month;
2286 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_m();
2290 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2293 template<__format::__
char _CharT>
2294 struct formatter<
chrono::year, _CharT>
2296 constexpr typename basic_format_parse_context<_CharT>::iterator
2297 parse(basic_format_parse_context<_CharT>& __pc)
2299 using enum __format::_ChronoParts;
2300 return _M_f._M_parse(__pc, _Year, __defSpec);
2303 template<
typename _Out>
2304 typename basic_format_context<_Out, _CharT>::iterator
2305 format(
const chrono::year& __t,
2306 basic_format_context<_Out, _CharT>& __fc)
const
2308 __format::_ChronoData<_CharT> __cd{};
2310 return _M_f._M_format(__cd, __fc);
2314 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2316 using __format::_ChronoFormats;
2317 using enum __format::_ChronoParts;
2319 __format::_ChronoSpec<_CharT> __res{};
2320 __res._M_debug =
true;
2321 __res._M_needed = _Year;
2322 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_y();
2326 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2329 template<__format::__
char _CharT>
2330 struct formatter<
chrono::weekday, _CharT>
2332 constexpr typename basic_format_parse_context<_CharT>::iterator
2333 parse(basic_format_parse_context<_CharT>& __pc)
2335 using enum __format::_ChronoParts;
2336 return _M_f._M_parse(__pc, _Weekday, __defSpec);
2339 template<
typename _Out>
2340 typename basic_format_context<_Out, _CharT>::iterator
2341 format(
const chrono::weekday& __t,
2342 basic_format_context<_Out, _CharT>& __fc)
const
2344 __format::_ChronoData<_CharT> __cd{};
2345 __cd._M_weekday = __t;
2346 return _M_f._M_format(__cd, __fc);
2350 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2352 using __format::_ChronoFormats;
2353 using enum __format::_ChronoParts;
2355 __format::_ChronoSpec<_CharT> __res{};
2356 __res._M_debug =
true;
2357 __res._M_localized =
true;
2358 __res._M_locale_specific =
true;
2359 __res._M_needed = _Weekday;
2360 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_w();
2364 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2367 template<__format::__
char _CharT>
2368 struct formatter<
chrono::weekday_indexed, _CharT>
2370 constexpr typename basic_format_parse_context<_CharT>::iterator
2371 parse(basic_format_parse_context<_CharT>& __pc)
2373 using enum __format::_ChronoParts;
2374 return _M_f._M_parse(__pc, _IndexedWeekday, __defSpec);
2377 template<
typename _Out>
2378 typename basic_format_context<_Out, _CharT>::iterator
2379 format(
const chrono::weekday_indexed& __t,
2380 basic_format_context<_Out, _CharT>& __fc)
const
2382 __format::_ChronoData<_CharT> __cd{};
2383 __cd._M_fill_weekday(__t, __defSpec._M_needed);
2384 return _M_f._M_format(__cd, __fc);
2388 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2390 using __format::_ChronoFormats;
2391 using enum __format::_ChronoParts;
2393 __format::_ChronoSpec<_CharT> __res{};
2394 __res._M_debug =
true;
2395 __res._M_localized =
true;
2396 __res._M_locale_specific =
true;
2397 __res._M_needed = _IndexedWeekday;
2398 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_wi();
2402 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2405 template<__format::__
char _CharT>
2406 struct formatter<
chrono::weekday_last, _CharT>
2408 constexpr typename basic_format_parse_context<_CharT>::iterator
2409 parse(basic_format_parse_context<_CharT>& __pc)
2411 using enum __format::_ChronoParts;
2412 return _M_f._M_parse(__pc, _Weekday, __defSpec);
2415 template<
typename _Out>
2416 typename basic_format_context<_Out, _CharT>::iterator
2417 format(
const chrono::weekday_last& __t,
2418 basic_format_context<_Out, _CharT>& __fc)
const
2420 __format::_ChronoData<_CharT> __cd{};
2421 __cd._M_weekday = __t.weekday();
2422 return _M_f._M_format(__cd, __fc);
2426 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2428 using __format::_ChronoFormats;
2429 using enum __format::_ChronoParts;
2431 __format::_ChronoSpec<_CharT> __res{};
2432 __res._M_debug =
true;
2433 __res._M_localized =
true;
2434 __res._M_locale_specific =
true;
2435 __res._M_needed = _Weekday;
2436 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_wl();
2440 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2443 template<__format::__
char _CharT>
2444 struct formatter<
chrono::month_day, _CharT>
2446 constexpr typename basic_format_parse_context<_CharT>::iterator
2447 parse(basic_format_parse_context<_CharT>& __pc)
2449 using enum __format::_ChronoParts;
2450 return _M_f._M_parse(__pc, _Month|_Day|_WeekdayIndex, __defSpec);
2453 template<
typename _Out>
2454 typename basic_format_context<_Out, _CharT>::iterator
2455 format(
const chrono::month_day& __t,
2456 basic_format_context<_Out, _CharT>& __fc)
const
2458 __format::_ChronoData<_CharT> __cd{};
2459 __cd._M_month = __t.month();
2460 __cd._M_fill_day(__t.day(), __defSpec._M_needed);
2461 return _M_f._M_format(__cd, __fc);
2465 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2467 using __format::_ChronoFormats;
2468 using enum __format::_ChronoParts;
2470 __format::_ChronoSpec<_CharT> __res{};
2471 __res._M_debug =
true;
2472 __res._M_localized =
true;
2473 __res._M_locale_specific =
true;
2474 __res._M_needed = _Month|_Day;
2475 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_md();
2479 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2482 template<__format::__
char _CharT>
2483 struct formatter<
chrono::month_day_last, _CharT>
2485 constexpr typename basic_format_parse_context<_CharT>::iterator
2486 parse(basic_format_parse_context<_CharT>& __pc)
2488 using enum __format::_ChronoParts;
2489 return _M_f._M_parse(__pc, _Month, __defSpec);
2492 template<
typename _Out>
2493 typename basic_format_context<_Out, _CharT>::iterator
2494 format(
const chrono::month_day_last& __t,
2495 basic_format_context<_Out, _CharT>& __fc)
const
2497 __format::_ChronoData<_CharT> __cd{};
2498 __cd._M_month = __t.month();
2499 return _M_f._M_format(__cd, __fc);
2503 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2505 using __format::_ChronoFormats;
2506 using enum __format::_ChronoParts;
2508 __format::_ChronoSpec<_CharT> __res{};
2509 __res._M_debug =
true;
2510 __res._M_localized =
true;
2511 __res._M_locale_specific =
true;
2512 __res._M_needed = _Month;
2513 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ml();
2517 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2520 template<__format::__
char _CharT>
2521 struct formatter<
chrono::month_weekday, _CharT>
2523 constexpr typename basic_format_parse_context<_CharT>::iterator
2524 parse(basic_format_parse_context<_CharT>& __pc)
2526 using enum __format::_ChronoParts;
2527 return _M_f._M_parse(__pc, _Month|_IndexedWeekday, __defSpec);
2530 template<
typename _Out>
2531 typename basic_format_context<_Out, _CharT>::iterator
2532 format(
const chrono::month_weekday& __t,
2533 basic_format_context<_Out, _CharT>& __fc)
const
2535 __format::_ChronoData<_CharT> __cd{};
2536 __cd._M_month = __t.month();
2537 __cd._M_fill_weekday(__t.weekday_indexed(), __defSpec._M_needed);
2538 return _M_f._M_format(__cd, __fc);
2542 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2544 using __format::_ChronoFormats;
2545 using enum __format::_ChronoParts;
2547 __format::_ChronoSpec<_CharT> __res{};
2548 __res._M_debug =
true;
2549 __res._M_localized =
true;
2550 __res._M_locale_specific =
true;
2551 __res._M_needed = _Month|_IndexedWeekday;
2552 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_mwi();
2556 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2559 template<__format::__
char _CharT>
2560 struct formatter<
chrono::month_weekday_last, _CharT>
2562 constexpr typename basic_format_parse_context<_CharT>::iterator
2563 parse(basic_format_parse_context<_CharT>& __pc)
2565 using enum __format::_ChronoParts;
2566 return _M_f._M_parse(__pc, _Month|_Weekday, __defSpec);
2569 template<
typename _Out>
2570 typename basic_format_context<_Out, _CharT>::iterator
2571 format(
const chrono::month_weekday_last& __t,
2572 basic_format_context<_Out, _CharT>& __fc)
const
2574 __format::_ChronoData<_CharT> __cd{};
2575 __cd._M_month = __t.month();
2576 __cd._M_weekday = __t.weekday_last().weekday();
2577 return _M_f._M_format(__cd, __fc);
2581 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2583 using __format::_ChronoFormats;
2584 using enum __format::_ChronoParts;
2586 __format::_ChronoSpec<_CharT> __res{};
2587 __res._M_debug =
true;
2588 __res._M_localized =
true;
2589 __res._M_locale_specific =
true;
2590 __res._M_needed = _Month|_Weekday;
2591 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_mwl();
2595 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2598 template<__format::__
char _CharT>
2599 struct formatter<
chrono::year_month, _CharT>
2601 constexpr typename basic_format_parse_context<_CharT>::iterator
2602 parse(basic_format_parse_context<_CharT>& __pc)
2604 using enum __format::_ChronoParts;
2605 return _M_f._M_parse(__pc, _Year|_Month, __defSpec);
2608 template<
typename _Out>
2609 typename basic_format_context<_Out, _CharT>::iterator
2610 format(
const chrono::year_month& __t,
2611 basic_format_context<_Out, _CharT>& __fc)
const
2613 __format::_ChronoData<_CharT> __cd{};
2614 __cd._M_fill_year_month(__t, __defSpec._M_needed);
2615 return _M_f._M_format(__cd, __fc);
2619 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2621 using __format::_ChronoFormats;
2622 using enum __format::_ChronoParts;
2624 __format::_ChronoSpec<_CharT> __res{};
2625 __res._M_debug =
true;
2626 __res._M_localized =
true;
2627 __res._M_locale_specific =
true;
2628 __res._M_needed = _Year|_Month;
2629 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ym();
2633 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2636 template<__format::__
char _CharT>
2637 struct formatter<
chrono::year_month_day, _CharT>
2639 constexpr typename basic_format_parse_context<_CharT>::iterator
2640 parse(basic_format_parse_context<_CharT>& __pc)
2642 using enum __format::_ChronoParts;
2643 return _M_f._M_parse(__pc, _Date, __defSpec);
2646 template<
typename _Out>
2647 typename basic_format_context<_Out, _CharT>::iterator
2648 format(
const chrono::year_month_day& __t,
2649 basic_format_context<_Out, _CharT>& __fc)
const
2651 __format::_ChronoData<_CharT> __cd{};
2652 auto __parts = _M_f._M_spec._M_needed;
2653 __parts = __cd._M_fill_year_month(__t, __parts);
2654 __parts = __cd._M_fill_day(__t.day(), __parts);
2656 return _M_f._M_format(__cd, __fc);
2658 chrono::local_days __ld(__t);
2659 __cd._M_fill_ldays(__ld, __parts);
2660 return _M_f._M_format(__cd, __fc);
2664 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2666 using __format::_ChronoFormats;
2667 using enum __format::_ChronoParts;
2669 __format::_ChronoSpec<_CharT> __res{};
2670 __res._M_debug =
true;
2671 __res._M_needed = _YearMonthDay;
2672 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_f();
2676 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2679 template<__format::__
char _CharT>
2680 struct formatter<
chrono::year_month_day_last, _CharT>
2682 constexpr typename basic_format_parse_context<_CharT>::iterator
2683 parse(basic_format_parse_context<_CharT>& __pc)
2685 using enum __format::_ChronoParts;
2686 return _M_f._M_parse(__pc, _Date, __defSpec);
2689 template<
typename _Out>
2690 typename basic_format_context<_Out, _CharT>::iterator
2691 format(
const chrono::year_month_day_last& __t,
2692 basic_format_context<_Out, _CharT>& __fc)
const
2694 __format::_ChronoData<_CharT> __cd{};
2695 auto __parts = _M_f._M_spec._M_needed;
2696 __parts = __cd._M_fill_year_month(__t, __parts);
2698 return _M_f._M_format(__cd, __fc);
2700 chrono::local_days __ld(__t);
2701 __parts = __cd._M_fill_ldays(__ld, __parts);
2703 return _M_f._M_format(__cd, __fc);
2705 chrono::year_month_day __ymd(__ld);
2706 __cd._M_fill_day(__ymd.day(), __parts);
2707 return _M_f._M_format(__cd, __fc);
2711 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2713 using __format::_ChronoFormats;
2714 using enum __format::_ChronoParts;
2716 __format::_ChronoSpec<_CharT> __res{};
2717 __res._M_debug =
true;
2718 __res._M_localized =
true;
2719 __res._M_locale_specific =
true;
2720 __res._M_needed = _Year|_Month;
2721 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_yml();
2725 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2728 template<__format::__
char _CharT>
2729 struct formatter<
chrono::year_month_weekday, _CharT>
2731 constexpr typename basic_format_parse_context<_CharT>::iterator
2732 parse(basic_format_parse_context<_CharT>& __pc)
2734 using enum __format::_ChronoParts;
2735 return _M_f._M_parse(__pc, _Date, __defSpec);
2738 template<
typename _Out>
2739 typename basic_format_context<_Out, _CharT>::iterator
2740 format(
const chrono::year_month_weekday& __t,
2741 basic_format_context<_Out, _CharT>& __fc)
const
2743 __format::_ChronoData<_CharT> __cd{};
2744 auto __parts = _M_f._M_spec._M_needed;
2745 __parts = __cd._M_fill_year_month(__t, __parts);
2746 __parts = __cd._M_fill_weekday(__t.weekday_indexed(), __parts);
2748 return _M_f._M_format(__cd, __fc);
2750 chrono::local_days __ld(__t);
2751 __parts = __cd._M_fill_ldays(__ld, __parts);
2753 return _M_f._M_format(__cd, __fc);
2755 chrono::year_month_day __ymd(__ld);
2757 __cd._M_day = __ymd.day();
2758 return _M_f._M_format(__cd, __fc);
2762 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2764 using __format::_ChronoFormats;
2765 using enum __format::_ChronoParts;
2767 __format::_ChronoSpec<_CharT> __res{};
2768 __res._M_debug =
true;
2769 __res._M_localized =
true;
2770 __res._M_locale_specific =
true;
2771 __res._M_needed = _Year|_Month|_IndexedWeekday;
2772 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ymwi();
2776 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2779 template<__format::__
char _CharT>
2780 struct formatter<
chrono::year_month_weekday_last, _CharT>
2782 constexpr typename basic_format_parse_context<_CharT>::iterator
2783 parse(basic_format_parse_context<_CharT>& __pc)
2785 using enum __format::_ChronoParts;
2786 return _M_f._M_parse(__pc, _Date, __defSpec);
2789 template<
typename _Out>
2790 typename basic_format_context<_Out, _CharT>::iterator
2791 format(
const chrono::year_month_weekday_last& __t,
2792 basic_format_context<_Out, _CharT>& __fc)
const
2794 __format::_ChronoData<_CharT> __cd{};
2795 auto __parts = _M_f._M_spec._M_needed;
2796 __parts = __cd._M_fill_year_month(__t, __parts);
2797 __cd._M_weekday = __t.weekday_last().weekday();
2798 __parts -= __format::_ChronoParts::_Weekday;
2800 return _M_f._M_format(__cd, __fc);
2802 chrono::local_days __ld(__t);
2803 __parts = __cd._M_fill_ldays(__ld, __parts);
2805 return _M_f._M_format(__cd, __fc);
2807 chrono::year_month_day __ymd(__ld);
2808 __cd._M_fill_day(__ymd.day(), __parts);
2809 return _M_f._M_format(__cd, __fc);
2813 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2815 using __format::_ChronoFormats;
2816 using enum __format::_ChronoParts;
2818 __format::_ChronoSpec<_CharT> __res{};
2819 __res._M_debug =
true;
2820 __res._M_localized =
true;
2821 __res._M_locale_specific =
true;
2822 __res._M_needed = _Year|_Month|_Weekday;
2823 __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ymwl();
2827 __format::__formatter_chrono<_CharT> _M_f{__defSpec};
2830 template<
typename _Rep,
typename _Period, __format::__
char _CharT>
2831 struct formatter<
chrono::hh_mm_ss<chrono::duration<_Rep, _Period>>, _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.template _M_parse<_Precision>(__pc, _Time, __defSpec);
2840 template<
typename _Out>
2841 typename basic_format_context<_Out, _CharT>::iterator
2842 format(
const chrono::hh_mm_ss<chrono::duration<_Rep, _Period>>& __t,
2843 basic_format_context<_Out, _CharT>& __fc)
const
2845 using enum __format::_ChronoParts;
2847 __format::_ChronoData<_CharT> __cd;
2848 __cd._M_is_neg = __t.is_negative();
2849 __cd._M_hours = __t.hours();
2850 __cd._M_minutes = __t.minutes();
2851 __cd._M_seconds = __t.seconds();
2856 if (_M_f._M_spec._M_needs(_EpochUnits))
2857 __d = __t.to_duration();
2858 if (_M_f._M_spec._M_needs(_TotalSeconds))
2860 = __cd._M_hours + __cd._M_minutes + __cd._M_seconds;
2861 return _M_f._M_format_units(__cd, __d, __t.subseconds(), __fc);
2866 =
typename chrono::hh_mm_ss<chrono::duration<_Rep, _Period>>::precision;
2867 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
2868 __format::__formatter_duration<_CharT>::
2869 template _S_spec_for<_Precision>(__format::_ChronoParts::_Time);
2871 __format::__formatter_duration<_CharT> _M_f{__defSpec};
2874#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
2875 template<__format::__
char _CharT>
2876 struct formatter<
chrono::sys_info, _CharT>
2878 constexpr typename basic_format_parse_context<_CharT>::iterator
2879 parse(basic_format_parse_context<_CharT>& __pc)
2880 {
return _M_f.parse(__pc); }
2882 template<
typename _Out>
2883 typename basic_format_context<_Out, _CharT>::iterator
2884 format(
const chrono::sys_info& __i,
2885 basic_format_context<_Out, _CharT>& __fc)
const
2886 {
return _M_f.format(__i, __fc); }
2889 __format::__formatter_chrono_info<_CharT> _M_f;
2892 template<__format::__
char _CharT>
2893 struct formatter<
chrono::local_info, _CharT>
2895 constexpr typename basic_format_parse_context<_CharT>::iterator
2896 parse(basic_format_parse_context<_CharT>& __pc)
2897 {
return _M_f.parse(__pc); }
2899 template<
typename _Out>
2900 typename basic_format_context<_Out, _CharT>::iterator
2901 format(
const chrono::local_info& __i,
2902 basic_format_context<_Out, _CharT>& __fc)
const
2903 {
return _M_f.format(__i, __fc); }
2906 __format::__formatter_chrono_info<_CharT> _M_f;
2910 template<
typename _Duration, __format::__
char _CharT>
2911 struct formatter<
chrono::sys_time<_Duration>, _CharT>
2913 constexpr typename basic_format_parse_context<_CharT>::iterator
2914 parse(basic_format_parse_context<_CharT>& __pc)
2916 using enum __format::_ChronoParts;
2918 = _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
2919 if constexpr (!__stream_insertable)
2920 if (_M_f._M_spec._M_chrono_specs.empty())
2921 __format::__invalid_chrono_spec();
2925 template<
typename _Out>
2926 typename basic_format_context<_Out, _CharT>::iterator
2927 format(
const chrono::sys_time<_Duration>& __t,
2928 basic_format_context<_Out, _CharT>& __fc)
const
2930 __format::_ChronoData<_CharT> __cd{};
2931 __cd._M_fill_utc_zone();
2933 _Duration __ed = __t.time_since_epoch();
2934 __cd._M_eseconds = chrono::floor<chrono::seconds>(__ed);
2935 __cd._M_lseconds = chrono::local_seconds(__cd._M_eseconds);
2936 return _M_f._M_format_time_point(__cd, __ed, __fc);
2940 static constexpr bool __stream_insertable
2941 =
requires (basic_ostream<_CharT>& __os,
2942 chrono::sys_time<_Duration> __t) { __os << __t; };
2944 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
2946 using enum __format::_ChronoParts;
2947 __format::_ChronoParts __needed = _DateTime;
2948 if constexpr (!__stream_insertable)
2950 else if constexpr (is_convertible_v<_Duration, chrono::days>)
2952 return __format::__formatter_duration<_CharT>::
2953 template _S_spec_for<_Duration>(__needed);
2956 __format::__formatter_duration<_CharT> _M_f{__defSpec};
2959 template<
typename _Duration, __format::__
char _CharT>
2960 struct formatter<
chrono::utc_time<_Duration>, _CharT>
2962 constexpr typename basic_format_parse_context<_CharT>::iterator
2963 parse(basic_format_parse_context<_CharT>& __pc)
2965 using enum __format::_ChronoParts;
2966 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
2969 template<
typename _Out>
2970 typename basic_format_context<_Out, _CharT>::iterator
2971 format(
const chrono::utc_time<_Duration>& __t,
2972 basic_format_context<_Out, _CharT>& __fc)
const
2974 using __format::_ChronoParts;
2975 using namespace chrono;
2976 __format::_ChronoData<_CharT> __cd{};
2977 __cd._M_fill_utc_zone();
2979 _Duration __ed = __t.time_since_epoch();
2980 __cd._M_eseconds = chrono::floor<seconds>(__ed);
2984 const auto __li = chrono::get_leap_second_info(__t);
2985 __cd._M_lseconds = local_seconds(__cd._M_eseconds - __li.elapsed);
2986 auto __parts = _M_f._M_spec._M_needed - _ChronoParts::_TotalSeconds;
2987 if ((__parts & _ChronoParts::_DateTime) != 0)
2989 __cd._M_fill_date_time(__cd._M_lseconds, __parts);
2990 __cd._M_seconds +=
seconds(__li.is_leap_second);
2992 return _M_f._M_format_units(__cd, __ed, __ed - __cd._M_eseconds, __fc);
2996 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
2997 __format::__formatter_duration<_CharT>::
2998 template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
3000 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3003 template<
typename _Duration, __format::__
char _CharT>
3004 struct formatter<
chrono::tai_time<_Duration>, _CharT>
3006 constexpr typename basic_format_parse_context<_CharT>::iterator
3007 parse(basic_format_parse_context<_CharT>& __pc)
3009 using enum __format::_ChronoParts;
3010 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3013 template<
typename _Out>
3014 typename basic_format_context<_Out, _CharT>::iterator
3015 format(
const chrono::tai_time<_Duration>& __t,
3016 basic_format_context<_Out, _CharT>& __fc)
const
3018 using namespace chrono;
3019 __format::_ChronoData<_CharT> __cd{};
3020 __cd._M_fill_zone(
"TAI", L
"TAI");
3022 _Duration __ed = __t.time_since_epoch();
3023 __cd._M_eseconds = chrono::floor<seconds>(__ed);
3025 constexpr chrono::days __tai_offset = chrono::days(4383);
3026 __cd._M_lseconds = local_seconds(__cd._M_eseconds - __tai_offset);
3027 return _M_f._M_format_time_point(__cd, __ed, __fc);
3031 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3032 __format::__formatter_duration<_CharT>::
3033 template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
3035 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3038 template<
typename _Duration, __format::__
char _CharT>
3039 struct formatter<
chrono::gps_time<_Duration>, _CharT>
3041 constexpr typename basic_format_parse_context<_CharT>::iterator
3042 parse(basic_format_parse_context<_CharT>& __pc)
3044 using enum __format::_ChronoParts;
3045 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3048 template<
typename _Out>
3049 typename basic_format_context<_Out, _CharT>::iterator
3050 format(
const chrono::gps_time<_Duration>& __t,
3051 basic_format_context<_Out, _CharT>& __fc)
const
3053 using namespace chrono;
3054 __format::_ChronoData<_CharT> __cd{};
3055 __cd._M_fill_zone(
"GPS", L
"GPS");
3057 _Duration __ed = __t.time_since_epoch();
3058 __cd._M_eseconds = chrono::floor<seconds>(__ed);
3060 constexpr chrono::days __gps_offset = chrono::days(3657);
3061 __cd._M_lseconds = local_seconds(__cd._M_eseconds + __gps_offset);
3062 return _M_f._M_format_time_point(__cd, __ed, __fc);
3066 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3067 __format::__formatter_duration<_CharT>::
3068 template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
3070 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3073 template<
typename _Duration, __format::__
char _CharT>
3074 struct formatter<
chrono::file_time<_Duration>, _CharT>
3076 constexpr typename basic_format_parse_context<_CharT>::iterator
3077 parse(basic_format_parse_context<_CharT>& __pc)
3079 using enum __format::_ChronoParts;
3080 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3083 template<
typename _Out>
3084 typename basic_format_context<_Out, _CharT>::iterator
3085 format(
const chrono::file_time<_Duration>& __t,
3086 basic_format_context<_Out, _CharT>& __fc)
const
3088 using namespace chrono;
3089 __format::_ChronoData<_CharT> __cd{};
3090 __cd._M_fill_utc_zone();
3092 _Duration __ed = __t.time_since_epoch();
3093 __cd._M_eseconds = chrono::floor<seconds>(__ed);
3094 auto __st = chrono::clock_cast<system_clock>(__t);
3096 = local_seconds(chrono::floor<seconds>(__st.time_since_epoch()));
3097 return _M_f._M_format_time_point(__cd, __ed, __fc);
3101 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3102 __format::__formatter_duration<_CharT>::
3103 template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
3105 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3108 template<
typename _Duration, __format::__
char _CharT>
3109 struct formatter<
chrono::local_time<_Duration>, _CharT>
3111 constexpr typename basic_format_parse_context<_CharT>::iterator
3112 parse(basic_format_parse_context<_CharT>& __pc)
3114 using enum __format::_ChronoParts;
3115 return _M_f.template _M_parse<_Duration>(__pc, _DateTime, __defSpec);
3118 template<
typename _Out>
3119 typename basic_format_context<_Out, _CharT>::iterator
3120 format(
const chrono::local_time<_Duration>& __lt,
3121 basic_format_context<_Out, _CharT>& __fc)
const
3123 __format::_ChronoData<_CharT> __cd{};
3124 _Duration __ed = __lt.time_since_epoch();
3125 __cd._M_lseconds = chrono::floor<chrono::seconds>(__lt);
3126 __cd._M_eseconds = __cd._M_lseconds.time_since_epoch();
3127 return _M_f._M_format_time_point(__cd, __ed, __fc);
3131 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
3133 using enum __format::_ChronoParts;
3134 __format::_ChronoParts __needed = _DateTime;
3135 if constexpr (is_convertible_v<_Duration, chrono::days>)
3137 return __format::__formatter_duration<_CharT>::
3138 template _S_spec_for<_Duration>(__needed);
3141 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3144 template<
typename _Duration, __format::__
char _CharT>
3145 struct formatter<
chrono::__detail::__local_time_fmt<_Duration>, _CharT>
3147 constexpr typename basic_format_parse_context<_CharT>::iterator
3148 parse(basic_format_parse_context<_CharT>& __pc)
3150 using enum __format::_ChronoParts;
3151 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3154 template<
typename _Out>
3155 typename basic_format_context<_Out, _CharT>::iterator
3156 format(
const chrono::__detail::__local_time_fmt<_Duration>& __zt,
3157 basic_format_context<_Out, _CharT>& __fc)
const
3159 using enum __format::_ChronoParts;
3160 __format::_ChronoData<_CharT> __cd{};
3162 if (_M_f._M_spec._M_needs(_ZoneOffset))
3164 if (!__zt._M_offset_sec)
3165 std::__throw_format_error(
"format error: no timezone available for %z");
3166 __cd._M_zone_offset = *__zt._M_offset_sec;
3169 basic_string<_CharT> __zone_store;
3170 if (_M_f._M_spec._M_needs(_ZoneAbbrev))
3172 if (!__zt._M_abbrev)
3173 std::__throw_format_error(
"format error: no timezone available for %Z");
3175 __cd._M_zone_cstr = __zt._M_abbrev->data();
3176 if constexpr (is_same_v<_CharT, char>)
3177 __cd._M_zone_abbrev = *__zt._M_abbrev;
3181 __zone_store.resize(__zt._M_abbrev->size());
3182 auto& __ct = use_facet<ctype<_CharT>>(_M_f._M_locale(__fc));
3183 __ct.widen(__zt._M_abbrev->data(),
3184 __zt._M_abbrev->data() + __zt._M_abbrev->size(),
3185 __zone_store.data());
3186 __cd._M_zone_abbrev = __zone_store;
3190 _Duration __ed = __zt._M_time.time_since_epoch();
3191 __cd._M_lseconds = chrono::floor<chrono::seconds>(__zt._M_time);
3192 __cd._M_eseconds = __cd._M_lseconds.time_since_epoch();
3193 return _M_f._M_format_time_point(__cd, __ed, __fc);
3197 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3198 __format::__formatter_duration<_CharT>::
3199 template _S_spec_for<_Duration>(__format::_ChronoParts::_ZonedDateTime);
3201 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3204#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
3205 template<
typename _Duration,
typename _TimeZonePtr, __format::__
char _CharT>
3206 struct formatter<
chrono::zoned_time<_Duration, _TimeZonePtr>, _CharT>
3207 : formatter<chrono::__detail::__local_time_fmt_for<_Duration>, _CharT>
3209 template<
typename _Out>
3210 typename basic_format_context<_Out, _CharT>::iterator
3211 format(
const chrono::zoned_time<_Duration, _TimeZonePtr>& __tp,
3212 basic_format_context<_Out, _CharT>& __fc)
const
3214 using _Ltf = chrono::__detail::__local_time_fmt_for<_Duration>;
3215 using _Base = formatter<_Ltf, _CharT>;
3216 const chrono::sys_info __info = __tp.get_info();
3217 const auto __lf = chrono::local_time_format(__tp.get_local_time(),
3220 return _Base::format(__lf, __fc);
3233 template<
typename _Duration = seconds>
3236 static_assert(is_same_v<common_type_t<_Duration, seconds>, _Duration>);
3239 _Parser(__format::_ChronoParts __need) : _M_need(__need) { }
3241 _Parser(_Parser&&) =
delete;
3242 void operator=(_Parser&&) =
delete;
3244 _Duration _M_time{};
3245 sys_days _M_sys_days{};
3246 year_month_day _M_ymd{};
3248 __format::_ChronoParts _M_need;
3249 unsigned _M_is_leap_second : 1 {};
3250 unsigned _M_reserved : 15 {};
3252 template<
typename _CharT,
typename _Traits,
typename _Alloc>
3253 basic_istream<_CharT, _Traits>&
3254 operator()(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3255 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3256 minutes* __offset =
nullptr);
3261 template<
typename _CharT,
typename _Traits>
3262 static int_least32_t
3263 _S_read_unsigned(basic_istream<_CharT, _Traits>& __is,
3264 ios_base::iostate& __err,
int __n)
3266 int_least32_t __val = _S_try_read_digit(__is, __err);
3267 if (__val == -1) [[unlikely]]
3268 __err |= ios_base::failbit;
3273 for (
int __i = 1; __i < __n1; ++__i)
3274 if (
auto __dig = _S_try_read_digit(__is, __err); __dig != -1)
3280 while (__n1++ < __n) [[unlikely]]
3281 if (
auto __dig = _S_try_read_digit(__is, __err); __dig != -1)
3283 if (__builtin_mul_overflow(__val, 10, &__val)
3284 || __builtin_add_overflow(__val, __dig, &__val))
3286 __err |= ios_base::failbit;
3296 template<
typename _CharT,
typename _Traits>
3297 static int_least32_t
3298 _S_read_signed(basic_istream<_CharT, _Traits>& __is,
3299 ios_base::iostate& __err,
int __n)
3301 auto __sign = __is.peek();
3302 if (__sign ==
'-' || __sign ==
'+')
3304 int_least32_t __val = _S_read_unsigned(__is, __err, __n);
3305 if (__err & ios_base::failbit)
3307 if (__sign ==
'-') [[unlikely]]
3315 template<
typename _CharT,
typename _Traits>
3316 static int_least32_t
3317 _S_try_read_digit(basic_istream<_CharT, _Traits>& __is,
3318 ios_base::iostate& __err)
3320 int_least32_t __val = -1;
3321 auto __i = __is.peek();
3322 if (!_Traits::eq_int_type(__i, _Traits::eof())) [[likely]]
3324 _CharT __c = _Traits::to_char_type(__i);
3325 if (_CharT(
'0') <= __c && __c <= _CharT(
'9')) [[likely]]
3328 __val = __c - _CharT(
'0');
3332 __err |= ios_base::eofbit;
3338 template<
typename _CharT,
typename _Traits>
3340 _S_read_chr(basic_istream<_CharT, _Traits>& __is,
3341 ios_base::iostate& __err, _CharT __c)
3343 auto __i = __is.peek();
3344 if (_Traits::eq_int_type(__i, _Traits::eof()))
3345 __err |= ios_base::eofbit;
3346 else if (_Traits::to_char_type(__i) == __c) [[likely]]
3351 __err |= ios_base::failbit;
3356 template<
typename _Duration>
3357 using _Parser_t = _Parser<common_type_t<_Duration, seconds>>;
3359 template<
typename _Duration>
3363 if constexpr (_Duration::period::den == 1)
3365 switch (_Duration::period::num)
3367 case minutes::period::num:
3368 case hours::period::num:
3369 case days::period::num:
3370 case weeks::period::num:
3371 case years::period::num:
3388 template<
typename _ToDur,
typename _Tp>
3390 __round(
const _Tp& __t)
3392 if constexpr (__is_duration_v<_Tp>)
3394 if constexpr (treat_as_floating_point_v<typename _Tp::rep>)
3396 else if constexpr (__detail::__use_floor<_ToDur>())
3403 static_assert(__is_time_point_v<_Tp>);
3404 using _Tpt = time_point<typename _Tp::clock, _ToDur>;
3405 return _Tpt(__detail::__round<_ToDur>(__t.time_since_epoch()));
3412 template<
typename _CharT,
typename _Traits,
typename _Rep,
typename _Period,
3413 typename _Alloc = allocator<_CharT>>
3414 inline basic_istream<_CharT, _Traits>&
3415 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3417 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3420 auto __need = __format::_ChronoParts::_TimeOfDay;
3421 __detail::_Parser_t<duration<_Rep, _Period>> __p(__need);
3422 if (__p(__is, __fmt, __abbrev, __offset))
3423 __d = __detail::__round<duration<_Rep, _Period>>(__p._M_time);
3427 template<
typename _CharT,
typename _Traits>
3428 inline basic_ostream<_CharT, _Traits>&
3429 operator<<(basic_ostream<_CharT, _Traits>& __os,
const day& __d)
3431 using _Ctx = __format::__format_context<_CharT>;
3432 using _Str = basic_string_view<_CharT>;
3433 _Str __s = _GLIBCXX_WIDEN(
"{:02d} is not a valid day");
3435 __s = __s.substr(0, 6);
3436 auto __u = (unsigned)__d;
3437 __os << std::vformat(__s, make_format_args<_Ctx>(__u));
3441 template<
typename _CharT,
typename _Traits,
3442 typename _Alloc = allocator<_CharT>>
3443 inline basic_istream<_CharT, _Traits>&
3444 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3446 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3449 __detail::_Parser<> __p(__format::_ChronoParts::_Day);
3450 if (__p(__is, __fmt, __abbrev, __offset))
3451 __d = __p._M_ymd.day();
3455 template<
typename _CharT,
typename _Traits>
3456 inline basic_ostream<_CharT, _Traits>&
3457 operator<<(basic_ostream<_CharT, _Traits>& __os,
const month& __m)
3459 using _Ctx = __format::__format_context<_CharT>;
3460 using _Str = basic_string_view<_CharT>;
3461 _Str __s = _GLIBCXX_WIDEN(
"{:L%b}{} is not a valid month");
3463 __os << std::vformat(__os.getloc(), __s.substr(0, 6),
3464 make_format_args<_Ctx>(__m));
3467 auto __u = (unsigned)__m;
3468 __os << std::vformat(__s.substr(6), make_format_args<_Ctx>(__u));
3473 template<
typename _CharT,
typename _Traits,
3474 typename _Alloc = allocator<_CharT>>
3475 inline basic_istream<_CharT, _Traits>&
3476 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3478 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3481 __detail::_Parser<> __p(__format::_ChronoParts::_Month);
3482 if (__p(__is, __fmt, __abbrev, __offset))
3483 __m = __p._M_ymd.month();
3487 template<
typename _CharT,
typename _Traits>
3488 inline basic_ostream<_CharT, _Traits>&
3489 operator<<(basic_ostream<_CharT, _Traits>& __os,
const year& __y)
3491 using _Ctx = __format::__format_context<_CharT>;
3492 using _Str = basic_string_view<_CharT>;
3493 _Str __s = _GLIBCXX_WIDEN(
"-{:04d} is not a valid year");
3495 __s = __s.substr(0, 7);
3497 if (__i >= 0) [[likely]]
3498 __s.remove_prefix(1);
3501 __os << std::vformat(__s, make_format_args<_Ctx>(__i));
3505 template<
typename _CharT,
typename _Traits,
3506 typename _Alloc = allocator<_CharT>>
3507 inline basic_istream<_CharT, _Traits>&
3508 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3510 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3513 __detail::_Parser<> __p(__format::_ChronoParts::_Year);
3514 if (__p(__is, __fmt, __abbrev, __offset))
3515 __y = __p._M_ymd.year();
3519 template<
typename _CharT,
typename _Traits>
3520 inline basic_ostream<_CharT, _Traits>&
3521 operator<<(basic_ostream<_CharT, _Traits>& __os,
const weekday& __wd)
3523 using _Ctx = __format::__format_context<_CharT>;
3524 using _Str = basic_string_view<_CharT>;
3525 _Str __s = _GLIBCXX_WIDEN(
"{:L%a}{} is not a valid weekday");
3527 __os << std::vformat(__os.getloc(), __s.substr(0, 6),
3528 make_format_args<_Ctx>(__wd));
3531 auto __c = __wd.c_encoding();
3532 __os << std::vformat(__s.substr(6), make_format_args<_Ctx>(__c));
3537 template<
typename _CharT,
typename _Traits,
3538 typename _Alloc = allocator<_CharT>>
3539 inline basic_istream<_CharT, _Traits>&
3540 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3542 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3545 __detail::_Parser<> __p(__format::_ChronoParts::_Weekday);
3546 if (__p(__is, __fmt, __abbrev, __offset))
3551 template<
typename _CharT,
typename _Traits>
3552 inline basic_ostream<_CharT, _Traits>&
3553 operator<<(basic_ostream<_CharT, _Traits>& __os,
3554 const weekday_indexed& __wdi)
3559 basic_stringstream<_CharT> __os2;
3560 __os2.imbue(__os.getloc());
3561 __os2 << __wdi.weekday();
3562 const auto __i = __wdi.index();
3563 basic_string_view<_CharT> __s
3564 = _GLIBCXX_WIDEN(
"[ is not a valid index]");
3566 __os2 << std::format(_GLIBCXX_WIDEN(
"{}"), __i);
3567 if (__i >= 1 && __i <= 5)
3568 __os2 << __s.back();
3570 __os2 << __s.substr(1);
3571 __os << __os2.view();
3575 template<
typename _CharT,
typename _Traits>
3576 inline basic_ostream<_CharT, _Traits>&
3577 operator<<(basic_ostream<_CharT, _Traits>& __os,
3578 const weekday_last& __wdl)
3581 basic_stringstream<_CharT> __os2;
3582 __os2.imbue(__os.getloc());
3583 __os2 << __wdl.weekday() << _GLIBCXX_WIDEN(
"[last]");
3584 __os << __os2.view();
3588 template<
typename _CharT,
typename _Traits>
3589 inline basic_ostream<_CharT, _Traits>&
3590 operator<<(basic_ostream<_CharT, _Traits>& __os,
const month_day& __md)
3593 basic_stringstream<_CharT> __os2;
3594 __os2.imbue(__os.getloc());
3595 __os2 << __md.month();
3596 if constexpr (is_same_v<_CharT, char>)
3600 __os2 << __md.day();
3601 __os << __os2.view();
3605 template<
typename _CharT,
typename _Traits,
3606 typename _Alloc = allocator<_CharT>>
3607 inline basic_istream<_CharT, _Traits>&
3608 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3610 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3613 using __format::_ChronoParts;
3614 auto __need = _ChronoParts::_Month | _ChronoParts::_Day;
3615 __detail::_Parser<> __p(__need);
3616 if (__p(__is, __fmt, __abbrev, __offset))
3617 __md = month_day(__p._M_ymd.month(), __p._M_ymd.day());
3621 template<
typename _CharT,
typename _Traits>
3622 inline basic_ostream<_CharT, _Traits>&
3623 operator<<(basic_ostream<_CharT, _Traits>& __os,
3624 const month_day_last& __mdl)
3627 basic_stringstream<_CharT> __os2;
3628 __os2.imbue(__os.getloc());
3629 __os2 << __mdl.month() << _GLIBCXX_WIDEN(
"/last");
3630 __os << __os2.view();
3634 template<
typename _CharT,
typename _Traits>
3635 inline basic_ostream<_CharT, _Traits>&
3636 operator<<(basic_ostream<_CharT, _Traits>& __os,
3637 const month_weekday& __mwd)
3640 basic_stringstream<_CharT> __os2;
3641 __os2.imbue(__os.getloc());
3642 __os2 << __mwd.month();
3643 if constexpr (is_same_v<_CharT, char>)
3647 __os2 << __mwd.weekday_indexed();
3648 __os << __os2.view();
3652 template<
typename _CharT,
typename _Traits>
3653 inline basic_ostream<_CharT, _Traits>&
3654 operator<<(basic_ostream<_CharT, _Traits>& __os,
3655 const month_weekday_last& __mwdl)
3658 basic_stringstream<_CharT> __os2;
3659 __os2.imbue(__os.getloc());
3660 __os2 << __mwdl.month();
3661 if constexpr (is_same_v<_CharT, char>)
3665 __os2 << __mwdl.weekday_last();
3666 __os << __os2.view();
3670 template<
typename _CharT,
typename _Traits>
3671 inline basic_ostream<_CharT, _Traits>&
3672 operator<<(basic_ostream<_CharT, _Traits>& __os,
const year_month& __ym)
3675 basic_stringstream<_CharT> __os2;
3676 __os2.imbue(__os.getloc());
3677 __os2 << __ym.year();
3678 if constexpr (is_same_v<_CharT, char>)
3682 __os2 << __ym.month();
3683 __os << __os2.view();
3687 template<
typename _CharT,
typename _Traits,
3688 typename _Alloc = allocator<_CharT>>
3689 inline basic_istream<_CharT, _Traits>&
3690 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3692 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3695 using __format::_ChronoParts;
3696 auto __need = _ChronoParts::_Year | _ChronoParts::_Month;
3697 __detail::_Parser<> __p(__need);
3698 if (__p(__is, __fmt, __abbrev, __offset))
3699 __ym = year_month(__p._M_ymd.year(), __p._M_ymd.month());
3703 template<
typename _CharT,
typename _Traits>
3704 inline basic_ostream<_CharT, _Traits>&
3705 operator<<(basic_ostream<_CharT, _Traits>& __os,
3706 const year_month_day& __ymd)
3708 using _Ctx = __format::__format_context<_CharT>;
3709 using _Str = basic_string_view<_CharT>;
3710 _Str __s = _GLIBCXX_WIDEN(
"{:%F} is not a valid date");
3711 __os << std::vformat(__ymd.ok() ? __s.substr(0, 5) : __s,
3712 make_format_args<_Ctx>(__ymd));
3716 template<
typename _CharT,
typename _Traits,
3717 typename _Alloc = allocator<_CharT>>
3718 inline basic_istream<_CharT, _Traits>&
3720 year_month_day& __ymd,
3724 using __format::_ChronoParts;
3725 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
3726 | _ChronoParts::_Day;
3727 __detail::_Parser<> __p(__need);
3728 if (__p(__is, __fmt, __abbrev, __offset))
3733 template<
typename _CharT,
typename _Traits>
3736 const year_month_day_last& __ymdl)
3741 __os2 << __ymdl.year();
3742 if constexpr (is_same_v<_CharT, char>)
3746 __os2 << __ymdl.month_day_last();
3747 __os << __os2.view();
3751 template<
typename _CharT,
typename _Traits>
3752 inline basic_ostream<_CharT, _Traits>&
3753 operator<<(basic_ostream<_CharT, _Traits>& __os,
3754 const year_month_weekday& __ymwd)
3758 basic_stringstream<_CharT> __os2;
3759 __os2.
imbue(__os.getloc());
3761 if constexpr (is_same_v<_CharT, char>)
3765 __os2 << __ymwd.year() << __slash << __ymwd.month() << __slash
3766 << __ymwd.weekday_indexed();
3767 __os << __os2.view();
3771 template<
typename _CharT,
typename _Traits>
3772 inline basic_ostream<_CharT, _Traits>&
3773 operator<<(basic_ostream<_CharT, _Traits>& __os,
3774 const year_month_weekday_last& __ymwdl)
3778 basic_stringstream<_CharT> __os2;
3779 __os2.imbue(__os.getloc());
3781 if constexpr (is_same_v<_CharT, char>)
3785 __os2 << __ymwdl.year() << __slash << __ymwdl.month() << __slash
3786 << __ymwdl.weekday_last();
3787 __os << __os2.view();
3791 template<
typename _CharT,
typename _Traits,
typename _Duration>
3792 inline basic_ostream<_CharT, _Traits>&
3793 operator<<(basic_ostream<_CharT, _Traits>& __os,
3796 return __os << format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%T}"), __hms);
3799#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
3801 template<
typename _CharT,
typename _Traits>
3802 basic_ostream<_CharT, _Traits>&
3803 operator<<(basic_ostream<_CharT, _Traits>& __os,
const sys_info& __i)
3805 return __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{}"), __i);
3809 template<
typename _CharT,
typename _Traits>
3810 basic_ostream<_CharT, _Traits>&
3811 operator<<(basic_ostream<_CharT, _Traits>& __os,
const local_info& __li)
3813 __os << __format::_Separators<_CharT>::_S_squares()[0];
3814 if (__li.result == local_info::unique)
3818 if (__li.result == local_info::nonexistent)
3819 __os << _GLIBCXX_WIDEN(
"nonexistent");
3821 __os << _GLIBCXX_WIDEN(
"ambiguous");
3822 __os << _GLIBCXX_WIDEN(
" local time between ") << __li.first;
3823 __os << _GLIBCXX_WIDEN(
" and ") << __li.second;
3825 __os << __format::_Separators<_CharT>::_S_squares()[1];
3829 template<
typename _CharT,
typename _Traits,
typename _Duration,
3830 typename _TimeZonePtr>
3831 inline basic_ostream<_CharT, _Traits>&
3832 operator<<(basic_ostream<_CharT, _Traits>& __os,
3833 const zoned_time<_Duration, _TimeZonePtr>& __t)
3835 __os << format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T %Z}"), __t);
3840 template<
typename _CharT,
typename _Traits,
typename _Duration>
3841 requires (!treat_as_floating_point_v<typename _Duration::rep>)
3842 && ratio_less_v<typename _Duration::period, days::period>
3843 inline basic_ostream<_CharT, _Traits>&
3844 operator<<(basic_ostream<_CharT, _Traits>& __os,
3845 const sys_time<_Duration>& __tp)
3847 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __tp);
3851 template<
typename _CharT,
typename _Traits>
3852 inline basic_ostream<_CharT, _Traits>&
3853 operator<<(basic_ostream<_CharT, _Traits>& __os,
const sys_days& __dp)
3855 __os << year_month_day{__dp};
3859 template<
typename _CharT,
typename _Traits,
typename _Duration,
3860 typename _Alloc = allocator<_CharT>>
3861 basic_istream<_CharT, _Traits>&
3862 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3863 sys_time<_Duration>& __tp,
3864 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3870 using __format::_ChronoParts;
3871 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
3872 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
3873 __detail::_Parser_t<_Duration> __p(__need);
3874 if (__p(__is, __fmt, __abbrev, __offset))
3876 if (__p._M_is_leap_second)
3880 auto __st = __p._M_sys_days + __p._M_time - *__offset;
3881 __tp = __detail::__round<_Duration>(__st);
3887 template<
typename _CharT,
typename _Traits,
typename _Duration>
3888 inline basic_ostream<_CharT, _Traits>&
3889 operator<<(basic_ostream<_CharT, _Traits>& __os,
3890 const utc_time<_Duration>& __t)
3892 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
3896 template<
typename _CharT,
typename _Traits,
typename _Duration,
3897 typename _Alloc = allocator<_CharT>>
3898 inline basic_istream<_CharT, _Traits>&
3899 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3900 utc_time<_Duration>& __tp,
3901 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3907 using __format::_ChronoParts;
3908 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
3909 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
3910 __detail::_Parser_t<_Duration> __p(__need);
3911 if (__p(__is, __fmt, __abbrev, __offset))
3915 auto __ut = utc_clock::from_sys(__p._M_sys_days) + __p._M_time
3917 __tp = __detail::__round<_Duration>(__ut);
3922 template<
typename _CharT,
typename _Traits,
typename _Duration>
3923 inline basic_ostream<_CharT, _Traits>&
3924 operator<<(basic_ostream<_CharT, _Traits>& __os,
3925 const tai_time<_Duration>& __t)
3927 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
3931 template<
typename _CharT,
typename _Traits,
typename _Duration,
3932 typename _Alloc = allocator<_CharT>>
3933 inline basic_istream<_CharT, _Traits>&
3934 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3935 tai_time<_Duration>& __tp,
3936 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3942 using __format::_ChronoParts;
3943 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
3944 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
3945 __detail::_Parser_t<_Duration> __p(__need);
3946 if (__p(__is, __fmt, __abbrev, __offset))
3948 if (__p._M_is_leap_second)
3952 constexpr sys_days __epoch(-
days(4383));
3953 auto __d = __p._M_sys_days - __epoch + __p._M_time - *__offset;
3954 tai_time<common_type_t<_Duration, seconds>> __tt(__d);
3955 __tp = __detail::__round<_Duration>(__tt);
3961 template<
typename _CharT,
typename _Traits,
typename _Duration>
3962 inline basic_ostream<_CharT, _Traits>&
3963 operator<<(basic_ostream<_CharT, _Traits>& __os,
3964 const gps_time<_Duration>& __t)
3966 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
3970 template<
typename _CharT,
typename _Traits,
typename _Duration,
3971 typename _Alloc = allocator<_CharT>>
3972 inline basic_istream<_CharT, _Traits>&
3973 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3974 gps_time<_Duration>& __tp,
3975 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3981 using __format::_ChronoParts;
3982 auto __need = _ChronoParts::_YearMonthDay | _ChronoParts::_TimeOfDay;
3983 __detail::_Parser_t<_Duration> __p(__need);
3984 if (__p(__is, __fmt, __abbrev, __offset))
3986 if (__p._M_is_leap_second)
3990 constexpr sys_days __epoch(
days(3657));
3991 auto __d = __p._M_sys_days - __epoch + __p._M_time - *__offset;
3992 gps_time<common_type_t<_Duration, seconds>> __gt(__d);
3993 __tp = __detail::__round<_Duration>(__gt);
3999 template<
typename _CharT,
typename _Traits,
typename _Duration>
4000 inline basic_ostream<_CharT, _Traits>&
4001 operator<<(basic_ostream<_CharT, _Traits>& __os,
4002 const file_time<_Duration>& __t)
4004 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
4008 template<
typename _CharT,
typename _Traits,
typename _Duration,
4009 typename _Alloc = allocator<_CharT>>
4010 inline basic_istream<_CharT, _Traits>&
4011 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
4012 file_time<_Duration>& __tp,
4013 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
4016 sys_time<_Duration> __st;
4017 if (chrono::from_stream(__is, __fmt, __st, __abbrev, __offset))
4018 __tp = __detail::__round<_Duration>(file_clock::from_sys(__st));
4022 template<
typename _CharT,
typename _Traits,
typename _Duration>
4023 inline basic_ostream<_CharT, _Traits>&
4024 operator<<(basic_ostream<_CharT, _Traits>& __os,
4025 const local_time<_Duration>& __lt)
4028 requires requires(
const sys_time<_Duration>& __st) { __os << __st; }
4030 __os << sys_time<_Duration>{__lt.time_since_epoch()};
4034 template<
typename _CharT,
typename _Traits,
typename _Duration,
4035 typename _Alloc = allocator<_CharT>>
4036 basic_istream<_CharT, _Traits>&
4037 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
4038 local_time<_Duration>& __tp,
4039 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
4042 using __format::_ChronoParts;
4043 auto __need = _ChronoParts::_YearMonthDay | _ChronoParts::_TimeOfDay;
4044 __detail::_Parser_t<_Duration> __p(__need);
4045 if (__p(__is, __fmt, __abbrev, __offset))
4047 days __d = __p._M_sys_days.time_since_epoch();
4048 auto __t = local_days(__d) + __p._M_time;
4049 __tp = __detail::__round<_Duration>(__t);
4060 void from_stream() =
delete;
4062 template<
typename _Parsable,
typename _CharT,
4063 typename _Traits = std::char_traits<_CharT>,
4064 typename... _OptArgs>
4065 concept __parsable =
requires (basic_istream<_CharT, _Traits>& __is,
4066 const _CharT* __fmt, _Parsable& __tp,
4067 _OptArgs*... __args)
4068 { from_stream(__is, __fmt, __tp, __args...); };
4070 template<
typename _Parsable,
typename _CharT,
4071 typename _Traits = char_traits<_CharT>,
4072 typename _Alloc = allocator<_CharT>>
4076 using __string_type = basic_string<_CharT, _Traits, _Alloc>;
4079 _Parse(
const _CharT* __fmt, _Parsable& __tp,
4080 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
4083 _M_abbrev(__abbrev), _M_offset(__offset)
4086 _Parse(_Parse&&) =
delete;
4087 _Parse& operator=(_Parse&&) =
delete;
4090 using __stream_type = basic_istream<_CharT, _Traits>;
4092 const _CharT*
const _M_fmt;
4093 _Parsable*
const _M_tp;
4094 __string_type*
const _M_abbrev;
4097 friend __stream_type&
4098 operator>>(__stream_type& __is, _Parse&& __p)
4101 from_stream(__is, __p._M_fmt, *__p._M_tp, __p._M_abbrev,
4103 else if (__p._M_abbrev)
4104 from_stream(__is, __p._M_fmt, *__p._M_tp, __p._M_abbrev);
4106 from_stream(__is, __p._M_fmt, *__p._M_tp);
4110 friend void operator>>(__stream_type&, _Parse&) =
delete;
4111 friend void operator>>(__stream_type&,
const _Parse&) =
delete;
4115 template<
typename _CharT, __detail::__parsable<_CharT> _Parsable>
4116 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
4118 parse(
const _CharT* __fmt, _Parsable& __tp)
4119 {
return __detail::_Parse<_Parsable, _CharT>(__fmt, __tp); }
4121 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4122 __detail::__parsable<_CharT, _Traits> _Parsable>
4125 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp)
4127 return __detail::_Parse<_Parsable, _CharT, _Traits>(__fmt.c_str(), __tp);
4130 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4131 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
4132 __detail::__parsable<_CharT, _Traits, _StrT> _Parsable>
4133 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
4135 parse(
const _CharT* __fmt, _Parsable& __tp,
4136 basic_string<_CharT, _Traits, _Alloc>& __abbrev)
4139 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt, __tp,
4143 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4144 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
4145 __detail::__parsable<_CharT, _Traits, _StrT> _Parsable>
4148 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp,
4149 basic_string<_CharT, _Traits, _Alloc>& __abbrev)
4152 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt.c_str(),
4156 template<
typename _CharT,
typename _Traits =
char_traits<_CharT>,
4157 typename _StrT = basic_
string<_CharT, _Traits>,
4158 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
4159 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
4161 parse(
const _CharT* __fmt, _Parsable& __tp,
minutes& __offset)
4163 return __detail::_Parse<_Parsable, _CharT>(__fmt, __tp,
nullptr,
4167 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4168 typename _StrT = basic_string<_CharT, _Traits>,
4169 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
4172 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp,
4175 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt.c_str(),
4180 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4181 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
4182 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
4183 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
4185 parse(
const _CharT* __fmt, _Parsable& __tp,
4186 basic_string<_CharT, _Traits, _Alloc>& __abbrev,
minutes& __offset)
4189 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt, __tp,
4194 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4195 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
4196 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
4199 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp,
4200 basic_string<_CharT, _Traits, _Alloc>& __abbrev,
minutes& __offset)
4203 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt.c_str(),
4209 template<
typename _Duration>
4210 template<
typename _CharT,
typename _Traits,
typename _Alloc>
4211 basic_istream<_CharT, _Traits>&
4212 __detail::_Parser<_Duration>::
4213 operator()(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
4214 basic_string<_CharT, _Traits, _Alloc>* __abbrev,
4217 using sentry =
typename basic_istream<_CharT, _Traits>::sentry;
4219 if (sentry __cerb(__is,
true); __cerb)
4221 locale __loc = __is.getloc();
4226 struct _Stream_state
4229 _Stream_state(basic_istream<_CharT, _Traits>& __i)
4231 _M_flags(__i.flags(ios_base::
skipws | ios_base::
dec)),
4237 _M_is.flags(_M_flags);
4241 _Stream_state(_Stream_state&&) =
delete;
4243 basic_istream<_CharT, _Traits>& _M_is;
4244 ios_base::fmtflags _M_flags;
4254 auto __read_unsigned = [&] (
int __n) {
4255 return _S_read_unsigned(__is, __err, __n);
4260 auto __read_signed = [&] (
int __n) {
4261 return _S_read_signed(__is, __err, __n);
4265 auto __read_chr = [&__is, &__err] (_CharT __c) {
4266 return _S_read_chr(__is, __err, __c);
4269 using __format::_ChronoParts;
4270 _ChronoParts __parts{};
4272 const year __bad_y = --year::min();
4273 const month __bad_mon(255);
4274 const day __bad_day(255);
4275 const weekday __bad_wday(255);
4276 const hours __bad_h(-1);
4277 const minutes __bad_min(-9999);
4280 year __y = __bad_y, __yy = __bad_y;
4281 year __iso_y = __bad_y, __iso_yy = __bad_y;
4282 month __m = __bad_mon;
4283 day __d = __bad_day;
4284 weekday __wday = __bad_wday;
4285 hours __h = __bad_h, __h12 = __bad_h;
4287 _Duration __s = __bad_sec;
4289 int __iso_wk = -1, __sunday_wk = -1, __monday_wk = -1;
4291 int __dayofyear = -1;
4293 minutes __tz_offset = __bad_min;
4294 basic_string<_CharT, _Traits> __tz_abbr;
4296 if ((_M_need & _ChronoParts::_TimeOfDay) != 0
4297 && (_M_need & _ChronoParts::_Year) != 0)
4303 __parts = _ChronoParts::_TimeOfDay;
4310 bool __is_flag =
false;
4312 constexpr bool __is_floating
4313 = treat_as_floating_point_v<typename _Duration::rep>;
4332 _CharT __c = *__fmt++;
4339 else if (!__read_chr(__c)) [[unlikely]]
4350 if (__mod || __num) [[unlikely]]
4355 __tmget.get(__is, {}, __is, __err, &__tm,
4357 if (!__is_failed(__err))
4358 __wday = weekday(__tm.tm_wday);
4360 __parts |= _ChronoParts::_Weekday;
4366 if (__mod || __num) [[unlikely]]
4374 __tmget.get(__is, {}, __is, __err, &__tm,
4376 if (!__is_failed(__err))
4377 __m = month(__tm.tm_mon + 1);
4379 __parts |= _ChronoParts::_Month;
4383 if (__mod ==
'O' || __num) [[unlikely]]
4388 __tmget.get(__is, {}, __is, __err, &__tm,
4389 __fmt - 2 - (__mod ==
'E'), __fmt);
4390 if (!__is_failed(__err))
4392 __y = year(__tm.tm_year + 1900);
4393 __m = month(__tm.tm_mon + 1);
4394 __d = day(__tm.tm_mday);
4395 __h =
hours(__tm.tm_hour);
4400 __parts |= _ChronoParts::_DateTime;
4404 if (!__mod) [[likely]]
4406 auto __v = __read_signed(__num ? __num : 2);
4407 if (!__is_failed(__err))
4409 int __cmin = (int)year::min() / 100;
4410 int __cmax = (int)year::max() / 100;
4411 if (__cmin <= __v && __v <= __cmax)
4412 __century = __v * 100;
4417 else if (__mod ==
'E')
4420 __tmget.get(__is, {}, __is, __err, &__tm,
4422 if (!__is_failed(__err))
4423 __century = __tm.tm_year;
4432 if (!__mod) [[likely]]
4434 auto __v = __read_unsigned(__num ? __num : 2);
4435 if (!__is_failed(__err))
4438 else if (__mod ==
'O')
4441 __tmget.get(__is, {}, __is, __err, &__tm,
4443 if (!__is_failed(__err))
4444 __d = day(__tm.tm_mday);
4448 __parts |= _ChronoParts::_Day;
4452 if (__mod || __num) [[unlikely]]
4456 auto __month = __read_unsigned(2);
4458 auto __day = __read_unsigned(2);
4460 auto __year = __read_unsigned(2);
4461 if (__is_failed(__err))
4463 __y = year(__year + 1900 + 100 *
int(__year < 69));
4464 __m = month(__month);
4466 if (!year_month_day(__y, __m, __d).ok())
4468 __y = __yy = __iso_y = __iso_yy = __bad_y;
4474 __parts |= _ChronoParts::_Date;
4478 if (__mod) [[unlikely]]
4482 auto __year = __read_signed(__num ? __num : 4);
4484 auto __month = __read_unsigned(2);
4486 auto __day = __read_unsigned(2);
4487 if (__is_failed(__err))
4490 __m = month(__month);
4492 if (!year_month_day(__y, __m, __d).ok())
4494 __y = __yy = __iso_y = __iso_yy = __bad_y;
4500 __parts |= _ChronoParts::_Date;
4504 if (__mod) [[unlikely]]
4508 auto __val = __read_unsigned(__num ? __num : 2);
4509 if (__val >= 0 && __val <= 99)
4511 __iso_yy = year(__val);
4512 if (__century == -1)
4516 __iso_yy = __iso_y = __y = __yy = __bad_y;
4518 __parts |= _ChronoParts::_Year;
4522 if (__mod) [[unlikely]]
4525 __iso_y = year(__read_unsigned(__num ? __num : 4));
4526 __parts |= _ChronoParts::_Year;
4531 if (__mod ==
'E') [[unlikely]]
4533 else if (__mod ==
'O')
4538 __tmget.get(__is, {}, __is, __err, &__tm,
4540 if (!__is_failed(__err))
4544 __h12 =
hours(__tm.tm_hour);
4548 __h =
hours(__tm.tm_hour);
4557 auto __val = __read_unsigned(__num ? __num : 2);
4558 if (__c ==
'I' && __val >= 1 && __val <= 12)
4560 __h12 =
hours(__val);
4563 else if (__c ==
'H' && __val >= 0 && __val <= 23)
4570 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4575 __parts |= _ChronoParts::_TimeOfDay;
4579 if (__mod) [[unlikely]]
4581 else if (_M_need == _ChronoParts::_TimeOfDay)
4583 auto __val = __read_signed(__num ? __num : 3);
4584 if (!__is_failed(__err))
4587 __parts |= _ChronoParts::_TimeOfDay;
4592 __dayofyear = __read_unsigned(__num ? __num : 3);
4599 if (__mod ==
'E') [[unlikely]]
4601 else if (__mod ==
'O')
4604 __tmget.get(__is, {}, __is, __err, &__tm,
4606 if (!__is_failed(__err))
4607 __m = month(__tm.tm_mon + 1);
4611 auto __val = __read_unsigned(__num ? __num : 2);
4612 if (__val >= 1 && __val <= 12)
4617 __parts |= _ChronoParts::_Month;
4621 if (__mod ==
'E') [[unlikely]]
4623 else if (__mod ==
'O')
4626 __tmget.get(__is, {}, __is, __err, &__tm,
4628 if (!__is_failed(__err))
4633 auto __val = __read_unsigned(__num ? __num : 2);
4634 if (0 <= __val && __val < 60)
4638 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4643 __parts |= _ChronoParts::_TimeOfDay;
4653 const _CharT* __ampms[2];
4654 __tmpunct._M_am_pm(__ampms);
4655 int __n = 0, __which = 3;
4656 while (__which != 0)
4658 auto __i = __is.peek();
4659 if (_Traits::eq_int_type(__i, _Traits::eof()))
4669 else if (__ampms[0][__n + 1] == _CharT())
4680 else if (__ampms[1][__n + 1] == _CharT())
4691 if (__which == 0 || __which == 3)
4704 __tmget.get(__is, {}, __is, __err, &__tm,
4706 if (!__is_failed(__err))
4708 __h =
hours(__tm.tm_hour);
4713 __parts |= _ChronoParts::_TimeOfDay;
4718 if (__mod || __num) [[unlikely]]
4725 auto __val = __read_unsigned(2);
4726 if (__val == -1 || __val > 23) [[unlikely]]
4728 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4732 if (!__read_chr(
':')) [[unlikely]]
4736 __val = __read_unsigned(2);
4737 if (__val == -1 || __val > 60) [[unlikely]]
4739 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4747 __parts |= _ChronoParts::_TimeOfDay;
4750 else if (!__read_chr(
':')) [[unlikely]]
4756 if (__mod ==
'E') [[unlikely]]
4758 else if (__mod ==
'O')
4761 __tmget.get(__is, {}, __is, __err, &__tm,
4763 if (!__is_failed(__err))
4766 else if constexpr (_Duration::period::den == 1
4769 auto __val = __read_unsigned(__num ? __num : 2);
4770 if (0 <= __val && __val <= 59) [[likely]]
4774 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4781 basic_stringstream<_CharT> __buf;
4782 auto __digit = _S_try_read_digit(__is, __err);
4785 __buf.put(_CharT(
'0') + __digit);
4786 __digit = _S_try_read_digit(__is, __err);
4788 __buf.put(_CharT(
'0') + __digit);
4791 auto __i = __is.peek();
4792 if (_Traits::eq_int_type(__i, _Traits::eof()))
4800 __dp = __np.decimal_point();
4802 _CharT __c = _Traits::to_char_type(__i);
4808 = hh_mm_ss<_Duration>::fractional_width;
4811 __digit = _S_try_read_digit(__is, __err);
4813 __buf.put(_CharT(
'0') + __digit);
4821 if (!__is_failed(__err)) [[likely]]
4823 long double __val{};
4824#if __cpp_lib_to_chars
4826 auto __first = __str.data();
4827 auto __last = __first + __str.size();
4831 if ((
bool)ec || ptr != __last) [[unlikely]]
4839 if constexpr (__is_floating)
4846 __parts |= _ChronoParts::_TimeOfDay;
4851 if (__mod ==
'E') [[unlikely]]
4853 else if (__mod ==
'O')
4858 __tmget.get(__is, {}, __is, __err, &__tm,
4860 if (!__is_failed(__err))
4861 __wday = weekday(__tm.tm_wday);
4868 const int __lo = __c ==
'u' ? 1 : 0;
4869 const int __hi = __lo + 6;
4870 auto __val = __read_unsigned(__num ? __num : 1);
4871 if (__lo <= __val && __val <= __hi)
4872 __wday = weekday(__val);
4875 __wday = __bad_wday;
4879 __parts |= _ChronoParts::_Weekday;
4885 if (__mod ==
'E') [[unlikely]]
4887 else if (__mod ==
'O')
4889 if (__c ==
'V') [[unlikely]]
4899 const int __lo = __c ==
'V' ? 1 : 0;
4900 const int __hi = 53;
4901 auto __val = __read_unsigned(__num ? __num : 2);
4902 if (__lo <= __val && __val <= __hi)
4907 __sunday_wk = __val;
4913 __monday_wk = __val;
4918 __iso_wk = __sunday_wk = __monday_wk = -1;
4924 if (__mod ==
'O' || __num) [[unlikely]]
4929 __tmget.get(__is, {}, __is, __err, &__tm,
4930 __fmt - 2 - (__mod ==
'E'), __fmt);
4931 if (!__is_failed(__err))
4933 __y = year(__tm.tm_year + 1900);
4934 __m = month(__tm.tm_mon + 1);
4935 __d = day(__tm.tm_mday);
4938 __parts |= _ChronoParts::_Date;
4942 if (__mod ==
'O' || __num) [[unlikely]]
4947 __tmget.get(__is, {}, __is, __err, &__tm,
4948 __fmt - 2 - (__mod ==
'E'), __fmt);
4949 if (!__is_failed(__err))
4951 __h =
hours(__tm.tm_hour);
4956 __parts |= _ChronoParts::_TimeOfDay;
4960 if (__mod) [[unlikely]]
4963 __tmget.get(__is, {}, __is, __err, &__tm,
4965 if (!__is_failed(__err))
4967 int __cent = __tm.tm_year < 2000 ? 1900 : 2000;
4968 __yy = year(__tm.tm_year - __cent);
4969 if (__century == -1)
4975 auto __val = __read_unsigned(__num ? __num : 2);
4976 if (__val >= 0 && __val <= 99)
4979 if (__century == -1)
4980 __century = __val < 69 ? 2000 : 1900;
4983 __y = __yy = __iso_yy = __iso_y = __bad_y;
4985 __parts |= _ChronoParts::_Year;
4989 if (__mod ==
'O') [[unlikely]]
4991 else if (__mod ==
'E')
4994 __tmget.get(__is, {}, __is, __err, &__tm,
4996 if (!__is_failed(__err))
4997 __y = year(__tm.tm_year);
5001 auto __val = __read_unsigned(__num ? __num : 4);
5002 if (!__is_failed(__err))
5005 __parts |= _ChronoParts::_Year;
5009 if (__num) [[unlikely]]
5016 auto __i = __is.peek();
5017 if (_Traits::eq_int_type(__i, _Traits::eof()))
5022 _CharT __ic = _Traits::to_char_type(__i);
5023 const bool __neg = __ic == _CharT(
'-');
5024 if (__ic == _CharT(
'-') || __ic == _CharT(
'+'))
5031 __hh = __read_unsigned(2);
5036 __hh = 10 * _S_try_read_digit(__is, __err);
5037 __hh += _S_try_read_digit(__is, __err);
5040 if (__is_failed(__err))
5044 if (_Traits::eq_int_type(__i, _Traits::eof()))
5047 __tz_offset =
minutes(__hh * (__neg ? -60 : 60));
5050 __ic = _Traits::to_char_type(__i);
5052 bool __read_mm =
false;
5055 if (__ic == _GLIBCXX_WIDEN(
":")[0])
5062 else if (_CharT(
'0') <= __ic && __ic <= _CharT(
'9'))
5068 int_least32_t __mm = 0;
5071 __mm = 10 * _S_try_read_digit(__is, __err);
5072 __mm += _S_try_read_digit(__is, __err);
5075 if (!__is_failed(__err))
5077 auto __z = __hh * 60 + __mm;
5078 __tz_offset =
minutes(__neg ? -__z : __z);
5084 if (__mod || __num) [[unlikely]]
5088 basic_string_view<_CharT> __x = _GLIBCXX_WIDEN(
"_/-+");
5092 auto __i = __is.peek();
5093 if (!_Traits::eq_int_type(__i, _Traits::eof()))
5095 _CharT __a = _Traits::to_char_type(__i);
5097 || __x.find(__a) != __x.npos)
5099 __tz_abbr.push_back(__a);
5108 if (__tz_abbr.empty())
5114 if (__mod || __num) [[unlikely]]
5118 _CharT __i = __is.peek();
5119 if (_Traits::eq_int_type(__i, _Traits::eof()))
5121 else if (
std::isspace(_Traits::to_char_type(__i), __loc))
5129 if (__mod || __num) [[unlikely]]
5133 _CharT __i = __is.peek();
5134 if (_Traits::eq_int_type(__i, _Traits::eof()))
5136 else if (
std::isspace(_Traits::to_char_type(__i), __loc))
5142 if (__mod || __num) [[unlikely]]
5150 if (__mod || __num) [[unlikely]]
5159 if (_CharT(
'1') <= __c && __c <= _CharT(
'9'))
5161 if (!__mod) [[likely]]
5164 auto __end = __fmt + _Traits::length(__fmt);
5166 = __format::__parse_integer(__fmt - 1, __end);
5167 if (__ptr) [[likely]]
5178 if (__is_failed(__err)) [[unlikely]]
5188 if (__yy != __bad_y && __y == __bad_y)
5189 __y =
years(__century) + __yy;
5190 if (__iso_yy != __bad_y && __iso_y == __bad_y)
5191 __iso_y =
years(__century) + __iso_yy;
5194 bool __can_use_doy =
false;
5195 bool __can_use_iso_wk =
false;
5196 bool __can_use_sun_wk =
false;
5197 bool __can_use_mon_wk =
false;
5200 if (__y != __bad_y && __dayofyear >= 0)
5202 __can_use_doy =
true;
5203 __parts |= _ChronoParts::_Date;
5205 else if (__y != __bad_y && __wday != __bad_wday && __sunday_wk >= 0)
5207 __can_use_sun_wk =
true;
5208 __parts |= _ChronoParts::_Date;
5210 else if (__y != __bad_y && __wday != __bad_wday && __monday_wk >= 0)
5212 __can_use_mon_wk =
true;
5213 __parts |= _ChronoParts::_Date;
5215 else if (__iso_y != __bad_y && __wday != __bad_wday && __iso_wk > 0)
5218 __can_use_iso_wk =
true;
5219 __parts |= _ChronoParts::_Date;
5222 if (__is_failed(__err)) [[unlikely]]
5224 else if (__is_flag) [[unlikely]]
5226 else if ((_M_need & __parts) == _M_need) [[likely]]
5248 const bool __need_wday = (_M_need & _ChronoParts::_Weekday) != 0;
5252 const bool __need_time = (_M_need & _ChronoParts::_TimeOfDay) != 0;
5254 if (__need_wday && __wday != __bad_wday)
5256 else if ((_M_need & _ChronoParts::_Date) != 0)
5260 const bool __need_ymd = !__need_wday && !__need_time;
5262 if (((_M_need & _ChronoParts::_Year) != 0 && __y == __bad_y)
5263 || ((_M_need & _ChronoParts::_Month) != 0 && __m == __bad_mon)
5264 || ((_M_need & _ChronoParts::_Day) != 0 && __d == __bad_day))
5271 if ((0 < __dayofyear && __dayofyear <= 365)
5272 || (__dayofyear == 366 && __y.is_leap()))
5275 _M_sys_days = sys_days(__y/January/1)
5276 +
days(__dayofyear - 1);
5278 _M_ymd = year_month_day(_M_sys_days);
5283 else if (__can_use_iso_wk)
5291 const sys_days __jan4(__iso_y/January/4);
5292 weekday __wd1(__jan4 -
days(3));
5293 if (__wd1 != Thursday)
5294 if (__wd1 != Wednesday || !__iso_y.is_leap())
5298 if (!__is_failed(__err)) [[likely]]
5301 sys_days __w(Thursday[1]/January/__iso_y);
5303 __w -= Thursday - Monday;
5305 __w += __wday - Monday;
5309 _M_ymd = year_month_day(_M_sys_days);
5312 else if (__can_use_sun_wk)
5315 sys_days __wk1(__y/January/Sunday[1]);
5316 _M_sys_days = __wk1 +
weeks(__sunday_wk - 1)
5317 +
days(__wday.c_encoding());
5318 _M_ymd = year_month_day(_M_sys_days);
5319 if (_M_ymd.year() != __y) [[unlikely]]
5322 else if (__can_use_mon_wk)
5325 sys_days __wk1(__y/January/Monday[1]);
5326 _M_sys_days = __wk1 +
weeks(__monday_wk - 1)
5327 +
days(__wday.c_encoding() - 1);
5328 _M_ymd = year_month_day(_M_sys_days);
5329 if (_M_ymd.year() != __y) [[unlikely]]
5341 if ((_M_need & _ChronoParts::_Year) != 0)
5343 if (!__y.ok()) [[unlikely]]
5346 else if (__y == __bad_y)
5349 if ((_M_need & _ChronoParts::_Month) != 0)
5351 if (!__m.ok()) [[unlikely]]
5354 else if (__m == __bad_mon)
5357 if ((_M_need & _ChronoParts::_Day) != 0)
5359 if (__d < day(1) || __d > (__y/__m/last).day())
5362 else if (__d == __bad_day)
5365 if (year_month_day __ymd(__y, __m, __d); __ymd.ok())
5368 if (__need_wday || __need_time)
5369 _M_sys_days = sys_days(_M_ymd);
5376 _M_wd = weekday(_M_sys_days);
5382 if (__h == __bad_h && __h12 != __bad_h)
5386 else if (__ampm == 2)
5387 __h = __h12 ==
hours(12) ? __h12 : __h12 +
hours(12);
5392 auto __t = _M_time.zero();
5401 if (__min != __bad_min)
5407 if (__s != __bad_sec)
5411 _M_is_leap_second = __s >=
seconds(60);
5420 if (!__is_failed(__err)) [[likely]]
5422 if (__offset && __tz_offset != __bad_min)
5423 *__offset = __tz_offset;
5424 if (__abbrev && !__tz_abbr.empty())
5432 __is.setstate(__err);
5436#undef _GLIBCXX_WIDEN
5441_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).
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.