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>
2961 : __format::__formatter_chrono<_CharT>
2963 constexpr typename basic_format_parse_context<_CharT>::iterator
2964 parse(basic_format_parse_context<_CharT>& __pc)
2966 using enum __format::_ChronoParts;
2967 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
2970 template<
typename _Out>
2971 typename basic_format_context<_Out, _CharT>::iterator
2972 format(
const chrono::utc_time<_Duration>& __t,
2973 basic_format_context<_Out, _CharT>& __fc)
const
2975 using __format::_ChronoParts;
2976 using namespace chrono;
2977 __format::_ChronoData<_CharT> __cd{};
2978 __cd._M_fill_utc_zone();
2980 _Duration __ed = __t.time_since_epoch();
2981 __cd._M_eseconds = chrono::floor<seconds>(__ed);
2985 const auto __li = chrono::get_leap_second_info(__t);
2986 __cd._M_lseconds = local_seconds(__cd._M_eseconds - __li.elapsed);
2987 auto __parts = _M_f._M_spec._M_needed - _ChronoParts::_TotalSeconds;
2988 if ((__parts & _ChronoParts::_DateTime) != 0)
2990 __cd._M_fill_date_time(__cd._M_lseconds, __parts);
2991 __cd._M_seconds +=
seconds(__li.is_leap_second);
2993 return _M_f._M_format_units(__cd, __ed, __ed - __cd._M_eseconds, __fc);
2997 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
2998 __format::__formatter_duration<_CharT>::
2999 template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
3001 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3004 template<
typename _Duration, __format::__
char _CharT>
3005 struct formatter<
chrono::tai_time<_Duration>, _CharT>
3006 : __format::__formatter_chrono<_CharT>
3008 constexpr typename basic_format_parse_context<_CharT>::iterator
3009 parse(basic_format_parse_context<_CharT>& __pc)
3011 using enum __format::_ChronoParts;
3012 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3015 template<
typename _Out>
3016 typename basic_format_context<_Out, _CharT>::iterator
3017 format(
const chrono::tai_time<_Duration>& __t,
3018 basic_format_context<_Out, _CharT>& __fc)
const
3020 using namespace chrono;
3021 __format::_ChronoData<_CharT> __cd{};
3022 __cd._M_fill_zone(
"TAI", L
"TAI");
3024 _Duration __ed = __t.time_since_epoch();
3025 __cd._M_eseconds = chrono::floor<seconds>(__ed);
3027 constexpr chrono::days __tai_offset = chrono::days(4383);
3028 __cd._M_lseconds = local_seconds(__cd._M_eseconds - __tai_offset);
3029 return _M_f._M_format_time_point(__cd, __ed, __fc);
3033 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3034 __format::__formatter_duration<_CharT>::
3035 template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
3037 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3040 template<
typename _Duration, __format::__
char _CharT>
3041 struct formatter<
chrono::gps_time<_Duration>, _CharT>
3042 : __format::__formatter_chrono<_CharT>
3044 constexpr typename basic_format_parse_context<_CharT>::iterator
3045 parse(basic_format_parse_context<_CharT>& __pc)
3047 using enum __format::_ChronoParts;
3048 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3051 template<
typename _Out>
3052 typename basic_format_context<_Out, _CharT>::iterator
3053 format(
const chrono::gps_time<_Duration>& __t,
3054 basic_format_context<_Out, _CharT>& __fc)
const
3056 using namespace chrono;
3057 __format::_ChronoData<_CharT> __cd{};
3058 __cd._M_fill_zone(
"GPS", L
"GPS");
3060 _Duration __ed = __t.time_since_epoch();
3061 __cd._M_eseconds = chrono::floor<seconds>(__ed);
3063 constexpr chrono::days __gps_offset = chrono::days(3657);
3064 __cd._M_lseconds = local_seconds(__cd._M_eseconds + __gps_offset);
3065 return _M_f._M_format_time_point(__cd, __ed, __fc);
3069 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3070 __format::__formatter_duration<_CharT>::
3071 template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
3073 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3076 template<
typename _Duration, __format::__
char _CharT>
3077 struct formatter<
chrono::file_time<_Duration>, _CharT>
3079 constexpr typename basic_format_parse_context<_CharT>::iterator
3080 parse(basic_format_parse_context<_CharT>& __pc)
3082 using enum __format::_ChronoParts;
3083 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3086 template<
typename _Out>
3087 typename basic_format_context<_Out, _CharT>::iterator
3088 format(
const chrono::file_time<_Duration>& __t,
3089 basic_format_context<_Out, _CharT>& __fc)
const
3091 using namespace chrono;
3092 __format::_ChronoData<_CharT> __cd{};
3093 __cd._M_fill_utc_zone();
3095 _Duration __ed = __t.time_since_epoch();
3096 __cd._M_eseconds = chrono::floor<seconds>(__ed);
3097 auto __st = chrono::clock_cast<system_clock>(__t);
3099 = local_seconds(chrono::floor<seconds>(__st.time_since_epoch()));
3100 return _M_f._M_format_time_point(__cd, __ed, __fc);
3104 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3105 __format::__formatter_duration<_CharT>::
3106 template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
3108 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3111 template<
typename _Duration, __format::__
char _CharT>
3112 struct formatter<
chrono::local_time<_Duration>, _CharT>
3114 constexpr typename basic_format_parse_context<_CharT>::iterator
3115 parse(basic_format_parse_context<_CharT>& __pc)
3117 using enum __format::_ChronoParts;
3118 return _M_f.template _M_parse<_Duration>(__pc, _DateTime, __defSpec);
3121 template<
typename _Out>
3122 typename basic_format_context<_Out, _CharT>::iterator
3123 format(
const chrono::local_time<_Duration>& __lt,
3124 basic_format_context<_Out, _CharT>& __fc)
const
3126 __format::_ChronoData<_CharT> __cd{};
3127 _Duration __ed = __lt.time_since_epoch();
3128 __cd._M_lseconds = chrono::floor<chrono::seconds>(__lt);
3129 __cd._M_eseconds = __cd._M_lseconds.time_since_epoch();
3130 return _M_f._M_format_time_point(__cd, __ed, __fc);
3134 static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
3136 using enum __format::_ChronoParts;
3137 __format::_ChronoParts __needed = _DateTime;
3138 if constexpr (is_convertible_v<_Duration, chrono::days>)
3140 return __format::__formatter_duration<_CharT>::
3141 template _S_spec_for<_Duration>(__needed);
3144 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3147 template<
typename _Duration, __format::__
char _CharT>
3148 struct formatter<
chrono::__detail::__local_time_fmt<_Duration>, _CharT>
3150 constexpr typename basic_format_parse_context<_CharT>::iterator
3151 parse(basic_format_parse_context<_CharT>& __pc)
3153 using enum __format::_ChronoParts;
3154 return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
3157 template<
typename _Out>
3158 typename basic_format_context<_Out, _CharT>::iterator
3159 format(
const chrono::__detail::__local_time_fmt<_Duration>& __zt,
3160 basic_format_context<_Out, _CharT>& __fc)
const
3162 using enum __format::_ChronoParts;
3163 __format::_ChronoData<_CharT> __cd{};
3165 if (_M_f._M_spec._M_needs(_ZoneOffset))
3167 if (!__zt._M_offset_sec)
3168 std::__throw_format_error(
"format error: no timezone available for %z");
3169 __cd._M_zone_offset = *__zt._M_offset_sec;
3172 basic_string<_CharT> __zone_store;
3173 if (_M_f._M_spec._M_needs(_ZoneAbbrev))
3175 if (!__zt._M_abbrev)
3176 std::__throw_format_error(
"format error: no timezone available for %Z");
3178 __cd._M_zone_cstr = __zt._M_abbrev->data();
3179 if constexpr (is_same_v<_CharT, char>)
3180 __cd._M_zone_abbrev = *__zt._M_abbrev;
3184 __zone_store.resize(__zt._M_abbrev->size());
3185 auto& __ct = use_facet<ctype<_CharT>>(_M_f._M_locale(__fc));
3186 __ct.widen(__zt._M_abbrev->data(),
3187 __zt._M_abbrev->data() + __zt._M_abbrev->size(),
3188 __zone_store.data());
3189 __cd._M_zone_abbrev = __zone_store;
3193 _Duration __ed = __zt._M_time.time_since_epoch();
3194 __cd._M_lseconds = chrono::floor<chrono::seconds>(__zt._M_time);
3195 __cd._M_eseconds = __cd._M_lseconds.time_since_epoch();
3196 return _M_f._M_format_time_point(__cd, __ed, __fc);
3200 static constexpr __format::_ChronoSpec<_CharT> __defSpec =
3201 __format::__formatter_duration<_CharT>::
3202 template _S_spec_for<_Duration>(__format::_ChronoParts::_ZonedDateTime);
3204 __format::__formatter_duration<_CharT> _M_f{__defSpec};
3207#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
3208 template<
typename _Duration,
typename _TimeZonePtr, __format::__
char _CharT>
3209 struct formatter<
chrono::zoned_time<_Duration, _TimeZonePtr>, _CharT>
3210 : formatter<chrono::__detail::__local_time_fmt_for<_Duration>, _CharT>
3212 template<
typename _Out>
3213 typename basic_format_context<_Out, _CharT>::iterator
3214 format(
const chrono::zoned_time<_Duration, _TimeZonePtr>& __tp,
3215 basic_format_context<_Out, _CharT>& __fc)
const
3217 using _Ltf = chrono::__detail::__local_time_fmt_for<_Duration>;
3218 using _Base = formatter<_Ltf, _CharT>;
3219 const chrono::sys_info __info = __tp.get_info();
3220 const auto __lf = chrono::local_time_format(__tp.get_local_time(),
3223 return _Base::format(__lf, __fc);
3236 template<
typename _Duration = seconds>
3239 static_assert(is_same_v<common_type_t<_Duration, seconds>, _Duration>);
3242 _Parser(__format::_ChronoParts __need) : _M_need(__need) { }
3244 _Parser(_Parser&&) =
delete;
3245 void operator=(_Parser&&) =
delete;
3247 _Duration _M_time{};
3248 sys_days _M_sys_days{};
3249 year_month_day _M_ymd{};
3251 __format::_ChronoParts _M_need;
3252 unsigned _M_is_leap_second : 1 {};
3253 unsigned _M_reserved : 15 {};
3255 template<
typename _CharT,
typename _Traits,
typename _Alloc>
3256 basic_istream<_CharT, _Traits>&
3257 operator()(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3258 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3259 minutes* __offset =
nullptr);
3264 template<
typename _CharT,
typename _Traits>
3265 static int_least32_t
3266 _S_read_unsigned(basic_istream<_CharT, _Traits>& __is,
3267 ios_base::iostate& __err,
int __n)
3269 int_least32_t __val = _S_try_read_digit(__is, __err);
3270 if (__val == -1) [[unlikely]]
3271 __err |= ios_base::failbit;
3276 for (
int __i = 1; __i < __n1; ++__i)
3277 if (
auto __dig = _S_try_read_digit(__is, __err); __dig != -1)
3283 while (__n1++ < __n) [[unlikely]]
3284 if (
auto __dig = _S_try_read_digit(__is, __err); __dig != -1)
3286 if (__builtin_mul_overflow(__val, 10, &__val)
3287 || __builtin_add_overflow(__val, __dig, &__val))
3289 __err |= ios_base::failbit;
3299 template<
typename _CharT,
typename _Traits>
3300 static int_least32_t
3301 _S_read_signed(basic_istream<_CharT, _Traits>& __is,
3302 ios_base::iostate& __err,
int __n)
3304 auto __sign = __is.peek();
3305 if (__sign ==
'-' || __sign ==
'+')
3307 int_least32_t __val = _S_read_unsigned(__is, __err, __n);
3308 if (__err & ios_base::failbit)
3310 if (__sign ==
'-') [[unlikely]]
3318 template<
typename _CharT,
typename _Traits>
3319 static int_least32_t
3320 _S_try_read_digit(basic_istream<_CharT, _Traits>& __is,
3321 ios_base::iostate& __err)
3323 int_least32_t __val = -1;
3324 auto __i = __is.peek();
3325 if (!_Traits::eq_int_type(__i, _Traits::eof())) [[likely]]
3327 _CharT __c = _Traits::to_char_type(__i);
3328 if (_CharT(
'0') <= __c && __c <= _CharT(
'9')) [[likely]]
3331 __val = __c - _CharT(
'0');
3335 __err |= ios_base::eofbit;
3341 template<
typename _CharT,
typename _Traits>
3343 _S_read_chr(basic_istream<_CharT, _Traits>& __is,
3344 ios_base::iostate& __err, _CharT __c)
3346 auto __i = __is.peek();
3347 if (_Traits::eq_int_type(__i, _Traits::eof()))
3348 __err |= ios_base::eofbit;
3349 else if (_Traits::to_char_type(__i) == __c) [[likely]]
3354 __err |= ios_base::failbit;
3359 template<
typename _Duration>
3360 using _Parser_t = _Parser<common_type_t<_Duration, seconds>>;
3362 template<
typename _Duration>
3366 if constexpr (_Duration::period::den == 1)
3368 switch (_Duration::period::num)
3370 case minutes::period::num:
3371 case hours::period::num:
3372 case days::period::num:
3373 case weeks::period::num:
3374 case years::period::num:
3391 template<
typename _ToDur,
typename _Tp>
3393 __round(
const _Tp& __t)
3395 if constexpr (__is_duration_v<_Tp>)
3397 if constexpr (treat_as_floating_point_v<typename _Tp::rep>)
3399 else if constexpr (__detail::__use_floor<_ToDur>())
3406 static_assert(__is_time_point_v<_Tp>);
3407 using _Tpt = time_point<typename _Tp::clock, _ToDur>;
3408 return _Tpt(__detail::__round<_ToDur>(__t.time_since_epoch()));
3415 template<
typename _CharT,
typename _Traits,
typename _Rep,
typename _Period,
3416 typename _Alloc = allocator<_CharT>>
3417 inline basic_istream<_CharT, _Traits>&
3418 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3420 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3423 auto __need = __format::_ChronoParts::_TimeOfDay;
3424 __detail::_Parser_t<duration<_Rep, _Period>> __p(__need);
3425 if (__p(__is, __fmt, __abbrev, __offset))
3426 __d = __detail::__round<duration<_Rep, _Period>>(__p._M_time);
3430 template<
typename _CharT,
typename _Traits>
3431 inline basic_ostream<_CharT, _Traits>&
3432 operator<<(basic_ostream<_CharT, _Traits>& __os,
const day& __d)
3434 using _Ctx = __format::__format_context<_CharT>;
3435 using _Str = basic_string_view<_CharT>;
3436 _Str __s = _GLIBCXX_WIDEN(
"{:02d} is not a valid day");
3438 __s = __s.substr(0, 6);
3439 auto __u = (unsigned)__d;
3440 __os << std::vformat(__s, make_format_args<_Ctx>(__u));
3444 template<
typename _CharT,
typename _Traits,
3445 typename _Alloc = allocator<_CharT>>
3446 inline basic_istream<_CharT, _Traits>&
3447 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3449 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3452 __detail::_Parser<> __p(__format::_ChronoParts::_Day);
3453 if (__p(__is, __fmt, __abbrev, __offset))
3454 __d = __p._M_ymd.day();
3458 template<
typename _CharT,
typename _Traits>
3459 inline basic_ostream<_CharT, _Traits>&
3460 operator<<(basic_ostream<_CharT, _Traits>& __os,
const month& __m)
3462 using _Ctx = __format::__format_context<_CharT>;
3463 using _Str = basic_string_view<_CharT>;
3464 _Str __s = _GLIBCXX_WIDEN(
"{:L%b}{} is not a valid month");
3466 __os << std::vformat(__os.getloc(), __s.substr(0, 6),
3467 make_format_args<_Ctx>(__m));
3470 auto __u = (unsigned)__m;
3471 __os << std::vformat(__s.substr(6), make_format_args<_Ctx>(__u));
3476 template<
typename _CharT,
typename _Traits,
3477 typename _Alloc = allocator<_CharT>>
3478 inline basic_istream<_CharT, _Traits>&
3479 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3481 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3484 __detail::_Parser<> __p(__format::_ChronoParts::_Month);
3485 if (__p(__is, __fmt, __abbrev, __offset))
3486 __m = __p._M_ymd.month();
3490 template<
typename _CharT,
typename _Traits>
3491 inline basic_ostream<_CharT, _Traits>&
3492 operator<<(basic_ostream<_CharT, _Traits>& __os,
const year& __y)
3494 using _Ctx = __format::__format_context<_CharT>;
3495 using _Str = basic_string_view<_CharT>;
3496 _Str __s = _GLIBCXX_WIDEN(
"-{:04d} is not a valid year");
3498 __s = __s.substr(0, 7);
3500 if (__i >= 0) [[likely]]
3501 __s.remove_prefix(1);
3504 __os << std::vformat(__s, make_format_args<_Ctx>(__i));
3508 template<
typename _CharT,
typename _Traits,
3509 typename _Alloc = allocator<_CharT>>
3510 inline basic_istream<_CharT, _Traits>&
3511 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3513 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3516 __detail::_Parser<> __p(__format::_ChronoParts::_Year);
3517 if (__p(__is, __fmt, __abbrev, __offset))
3518 __y = __p._M_ymd.year();
3522 template<
typename _CharT,
typename _Traits>
3523 inline basic_ostream<_CharT, _Traits>&
3524 operator<<(basic_ostream<_CharT, _Traits>& __os,
const weekday& __wd)
3526 using _Ctx = __format::__format_context<_CharT>;
3527 using _Str = basic_string_view<_CharT>;
3528 _Str __s = _GLIBCXX_WIDEN(
"{:L%a}{} is not a valid weekday");
3530 __os << std::vformat(__os.getloc(), __s.substr(0, 6),
3531 make_format_args<_Ctx>(__wd));
3534 auto __c = __wd.c_encoding();
3535 __os << std::vformat(__s.substr(6), make_format_args<_Ctx>(__c));
3540 template<
typename _CharT,
typename _Traits,
3541 typename _Alloc = allocator<_CharT>>
3542 inline basic_istream<_CharT, _Traits>&
3543 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3545 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3548 __detail::_Parser<> __p(__format::_ChronoParts::_Weekday);
3549 if (__p(__is, __fmt, __abbrev, __offset))
3554 template<
typename _CharT,
typename _Traits>
3555 inline basic_ostream<_CharT, _Traits>&
3556 operator<<(basic_ostream<_CharT, _Traits>& __os,
3557 const weekday_indexed& __wdi)
3562 basic_stringstream<_CharT> __os2;
3563 __os2.imbue(__os.getloc());
3564 __os2 << __wdi.weekday();
3565 const auto __i = __wdi.index();
3566 basic_string_view<_CharT> __s
3567 = _GLIBCXX_WIDEN(
"[ is not a valid index]");
3569 __os2 << std::format(_GLIBCXX_WIDEN(
"{}"), __i);
3570 if (__i >= 1 && __i <= 5)
3571 __os2 << __s.back();
3573 __os2 << __s.substr(1);
3574 __os << __os2.view();
3578 template<
typename _CharT,
typename _Traits>
3579 inline basic_ostream<_CharT, _Traits>&
3580 operator<<(basic_ostream<_CharT, _Traits>& __os,
3581 const weekday_last& __wdl)
3584 basic_stringstream<_CharT> __os2;
3585 __os2.imbue(__os.getloc());
3586 __os2 << __wdl.weekday() << _GLIBCXX_WIDEN(
"[last]");
3587 __os << __os2.view();
3591 template<
typename _CharT,
typename _Traits>
3592 inline basic_ostream<_CharT, _Traits>&
3593 operator<<(basic_ostream<_CharT, _Traits>& __os,
const month_day& __md)
3596 basic_stringstream<_CharT> __os2;
3597 __os2.imbue(__os.getloc());
3598 __os2 << __md.month();
3599 if constexpr (is_same_v<_CharT, char>)
3603 __os2 << __md.day();
3604 __os << __os2.view();
3608 template<
typename _CharT,
typename _Traits,
3609 typename _Alloc = allocator<_CharT>>
3610 inline basic_istream<_CharT, _Traits>&
3611 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3613 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3616 using __format::_ChronoParts;
3617 auto __need = _ChronoParts::_Month | _ChronoParts::_Day;
3618 __detail::_Parser<> __p(__need);
3619 if (__p(__is, __fmt, __abbrev, __offset))
3620 __md = month_day(__p._M_ymd.month(), __p._M_ymd.day());
3624 template<
typename _CharT,
typename _Traits>
3625 inline basic_ostream<_CharT, _Traits>&
3626 operator<<(basic_ostream<_CharT, _Traits>& __os,
3627 const month_day_last& __mdl)
3630 basic_stringstream<_CharT> __os2;
3631 __os2.imbue(__os.getloc());
3632 __os2 << __mdl.month() << _GLIBCXX_WIDEN(
"/last");
3633 __os << __os2.view();
3637 template<
typename _CharT,
typename _Traits>
3638 inline basic_ostream<_CharT, _Traits>&
3639 operator<<(basic_ostream<_CharT, _Traits>& __os,
3640 const month_weekday& __mwd)
3643 basic_stringstream<_CharT> __os2;
3644 __os2.imbue(__os.getloc());
3645 __os2 << __mwd.month();
3646 if constexpr (is_same_v<_CharT, char>)
3650 __os2 << __mwd.weekday_indexed();
3651 __os << __os2.view();
3655 template<
typename _CharT,
typename _Traits>
3656 inline basic_ostream<_CharT, _Traits>&
3657 operator<<(basic_ostream<_CharT, _Traits>& __os,
3658 const month_weekday_last& __mwdl)
3661 basic_stringstream<_CharT> __os2;
3662 __os2.imbue(__os.getloc());
3663 __os2 << __mwdl.month();
3664 if constexpr (is_same_v<_CharT, char>)
3668 __os2 << __mwdl.weekday_last();
3669 __os << __os2.view();
3673 template<
typename _CharT,
typename _Traits>
3674 inline basic_ostream<_CharT, _Traits>&
3675 operator<<(basic_ostream<_CharT, _Traits>& __os,
const year_month& __ym)
3678 basic_stringstream<_CharT> __os2;
3679 __os2.imbue(__os.getloc());
3680 __os2 << __ym.year();
3681 if constexpr (is_same_v<_CharT, char>)
3685 __os2 << __ym.month();
3686 __os << __os2.view();
3690 template<
typename _CharT,
typename _Traits,
3691 typename _Alloc = allocator<_CharT>>
3692 inline basic_istream<_CharT, _Traits>&
3693 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3695 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3698 using __format::_ChronoParts;
3699 auto __need = _ChronoParts::_Year | _ChronoParts::_Month;
3700 __detail::_Parser<> __p(__need);
3701 if (__p(__is, __fmt, __abbrev, __offset))
3702 __ym = year_month(__p._M_ymd.year(), __p._M_ymd.month());
3706 template<
typename _CharT,
typename _Traits>
3707 inline basic_ostream<_CharT, _Traits>&
3708 operator<<(basic_ostream<_CharT, _Traits>& __os,
3709 const year_month_day& __ymd)
3711 using _Ctx = __format::__format_context<_CharT>;
3712 using _Str = basic_string_view<_CharT>;
3713 _Str __s = _GLIBCXX_WIDEN(
"{:%F} is not a valid date");
3714 __os << std::vformat(__ymd.ok() ? __s.substr(0, 5) : __s,
3715 make_format_args<_Ctx>(__ymd));
3719 template<
typename _CharT,
typename _Traits,
3720 typename _Alloc = allocator<_CharT>>
3721 inline basic_istream<_CharT, _Traits>&
3723 year_month_day& __ymd,
3727 using __format::_ChronoParts;
3728 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
3729 | _ChronoParts::_Day;
3730 __detail::_Parser<> __p(__need);
3731 if (__p(__is, __fmt, __abbrev, __offset))
3736 template<
typename _CharT,
typename _Traits>
3739 const year_month_day_last& __ymdl)
3744 __os2 << __ymdl.year();
3745 if constexpr (is_same_v<_CharT, char>)
3749 __os2 << __ymdl.month_day_last();
3750 __os << __os2.view();
3754 template<
typename _CharT,
typename _Traits>
3755 inline basic_ostream<_CharT, _Traits>&
3756 operator<<(basic_ostream<_CharT, _Traits>& __os,
3757 const year_month_weekday& __ymwd)
3761 basic_stringstream<_CharT> __os2;
3762 __os2.
imbue(__os.getloc());
3764 if constexpr (is_same_v<_CharT, char>)
3768 __os2 << __ymwd.year() << __slash << __ymwd.month() << __slash
3769 << __ymwd.weekday_indexed();
3770 __os << __os2.view();
3774 template<
typename _CharT,
typename _Traits>
3775 inline basic_ostream<_CharT, _Traits>&
3776 operator<<(basic_ostream<_CharT, _Traits>& __os,
3777 const year_month_weekday_last& __ymwdl)
3781 basic_stringstream<_CharT> __os2;
3782 __os2.imbue(__os.getloc());
3784 if constexpr (is_same_v<_CharT, char>)
3788 __os2 << __ymwdl.year() << __slash << __ymwdl.month() << __slash
3789 << __ymwdl.weekday_last();
3790 __os << __os2.view();
3794 template<
typename _CharT,
typename _Traits,
typename _Duration>
3795 inline basic_ostream<_CharT, _Traits>&
3796 operator<<(basic_ostream<_CharT, _Traits>& __os,
3799 return __os << format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%T}"), __hms);
3802#if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
3804 template<
typename _CharT,
typename _Traits>
3805 basic_ostream<_CharT, _Traits>&
3806 operator<<(basic_ostream<_CharT, _Traits>& __os,
const sys_info& __i)
3808 return __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{}"), __i);
3812 template<
typename _CharT,
typename _Traits>
3813 basic_ostream<_CharT, _Traits>&
3814 operator<<(basic_ostream<_CharT, _Traits>& __os,
const local_info& __li)
3816 __os << __format::_Separators<_CharT>::_S_squares()[0];
3817 if (__li.result == local_info::unique)
3821 if (__li.result == local_info::nonexistent)
3822 __os << _GLIBCXX_WIDEN(
"nonexistent");
3824 __os << _GLIBCXX_WIDEN(
"ambiguous");
3825 __os << _GLIBCXX_WIDEN(
" local time between ") << __li.first;
3826 __os << _GLIBCXX_WIDEN(
" and ") << __li.second;
3828 __os << __format::_Separators<_CharT>::_S_squares()[1];
3832 template<
typename _CharT,
typename _Traits,
typename _Duration,
3833 typename _TimeZonePtr>
3834 inline basic_ostream<_CharT, _Traits>&
3835 operator<<(basic_ostream<_CharT, _Traits>& __os,
3836 const zoned_time<_Duration, _TimeZonePtr>& __t)
3838 __os << format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T %Z}"), __t);
3843 template<
typename _CharT,
typename _Traits,
typename _Duration>
3844 requires (!treat_as_floating_point_v<typename _Duration::rep>)
3845 && ratio_less_v<typename _Duration::period, days::period>
3846 inline basic_ostream<_CharT, _Traits>&
3847 operator<<(basic_ostream<_CharT, _Traits>& __os,
3848 const sys_time<_Duration>& __tp)
3850 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __tp);
3854 template<
typename _CharT,
typename _Traits>
3855 inline basic_ostream<_CharT, _Traits>&
3856 operator<<(basic_ostream<_CharT, _Traits>& __os,
const sys_days& __dp)
3858 __os << year_month_day{__dp};
3862 template<
typename _CharT,
typename _Traits,
typename _Duration,
3863 typename _Alloc = allocator<_CharT>>
3864 basic_istream<_CharT, _Traits>&
3865 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3866 sys_time<_Duration>& __tp,
3867 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3873 using __format::_ChronoParts;
3874 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
3875 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
3876 __detail::_Parser_t<_Duration> __p(__need);
3877 if (__p(__is, __fmt, __abbrev, __offset))
3879 if (__p._M_is_leap_second)
3883 auto __st = __p._M_sys_days + __p._M_time - *__offset;
3884 __tp = __detail::__round<_Duration>(__st);
3890 template<
typename _CharT,
typename _Traits,
typename _Duration>
3891 inline basic_ostream<_CharT, _Traits>&
3892 operator<<(basic_ostream<_CharT, _Traits>& __os,
3893 const utc_time<_Duration>& __t)
3895 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
3899 template<
typename _CharT,
typename _Traits,
typename _Duration,
3900 typename _Alloc = allocator<_CharT>>
3901 inline basic_istream<_CharT, _Traits>&
3902 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3903 utc_time<_Duration>& __tp,
3904 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3910 using __format::_ChronoParts;
3911 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
3912 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
3913 __detail::_Parser_t<_Duration> __p(__need);
3914 if (__p(__is, __fmt, __abbrev, __offset))
3918 auto __ut = utc_clock::from_sys(__p._M_sys_days) + __p._M_time
3920 __tp = __detail::__round<_Duration>(__ut);
3925 template<
typename _CharT,
typename _Traits,
typename _Duration>
3926 inline basic_ostream<_CharT, _Traits>&
3927 operator<<(basic_ostream<_CharT, _Traits>& __os,
3928 const tai_time<_Duration>& __t)
3930 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
3934 template<
typename _CharT,
typename _Traits,
typename _Duration,
3935 typename _Alloc = allocator<_CharT>>
3936 inline basic_istream<_CharT, _Traits>&
3937 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3938 tai_time<_Duration>& __tp,
3939 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3945 using __format::_ChronoParts;
3946 auto __need = _ChronoParts::_Year | _ChronoParts::_Month
3947 | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
3948 __detail::_Parser_t<_Duration> __p(__need);
3949 if (__p(__is, __fmt, __abbrev, __offset))
3951 if (__p._M_is_leap_second)
3955 constexpr sys_days __epoch(-
days(4383));
3956 auto __d = __p._M_sys_days - __epoch + __p._M_time - *__offset;
3957 tai_time<common_type_t<_Duration, seconds>> __tt(__d);
3958 __tp = __detail::__round<_Duration>(__tt);
3964 template<
typename _CharT,
typename _Traits,
typename _Duration>
3965 inline basic_ostream<_CharT, _Traits>&
3966 operator<<(basic_ostream<_CharT, _Traits>& __os,
3967 const gps_time<_Duration>& __t)
3969 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
3973 template<
typename _CharT,
typename _Traits,
typename _Duration,
3974 typename _Alloc = allocator<_CharT>>
3975 inline basic_istream<_CharT, _Traits>&
3976 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
3977 gps_time<_Duration>& __tp,
3978 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
3984 using __format::_ChronoParts;
3985 auto __need = _ChronoParts::_YearMonthDay | _ChronoParts::_TimeOfDay;
3986 __detail::_Parser_t<_Duration> __p(__need);
3987 if (__p(__is, __fmt, __abbrev, __offset))
3989 if (__p._M_is_leap_second)
3993 constexpr sys_days __epoch(
days(3657));
3994 auto __d = __p._M_sys_days - __epoch + __p._M_time - *__offset;
3995 gps_time<common_type_t<_Duration, seconds>> __gt(__d);
3996 __tp = __detail::__round<_Duration>(__gt);
4002 template<
typename _CharT,
typename _Traits,
typename _Duration>
4003 inline basic_ostream<_CharT, _Traits>&
4004 operator<<(basic_ostream<_CharT, _Traits>& __os,
4005 const file_time<_Duration>& __t)
4007 __os << std::format(__os.getloc(), _GLIBCXX_WIDEN(
"{:L%F %T}"), __t);
4011 template<
typename _CharT,
typename _Traits,
typename _Duration,
4012 typename _Alloc = allocator<_CharT>>
4013 inline basic_istream<_CharT, _Traits>&
4014 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
4015 file_time<_Duration>& __tp,
4016 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
4019 sys_time<_Duration> __st;
4020 if (chrono::from_stream(__is, __fmt, __st, __abbrev, __offset))
4021 __tp = __detail::__round<_Duration>(file_clock::from_sys(__st));
4025 template<
typename _CharT,
typename _Traits,
typename _Duration>
4026 inline basic_ostream<_CharT, _Traits>&
4027 operator<<(basic_ostream<_CharT, _Traits>& __os,
4028 const local_time<_Duration>& __lt)
4031 requires requires(
const sys_time<_Duration>& __st) { __os << __st; }
4033 __os << sys_time<_Duration>{__lt.time_since_epoch()};
4037 template<
typename _CharT,
typename _Traits,
typename _Duration,
4038 typename _Alloc = allocator<_CharT>>
4039 basic_istream<_CharT, _Traits>&
4040 from_stream(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
4041 local_time<_Duration>& __tp,
4042 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
4045 using __format::_ChronoParts;
4046 auto __need = _ChronoParts::_YearMonthDay | _ChronoParts::_TimeOfDay;
4047 __detail::_Parser_t<_Duration> __p(__need);
4048 if (__p(__is, __fmt, __abbrev, __offset))
4050 days __d = __p._M_sys_days.time_since_epoch();
4051 auto __t = local_days(__d) + __p._M_time;
4052 __tp = __detail::__round<_Duration>(__t);
4063 void from_stream() =
delete;
4065 template<
typename _Parsable,
typename _CharT,
4066 typename _Traits = std::char_traits<_CharT>,
4067 typename... _OptArgs>
4068 concept __parsable =
requires (basic_istream<_CharT, _Traits>& __is,
4069 const _CharT* __fmt, _Parsable& __tp,
4070 _OptArgs*... __args)
4071 { from_stream(__is, __fmt, __tp, __args...); };
4073 template<
typename _Parsable,
typename _CharT,
4074 typename _Traits = char_traits<_CharT>,
4075 typename _Alloc = allocator<_CharT>>
4079 using __string_type = basic_string<_CharT, _Traits, _Alloc>;
4082 _Parse(
const _CharT* __fmt, _Parsable& __tp,
4083 basic_string<_CharT, _Traits, _Alloc>* __abbrev =
nullptr,
4086 _M_abbrev(__abbrev), _M_offset(__offset)
4089 _Parse(_Parse&&) =
delete;
4090 _Parse& operator=(_Parse&&) =
delete;
4093 using __stream_type = basic_istream<_CharT, _Traits>;
4095 const _CharT*
const _M_fmt;
4096 _Parsable*
const _M_tp;
4097 __string_type*
const _M_abbrev;
4100 friend __stream_type&
4101 operator>>(__stream_type& __is, _Parse&& __p)
4104 from_stream(__is, __p._M_fmt, *__p._M_tp, __p._M_abbrev,
4106 else if (__p._M_abbrev)
4107 from_stream(__is, __p._M_fmt, *__p._M_tp, __p._M_abbrev);
4109 from_stream(__is, __p._M_fmt, *__p._M_tp);
4113 friend void operator>>(__stream_type&, _Parse&) =
delete;
4114 friend void operator>>(__stream_type&,
const _Parse&) =
delete;
4118 template<
typename _CharT, __detail::__parsable<_CharT> _Parsable>
4119 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
4121 parse(
const _CharT* __fmt, _Parsable& __tp)
4122 {
return __detail::_Parse<_Parsable, _CharT>(__fmt, __tp); }
4124 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4125 __detail::__parsable<_CharT, _Traits> _Parsable>
4128 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp)
4130 return __detail::_Parse<_Parsable, _CharT, _Traits>(__fmt.c_str(), __tp);
4133 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4134 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
4135 __detail::__parsable<_CharT, _Traits, _StrT> _Parsable>
4136 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
4138 parse(
const _CharT* __fmt, _Parsable& __tp,
4139 basic_string<_CharT, _Traits, _Alloc>& __abbrev)
4142 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt, __tp,
4146 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4147 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
4148 __detail::__parsable<_CharT, _Traits, _StrT> _Parsable>
4151 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp,
4152 basic_string<_CharT, _Traits, _Alloc>& __abbrev)
4155 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt.c_str(),
4159 template<
typename _CharT,
typename _Traits =
char_traits<_CharT>,
4160 typename _StrT = basic_
string<_CharT, _Traits>,
4161 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
4162 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
4164 parse(
const _CharT* __fmt, _Parsable& __tp,
minutes& __offset)
4166 return __detail::_Parse<_Parsable, _CharT>(__fmt, __tp,
nullptr,
4170 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4171 typename _StrT = basic_string<_CharT, _Traits>,
4172 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
4175 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp,
4178 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt.c_str(),
4183 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4184 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
4185 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
4186 [[nodiscard, __gnu__::__access__(__read_only__, 1)]]
4188 parse(
const _CharT* __fmt, _Parsable& __tp,
4189 basic_string<_CharT, _Traits, _Alloc>& __abbrev,
minutes& __offset)
4192 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt, __tp,
4197 template<
typename _CharT,
typename _Traits,
typename _Alloc,
4198 typename _StrT = basic_string<_CharT, _Traits, _Alloc>,
4199 __detail::__parsable<_CharT, _Traits, _StrT, minutes> _Parsable>
4202 parse(
const basic_string<_CharT, _Traits, _Alloc>& __fmt, _Parsable& __tp,
4203 basic_string<_CharT, _Traits, _Alloc>& __abbrev,
minutes& __offset)
4206 return __detail::_Parse<_Parsable, _CharT, _Traits, _Alloc>(__fmt.c_str(),
4212 template<
typename _Duration>
4213 template<
typename _CharT,
typename _Traits,
typename _Alloc>
4214 basic_istream<_CharT, _Traits>&
4215 __detail::_Parser<_Duration>::
4216 operator()(basic_istream<_CharT, _Traits>& __is,
const _CharT* __fmt,
4217 basic_string<_CharT, _Traits, _Alloc>* __abbrev,
4220 using sentry =
typename basic_istream<_CharT, _Traits>::sentry;
4222 if (sentry __cerb(__is,
true); __cerb)
4224 locale __loc = __is.getloc();
4229 struct _Stream_state
4232 _Stream_state(basic_istream<_CharT, _Traits>& __i)
4234 _M_flags(__i.flags(ios_base::
skipws | ios_base::
dec)),
4240 _M_is.flags(_M_flags);
4244 _Stream_state(_Stream_state&&) =
delete;
4246 basic_istream<_CharT, _Traits>& _M_is;
4247 ios_base::fmtflags _M_flags;
4257 auto __read_unsigned = [&] (
int __n) {
4258 return _S_read_unsigned(__is, __err, __n);
4263 auto __read_signed = [&] (
int __n) {
4264 return _S_read_signed(__is, __err, __n);
4268 auto __read_chr = [&__is, &__err] (_CharT __c) {
4269 return _S_read_chr(__is, __err, __c);
4272 using __format::_ChronoParts;
4273 _ChronoParts __parts{};
4275 const year __bad_y = --year::min();
4276 const month __bad_mon(255);
4277 const day __bad_day(255);
4278 const weekday __bad_wday(255);
4279 const hours __bad_h(-1);
4280 const minutes __bad_min(-9999);
4283 year __y = __bad_y, __yy = __bad_y;
4284 year __iso_y = __bad_y, __iso_yy = __bad_y;
4285 month __m = __bad_mon;
4286 day __d = __bad_day;
4287 weekday __wday = __bad_wday;
4288 hours __h = __bad_h, __h12 = __bad_h;
4290 _Duration __s = __bad_sec;
4292 int __iso_wk = -1, __sunday_wk = -1, __monday_wk = -1;
4294 int __dayofyear = -1;
4296 minutes __tz_offset = __bad_min;
4297 basic_string<_CharT, _Traits> __tz_abbr;
4299 if ((_M_need & _ChronoParts::_TimeOfDay) != 0
4300 && (_M_need & _ChronoParts::_Year) != 0)
4306 __parts = _ChronoParts::_TimeOfDay;
4313 bool __is_flag =
false;
4315 constexpr bool __is_floating
4316 = treat_as_floating_point_v<typename _Duration::rep>;
4335 _CharT __c = *__fmt++;
4342 else if (!__read_chr(__c)) [[unlikely]]
4353 if (__mod || __num) [[unlikely]]
4358 __tmget.get(__is, {}, __is, __err, &__tm,
4360 if (!__is_failed(__err))
4361 __wday = weekday(__tm.tm_wday);
4363 __parts |= _ChronoParts::_Weekday;
4369 if (__mod || __num) [[unlikely]]
4377 __tmget.get(__is, {}, __is, __err, &__tm,
4379 if (!__is_failed(__err))
4380 __m = month(__tm.tm_mon + 1);
4382 __parts |= _ChronoParts::_Month;
4386 if (__mod ==
'O' || __num) [[unlikely]]
4391 __tmget.get(__is, {}, __is, __err, &__tm,
4392 __fmt - 2 - (__mod ==
'E'), __fmt);
4393 if (!__is_failed(__err))
4395 __y = year(__tm.tm_year + 1900);
4396 __m = month(__tm.tm_mon + 1);
4397 __d = day(__tm.tm_mday);
4398 __h =
hours(__tm.tm_hour);
4403 __parts |= _ChronoParts::_DateTime;
4407 if (!__mod) [[likely]]
4409 auto __v = __read_signed(__num ? __num : 2);
4410 if (!__is_failed(__err))
4412 int __cmin = (int)year::min() / 100;
4413 int __cmax = (int)year::max() / 100;
4414 if (__cmin <= __v && __v <= __cmax)
4415 __century = __v * 100;
4420 else if (__mod ==
'E')
4423 __tmget.get(__is, {}, __is, __err, &__tm,
4425 if (!__is_failed(__err))
4426 __century = __tm.tm_year;
4435 if (!__mod) [[likely]]
4437 auto __v = __read_unsigned(__num ? __num : 2);
4438 if (!__is_failed(__err))
4441 else if (__mod ==
'O')
4444 __tmget.get(__is, {}, __is, __err, &__tm,
4446 if (!__is_failed(__err))
4447 __d = day(__tm.tm_mday);
4451 __parts |= _ChronoParts::_Day;
4455 if (__mod || __num) [[unlikely]]
4459 auto __month = __read_unsigned(2);
4461 auto __day = __read_unsigned(2);
4463 auto __year = __read_unsigned(2);
4464 if (__is_failed(__err))
4466 __y = year(__year + 1900 + 100 *
int(__year < 69));
4467 __m = month(__month);
4469 if (!year_month_day(__y, __m, __d).ok())
4471 __y = __yy = __iso_y = __iso_yy = __bad_y;
4477 __parts |= _ChronoParts::_Date;
4481 if (__mod) [[unlikely]]
4485 auto __year = __read_signed(__num ? __num : 4);
4487 auto __month = __read_unsigned(2);
4489 auto __day = __read_unsigned(2);
4490 if (__is_failed(__err))
4493 __m = month(__month);
4495 if (!year_month_day(__y, __m, __d).ok())
4497 __y = __yy = __iso_y = __iso_yy = __bad_y;
4503 __parts |= _ChronoParts::_Date;
4507 if (__mod) [[unlikely]]
4511 auto __val = __read_unsigned(__num ? __num : 2);
4512 if (__val >= 0 && __val <= 99)
4514 __iso_yy = year(__val);
4515 if (__century == -1)
4519 __iso_yy = __iso_y = __y = __yy = __bad_y;
4521 __parts |= _ChronoParts::_Year;
4525 if (__mod) [[unlikely]]
4528 __iso_y = year(__read_unsigned(__num ? __num : 4));
4529 __parts |= _ChronoParts::_Year;
4534 if (__mod ==
'E') [[unlikely]]
4536 else if (__mod ==
'O')
4541 __tmget.get(__is, {}, __is, __err, &__tm,
4543 if (!__is_failed(__err))
4547 __h12 =
hours(__tm.tm_hour);
4551 __h =
hours(__tm.tm_hour);
4560 auto __val = __read_unsigned(__num ? __num : 2);
4561 if (__c ==
'I' && __val >= 1 && __val <= 12)
4563 __h12 =
hours(__val);
4566 else if (__c ==
'H' && __val >= 0 && __val <= 23)
4573 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4578 __parts |= _ChronoParts::_TimeOfDay;
4582 if (__mod) [[unlikely]]
4584 else if (_M_need == _ChronoParts::_TimeOfDay)
4586 auto __val = __read_signed(__num ? __num : 3);
4587 if (!__is_failed(__err))
4590 __parts |= _ChronoParts::_TimeOfDay;
4595 __dayofyear = __read_unsigned(__num ? __num : 3);
4602 if (__mod ==
'E') [[unlikely]]
4604 else if (__mod ==
'O')
4607 __tmget.get(__is, {}, __is, __err, &__tm,
4609 if (!__is_failed(__err))
4610 __m = month(__tm.tm_mon + 1);
4614 auto __val = __read_unsigned(__num ? __num : 2);
4615 if (__val >= 1 && __val <= 12)
4620 __parts |= _ChronoParts::_Month;
4624 if (__mod ==
'E') [[unlikely]]
4626 else if (__mod ==
'O')
4629 __tmget.get(__is, {}, __is, __err, &__tm,
4631 if (!__is_failed(__err))
4636 auto __val = __read_unsigned(__num ? __num : 2);
4637 if (0 <= __val && __val < 60)
4641 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4646 __parts |= _ChronoParts::_TimeOfDay;
4656 const _CharT* __ampms[2];
4657 __tmpunct._M_am_pm(__ampms);
4658 int __n = 0, __which = 3;
4659 while (__which != 0)
4661 auto __i = __is.peek();
4662 if (_Traits::eq_int_type(__i, _Traits::eof()))
4672 else if (__ampms[0][__n + 1] == _CharT())
4683 else if (__ampms[1][__n + 1] == _CharT())
4694 if (__which == 0 || __which == 3)
4707 __tmget.get(__is, {}, __is, __err, &__tm,
4709 if (!__is_failed(__err))
4711 __h =
hours(__tm.tm_hour);
4716 __parts |= _ChronoParts::_TimeOfDay;
4721 if (__mod || __num) [[unlikely]]
4728 auto __val = __read_unsigned(2);
4729 if (__val == -1 || __val > 23) [[unlikely]]
4731 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4735 if (!__read_chr(
':')) [[unlikely]]
4739 __val = __read_unsigned(2);
4740 if (__val == -1 || __val > 60) [[unlikely]]
4742 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4750 __parts |= _ChronoParts::_TimeOfDay;
4753 else if (!__read_chr(
':')) [[unlikely]]
4759 if (__mod ==
'E') [[unlikely]]
4761 else if (__mod ==
'O')
4764 __tmget.get(__is, {}, __is, __err, &__tm,
4766 if (!__is_failed(__err))
4769 else if constexpr (_Duration::period::den == 1
4772 auto __val = __read_unsigned(__num ? __num : 2);
4773 if (0 <= __val && __val <= 59) [[likely]]
4777 if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
4784 basic_stringstream<_CharT> __buf;
4785 auto __digit = _S_try_read_digit(__is, __err);
4788 __buf.put(_CharT(
'0') + __digit);
4789 __digit = _S_try_read_digit(__is, __err);
4791 __buf.put(_CharT(
'0') + __digit);
4794 auto __i = __is.peek();
4795 if (_Traits::eq_int_type(__i, _Traits::eof()))
4803 __dp = __np.decimal_point();
4805 _CharT __c = _Traits::to_char_type(__i);
4811 = hh_mm_ss<_Duration>::fractional_width;
4814 __digit = _S_try_read_digit(__is, __err);
4816 __buf.put(_CharT(
'0') + __digit);
4824 if (!__is_failed(__err)) [[likely]]
4826 long double __val{};
4827#if __cpp_lib_to_chars
4829 auto __first = __str.data();
4830 auto __last = __first + __str.size();
4834 if ((
bool)ec || ptr != __last) [[unlikely]]
4842 if constexpr (__is_floating)
4849 __parts |= _ChronoParts::_TimeOfDay;
4854 if (__mod ==
'E') [[unlikely]]
4856 else if (__mod ==
'O')
4861 __tmget.get(__is, {}, __is, __err, &__tm,
4863 if (!__is_failed(__err))
4864 __wday = weekday(__tm.tm_wday);
4871 const int __lo = __c ==
'u' ? 1 : 0;
4872 const int __hi = __lo + 6;
4873 auto __val = __read_unsigned(__num ? __num : 1);
4874 if (__lo <= __val && __val <= __hi)
4875 __wday = weekday(__val);
4878 __wday = __bad_wday;
4882 __parts |= _ChronoParts::_Weekday;
4888 if (__mod ==
'E') [[unlikely]]
4890 else if (__mod ==
'O')
4892 if (__c ==
'V') [[unlikely]]
4902 const int __lo = __c ==
'V' ? 1 : 0;
4903 const int __hi = 53;
4904 auto __val = __read_unsigned(__num ? __num : 2);
4905 if (__lo <= __val && __val <= __hi)
4910 __sunday_wk = __val;
4916 __monday_wk = __val;
4921 __iso_wk = __sunday_wk = __monday_wk = -1;
4927 if (__mod ==
'O' || __num) [[unlikely]]
4932 __tmget.get(__is, {}, __is, __err, &__tm,
4933 __fmt - 2 - (__mod ==
'E'), __fmt);
4934 if (!__is_failed(__err))
4936 __y = year(__tm.tm_year + 1900);
4937 __m = month(__tm.tm_mon + 1);
4938 __d = day(__tm.tm_mday);
4941 __parts |= _ChronoParts::_Date;
4945 if (__mod ==
'O' || __num) [[unlikely]]
4950 __tmget.get(__is, {}, __is, __err, &__tm,
4951 __fmt - 2 - (__mod ==
'E'), __fmt);
4952 if (!__is_failed(__err))
4954 __h =
hours(__tm.tm_hour);
4959 __parts |= _ChronoParts::_TimeOfDay;
4963 if (__mod) [[unlikely]]
4966 __tmget.get(__is, {}, __is, __err, &__tm,
4968 if (!__is_failed(__err))
4970 int __cent = __tm.tm_year < 2000 ? 1900 : 2000;
4971 __yy = year(__tm.tm_year - __cent);
4972 if (__century == -1)
4978 auto __val = __read_unsigned(__num ? __num : 2);
4979 if (__val >= 0 && __val <= 99)
4982 if (__century == -1)
4983 __century = __val < 69 ? 2000 : 1900;
4986 __y = __yy = __iso_yy = __iso_y = __bad_y;
4988 __parts |= _ChronoParts::_Year;
4992 if (__mod ==
'O') [[unlikely]]
4994 else if (__mod ==
'E')
4997 __tmget.get(__is, {}, __is, __err, &__tm,
4999 if (!__is_failed(__err))
5000 __y = year(__tm.tm_year);
5004 auto __val = __read_unsigned(__num ? __num : 4);
5005 if (!__is_failed(__err))
5008 __parts |= _ChronoParts::_Year;
5012 if (__num) [[unlikely]]
5019 auto __i = __is.peek();
5020 if (_Traits::eq_int_type(__i, _Traits::eof()))
5025 _CharT __ic = _Traits::to_char_type(__i);
5026 const bool __neg = __ic == _CharT(
'-');
5027 if (__ic == _CharT(
'-') || __ic == _CharT(
'+'))
5034 __hh = __read_unsigned(2);
5039 __hh = 10 * _S_try_read_digit(__is, __err);
5040 __hh += _S_try_read_digit(__is, __err);
5043 if (__is_failed(__err))
5047 if (_Traits::eq_int_type(__i, _Traits::eof()))
5050 __tz_offset =
minutes(__hh * (__neg ? -60 : 60));
5053 __ic = _Traits::to_char_type(__i);
5055 bool __read_mm =
false;
5058 if (__ic == _GLIBCXX_WIDEN(
":")[0])
5065 else if (_CharT(
'0') <= __ic && __ic <= _CharT(
'9'))
5071 int_least32_t __mm = 0;
5074 __mm = 10 * _S_try_read_digit(__is, __err);
5075 __mm += _S_try_read_digit(__is, __err);
5078 if (!__is_failed(__err))
5080 auto __z = __hh * 60 + __mm;
5081 __tz_offset =
minutes(__neg ? -__z : __z);
5087 if (__mod || __num) [[unlikely]]
5091 basic_string_view<_CharT> __x = _GLIBCXX_WIDEN(
"_/-+");
5095 auto __i = __is.peek();
5096 if (!_Traits::eq_int_type(__i, _Traits::eof()))
5098 _CharT __a = _Traits::to_char_type(__i);
5100 || __x.find(__a) != __x.npos)
5102 __tz_abbr.push_back(__a);
5111 if (__tz_abbr.empty())
5117 if (__mod || __num) [[unlikely]]
5121 _CharT __i = __is.peek();
5122 if (_Traits::eq_int_type(__i, _Traits::eof()))
5124 else if (
std::isspace(_Traits::to_char_type(__i), __loc))
5132 if (__mod || __num) [[unlikely]]
5136 _CharT __i = __is.peek();
5137 if (_Traits::eq_int_type(__i, _Traits::eof()))
5139 else if (
std::isspace(_Traits::to_char_type(__i), __loc))
5145 if (__mod || __num) [[unlikely]]
5153 if (__mod || __num) [[unlikely]]
5162 if (_CharT(
'1') <= __c && __c <= _CharT(
'9'))
5164 if (!__mod) [[likely]]
5167 auto __end = __fmt + _Traits::length(__fmt);
5169 = __format::__parse_integer(__fmt - 1, __end);
5170 if (__ptr) [[likely]]
5181 if (__is_failed(__err)) [[unlikely]]
5191 if (__yy != __bad_y && __y == __bad_y)
5192 __y =
years(__century) + __yy;
5193 if (__iso_yy != __bad_y && __iso_y == __bad_y)
5194 __iso_y =
years(__century) + __iso_yy;
5197 bool __can_use_doy =
false;
5198 bool __can_use_iso_wk =
false;
5199 bool __can_use_sun_wk =
false;
5200 bool __can_use_mon_wk =
false;
5203 if (__y != __bad_y && __dayofyear >= 0)
5205 __can_use_doy =
true;
5206 __parts |= _ChronoParts::_Date;
5208 else if (__y != __bad_y && __wday != __bad_wday && __sunday_wk >= 0)
5210 __can_use_sun_wk =
true;
5211 __parts |= _ChronoParts::_Date;
5213 else if (__y != __bad_y && __wday != __bad_wday && __monday_wk >= 0)
5215 __can_use_mon_wk =
true;
5216 __parts |= _ChronoParts::_Date;
5218 else if (__iso_y != __bad_y && __wday != __bad_wday && __iso_wk > 0)
5221 __can_use_iso_wk =
true;
5222 __parts |= _ChronoParts::_Date;
5225 if (__is_failed(__err)) [[unlikely]]
5227 else if (__is_flag) [[unlikely]]
5229 else if ((_M_need & __parts) == _M_need) [[likely]]
5251 const bool __need_wday = (_M_need & _ChronoParts::_Weekday) != 0;
5255 const bool __need_time = (_M_need & _ChronoParts::_TimeOfDay) != 0;
5257 if (__need_wday && __wday != __bad_wday)
5259 else if ((_M_need & _ChronoParts::_Date) != 0)
5263 const bool __need_ymd = !__need_wday && !__need_time;
5265 if (((_M_need & _ChronoParts::_Year) != 0 && __y == __bad_y)
5266 || ((_M_need & _ChronoParts::_Month) != 0 && __m == __bad_mon)
5267 || ((_M_need & _ChronoParts::_Day) != 0 && __d == __bad_day))
5274 if ((0 < __dayofyear && __dayofyear <= 365)
5275 || (__dayofyear == 366 && __y.is_leap()))
5278 _M_sys_days = sys_days(__y/January/1)
5279 +
days(__dayofyear - 1);
5281 _M_ymd = year_month_day(_M_sys_days);
5286 else if (__can_use_iso_wk)
5294 const sys_days __jan4(__iso_y/January/4);
5295 weekday __wd1(__jan4 -
days(3));
5296 if (__wd1 != Thursday)
5297 if (__wd1 != Wednesday || !__iso_y.is_leap())
5301 if (!__is_failed(__err)) [[likely]]
5304 sys_days __w(Thursday[1]/January/__iso_y);
5306 __w -= Thursday - Monday;
5308 __w += __wday - Monday;
5312 _M_ymd = year_month_day(_M_sys_days);
5315 else if (__can_use_sun_wk)
5318 sys_days __wk1(__y/January/Sunday[1]);
5319 _M_sys_days = __wk1 +
weeks(__sunday_wk - 1)
5320 +
days(__wday.c_encoding());
5321 _M_ymd = year_month_day(_M_sys_days);
5322 if (_M_ymd.year() != __y) [[unlikely]]
5325 else if (__can_use_mon_wk)
5328 sys_days __wk1(__y/January/Monday[1]);
5329 _M_sys_days = __wk1 +
weeks(__monday_wk - 1)
5330 +
days(__wday.c_encoding() - 1);
5331 _M_ymd = year_month_day(_M_sys_days);
5332 if (_M_ymd.year() != __y) [[unlikely]]
5344 if ((_M_need & _ChronoParts::_Year) != 0)
5346 if (!__y.ok()) [[unlikely]]
5349 else if (__y == __bad_y)
5352 if ((_M_need & _ChronoParts::_Month) != 0)
5354 if (!__m.ok()) [[unlikely]]
5357 else if (__m == __bad_mon)
5360 if ((_M_need & _ChronoParts::_Day) != 0)
5362 if (__d < day(1) || __d > (__y/__m/last).day())
5365 else if (__d == __bad_day)
5368 if (year_month_day __ymd(__y, __m, __d); __ymd.ok())
5371 if (__need_wday || __need_time)
5372 _M_sys_days = sys_days(_M_ymd);
5379 _M_wd = weekday(_M_sys_days);
5385 if (__h == __bad_h && __h12 != __bad_h)
5389 else if (__ampm == 2)
5390 __h = __h12 ==
hours(12) ? __h12 : __h12 +
hours(12);
5395 auto __t = _M_time.zero();
5404 if (__min != __bad_min)
5410 if (__s != __bad_sec)
5414 _M_is_leap_second = __s >=
seconds(60);
5423 if (!__is_failed(__err)) [[likely]]
5425 if (__offset && __tz_offset != __bad_min)
5426 *__offset = __tz_offset;
5427 if (__abbrev && !__tz_abbr.empty())
5435 __is.setstate(__err);
5439#undef _GLIBCXX_WIDEN
5444_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.