20# include <type_traits>
28#ifndef FMT_SAFE_DURATION_CAST
29# define FMT_SAFE_DURATION_CAST 1
31#if FMT_SAFE_DURATION_CAST
39namespace safe_duration_cast {
42template <
typename To,
typename From,
44 std::numeric_limits<From>::is_signed ==
45 std::numeric_limits<To>::is_signed)>
49 using F = std::numeric_limits<From>;
50 using T = std::numeric_limits<To>;
51 static_assert(F::is_integer,
"From must be integral");
52 static_assert(T::is_integer,
"To must be integral");
59 if (
from < (T::min)() ||
from > (T::max)()) {
65 return static_cast<To
>(
from);
70template <
typename To,
typename From,
72 std::numeric_limits<From>::is_signed !=
73 std::numeric_limits<To>::is_signed)>
77 using F = std::numeric_limits<From>;
78 using T = std::numeric_limits<To>;
79 static_assert(F::is_integer,
"From must be integral");
80 static_assert(T::is_integer,
"To must be integral");
84 if (fmt::detail::is_negative(
from)) {
97 F::digits >= T::digits) &&
102 return static_cast<To
>(
from);
105template <
typename To,
typename From,
127template <
typename To,
typename From,
131 using T = std::numeric_limits<To>;
132 static_assert(std::is_floating_point<From>::value,
"From must be floating");
133 static_assert(std::is_floating_point<To>::value,
"To must be floating");
136 if (std::isfinite(
from)) {
137 if (
from >= T::lowest() &&
from <= (T::max)()) {
138 return static_cast<To
>(
from);
146 return static_cast<To
>(
from);
149template <
typename To,
typename From,
153 static_assert(std::is_floating_point<From>::value,
"From must be floating");
158template <
typename To,
typename FromRep,
typename FromPeriod,
160 FMT_ENABLE_IF(std::is_floating_point<typename To::rep>::value)>
161auto safe_duration_cast(std::chrono::duration<FromRep, FromPeriod>
from,
163 using From = std::chrono::duration<FromRep, FromPeriod>;
169 : std::ratio_divide<typename From::period, typename To::period> {};
171 static_assert(Factor::num > 0,
"num must be positive");
172 static_assert(Factor::den > 0,
"den must be positive");
178 using IntermediateRep =
179 typename std::common_type<
typename From::rep,
typename To::rep,
180 decltype(Factor::num)>::type;
184 IntermediateRep count =
185 safe_float_conversion<IntermediateRep>(
from.count(), ec);
193 static_cast<IntermediateRep
>(Factor::num);
198 constexpr auto min1 = std::numeric_limits<IntermediateRep>::lowest() /
199 static_cast<IntermediateRep
>(Factor::num);
204 count *=
static_cast<IntermediateRep
>(Factor::num);
209 using common_t =
typename std::common_type<IntermediateRep, intmax_t>::type;
210 count /=
static_cast<common_t
>(Factor::den);
214 using ToRep =
typename To::rep;
216 const ToRep tocount = safe_float_conversion<ToRep>(count, ec);
228#ifdef FMT_USE_UTC_TIME
230#elif defined(__cpp_lib_chrono)
231# define FMT_USE_UTC_TIME (__cpp_lib_chrono >= 201907L)
233# define FMT_USE_UTC_TIME 0
236using utc_clock = std::chrono::utc_clock;
244#ifdef FMT_USE_LOCAL_TIME
246#elif defined(__cpp_lib_chrono)
247# define FMT_USE_LOCAL_TIME (__cpp_lib_chrono >= 201907L)
249# define FMT_USE_LOCAL_TIME 0
251#if FMT_USE_LOCAL_TIME
252using local_t = std::chrono::local_t;
259template <
typename Duration>
260using sys_time = std::chrono::time_point<std::chrono::system_clock, Duration>;
262template <
typename Duration>
263using utc_time = std::chrono::time_point<detail::utc_clock, Duration>;
265template <
class Duration>
266using local_time = std::chrono::time_point<detail::local_t, Duration>;
274template <
typename T =
void>
struct null {};
280template <
typename StreamBuf>
class formatbuf :
public StreamBuf {
282 using char_type =
typename StreamBuf::char_type;
283 using streamsize =
decltype(std::declval<StreamBuf>().sputn(
nullptr, 0));
284 using int_type =
typename StreamBuf::int_type;
285 using traits_type =
typename StreamBuf::traits_type;
300 if (!traits_type::eq_int_type(ch, traits_type::eof()))
301 buffer_.
push_back(
static_cast<char_type
>(ch));
305 auto xsputn(
const char_type* s, streamsize
count) -> streamsize
override {
312 static const auto&
locale = std::locale::classic();
322template <
typename CodeUnit>
324 const std::locale& loc) {
327 auto& f = std::use_facet<std::codecvt<CodeUnit, char, std::mbstate_t>>(loc);
329 auto mb = std::mbstate_t();
330 const char* from_next =
nullptr;
331 auto result = f.in(mb, in.begin(), in.end(), from_next, std::begin(out.buf),
332 std::end(out.buf), out.end);
333 if (result != std::codecvt_base::ok)
334 FMT_THROW(format_error(
"failed to format time"));
337template <
typename OutputIt>
343#if FMT_MSC_VERSION != 0 || \
344 (defined(__GLIBCXX__) && \
345 (!defined(_GLIBCXX_USE_DUAL_ABI) || _GLIBCXX_USE_DUAL_ABI == 0))
348 using code_unit = wchar_t;
350 using code_unit = char32_t;
359 if (!u.convert({unit.buf, to_unsigned(unit.end - unit.buf)}))
360 FMT_THROW(format_error(
"failed to format time"));
361 return copy<char>(u.c_str(), u.c_str() + u.size(), out);
363 return copy<char>(in.data(), in.data() + in.size(), out);
366template <
typename Char,
typename OutputIt,
375template <
typename Char,
typename OutputIt,
382template <
typename Char>
384 const std::locale& loc,
char format,
char modifier) {
386 auto&& os = std::basic_ostream<Char>(&format_buf);
388 const auto& facet = std::use_facet<std::time_put<Char>>(loc);
389 auto end = facet.put(os, os, Char(
' '), &time,
format, modifier);
390 if (end.failed())
FMT_THROW(format_error(
"failed to format time"));
393template <
typename Char,
typename OutputIt,
395auto write(OutputIt out,
const std::tm& time,
const std::locale& loc,
396 char format,
char modifier = 0) -> OutputIt {
402template <
typename Char,
typename OutputIt,
404auto write(OutputIt out,
const std::tm& time,
const std::locale& loc,
405 char format,
char modifier = 0) -> OutputIt {
411template <
typename T,
typename U>
413 bool_constant<(std::is_integral<T>::value && std::is_integral<U>::value) ||
414 (std::is_floating_point<T>::value &&
415 std::is_floating_point<U>::value)>;
418 FMT_THROW(format_error(
"cannot format duration"));
422template <
typename To,
typename FromRep,
typename FromPeriod,
424 std::is_integral<typename To::rep>::value)>
426#if !FMT_SAFE_DURATION_CAST
427 return std::chrono::duration_cast<To>(
from);
430 using factor = std::ratio_divide<FromPeriod, typename To::period>;
432 using common_rep =
typename std::common_type<FromRep,
typename To::rep,
433 decltype(factor::num)>::type;
439 const auto min = (std::numeric_limits<common_rep>::min)() / factor::num;
442 count *= factor::num;
447 To(safe_duration_cast::lossless_integral_conversion<typename To::rep>(
454template <
typename To,
typename FromRep,
typename FromPeriod,
456 std::is_floating_point<typename To::rep>::value)>
458#if FMT_SAFE_DURATION_CAST
464 To to = safe_duration_cast::safe_duration_cast<To>(
from, ec);
469 return std::chrono::duration_cast<To>(
from);
473template <
typename To,
typename FromRep,
typename FromPeriod,
475 !is_similar_arithmetic_type<FromRep, typename To::rep>::value)>
478 return std::chrono::duration_cast<To>(
from);
481template <
typename Duration>
487 time_point.time_since_epoch())
500inline auto gmtime(std::time_t time) -> std::tm {
505 inline dispatcher(std::time_t t) : time_(t) {}
507 inline auto run() ->
bool {
508 using namespace fmt::detail;
509 return handle(gmtime_r(&time_, &tm_));
512 inline auto handle(std::tm* tm) ->
bool {
return tm !=
nullptr; }
515 using namespace fmt::detail;
516 return fallback(gmtime_s(&tm_, &time_));
519 inline auto fallback(
int res) ->
bool {
return res == 0; }
523 std::tm* tm = std::gmtime(&time_);
525 return tm !=
nullptr;
529 auto gt = dispatcher(time);
531 if (!gt.run())
FMT_THROW(format_error(
"time_t value out of range"));
535template <
typename Duration>
546 unsigned c,
char sep) {
547 unsigned long long digits =
548 a | (b << 24) | (static_cast<unsigned long long>(c) << 48);
558 digits += (((digits * 205) >> 11) & 0x000f00000f00000f) * 6;
560 digits = ((digits & 0x00f00000f00000f0) >> 4) |
561 ((digits & 0x000f00000f00000f) << 8);
562 auto usep =
static_cast<unsigned long long>(sep);
564 digits |= 0x3030003030003030 | (usep << 16) | (usep << 40);
566 constexpr size_t len = 8;
569 std::memcpy(tmp, &digits, len);
570 std::reverse_copy(tmp, tmp + len, buf);
572 std::memcpy(buf, &digits, len);
576template <
typename Period>
578 if (std::is_same<Period, std::atto>::value)
return "as";
579 if (std::is_same<Period, std::femto>::value)
return "fs";
580 if (std::is_same<Period, std::pico>::value)
return "ps";
581 if (std::is_same<Period, std::nano>::value)
return "ns";
582 if (std::is_same<Period, std::micro>::value)
584 if (std::is_same<Period, std::milli>::value)
return "ms";
585 if (std::is_same<Period, std::centi>::value)
return "cs";
586 if (std::is_same<Period, std::deci>::value)
return "ds";
587 if (std::is_same<Period, std::ratio<1>>::value)
return "s";
588 if (std::is_same<Period, std::deca>::value)
return "das";
589 if (std::is_same<Period, std::hecto>::value)
return "hs";
590 if (std::is_same<Period, std::kilo>::value)
return "ks";
591 if (std::is_same<Period, std::mega>::value)
return "Ms";
592 if (std::is_same<Period, std::giga>::value)
return "Gs";
593 if (std::is_same<Period, std::tera>::value)
return "Ts";
594 if (std::is_same<Period, std::peta>::value)
return "Ps";
595 if (std::is_same<Period, std::exa>::value)
return "Es";
596 if (std::is_same<Period, std::ratio<60>>::value)
return "min";
597 if (std::is_same<Period, std::ratio<3600>>::value)
return "h";
598 if (std::is_same<Period, std::ratio<86400>>::value)
return "d";
618template <
typename OutputIt>
624template <
typename OutputIt>
631template <
typename Char,
typename Handler>
633 Handler&& handler) ->
const Char* {
634 if (begin == end || *begin ==
'}')
return begin;
635 if (*begin !=
'%')
FMT_THROW(format_error(
"invalid format"));
645 if (begin !=
ptr) handler.on_text(begin,
ptr);
647 if (
ptr == end)
FMT_THROW(format_error(
"invalid format"));
659 if (
ptr == end)
FMT_THROW(format_error(
"invalid format"));
662 case '%': handler.on_text(
ptr - 1,
ptr);
break;
664 const Char newline[] = {
'\n'};
665 handler.on_text(newline, newline + 1);
669 const Char tab[] = {
'\t'};
670 handler.on_text(tab, tab + 1);
677 case 'G': handler.on_iso_week_based_year();
break;
678 case 'g': handler.on_iso_week_based_short_year();
break;
680 case 'a': handler.on_abbr_weekday();
break;
681 case 'A': handler.on_full_weekday();
break;
686 case 'h': handler.on_abbr_month();
break;
687 case 'B': handler.on_full_month();
break;
697 case 'j': handler.on_day_of_year(pad);
break;
711 case 'D': handler.on_us_date();
break;
712 case 'F': handler.on_iso_date();
break;
713 case 'r': handler.on_12_hour_time();
break;
714 case 'R': handler.on_24_hour_time();
break;
715 case 'T': handler.on_iso_time();
break;
716 case 'p': handler.on_am_pm();
break;
717 case 'Q': handler.on_duration_value();
break;
718 case 'q': handler.on_duration_unit();
break;
720 case 'Z': handler.on_tz_name();
break;
723 if (
ptr == end)
FMT_THROW(format_error(
"invalid format"));
727 case 'y': handler.on_offset_year();
break;
733 default:
FMT_THROW(format_error(
"invalid format"));
738 if (
ptr == end)
FMT_THROW(format_error(
"invalid format"));
765 default:
FMT_THROW(format_error(
"invalid format"));
768 default:
FMT_THROW(format_error(
"invalid format"));
772 if (begin !=
ptr) handler.on_text(begin,
ptr);
827 bool has_timezone_ =
false;
831 : has_timezone_(has_timezone) {}
837 template <
typename Char>
871 if (!has_timezone_)
FMT_THROW(format_error(
"no timezone"));
874 if (!has_timezone_)
FMT_THROW(format_error(
"no timezone"));
879 static constexpr const char* full_name_list[] = {
880 "Sunday",
"Monday",
"Tuesday",
"Wednesday",
881 "Thursday",
"Friday",
"Saturday"};
882 return wday >= 0 && wday <= 6 ? full_name_list[wday] :
"?";
885 static constexpr const char* short_name_list[] = {
"Sun",
"Mon",
"Tue",
"Wed",
886 "Thu",
"Fri",
"Sat"};
887 return wday >= 0 && wday <= 6 ? short_name_list[wday] :
"???";
891 static constexpr const char* full_name_list[] = {
892 "January",
"February",
"March",
"April",
"May",
"June",
893 "July",
"August",
"September",
"October",
"November",
"December"};
894 return mon >= 0 && mon <= 11 ? full_name_list[mon] :
"?";
897 static constexpr const char* short_name_list[] = {
898 "Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
899 "Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
901 return mon >= 0 && mon <= 11 ? short_name_list[mon] :
"???";
904template <
typename T,
typename =
void>
909template <
typename T,
typename =
void>
struct has_tm_zone : std::false_type {};
913template <
typename T, FMT_ENABLE_IF(has_tm_zone<T>::value)>
918template <
typename T, FMT_ENABLE_IF(!has_tm_zone<T>::value)>
923inline auto utc() ->
char* {
924 static char tz[] =
"UTC";
929template <
typename T,
typename Int, FMT_ENABLE_IF(std::is_
integral<T>::value)>
931 if (!std::is_unsigned<Int>::value &&
933 FMT_THROW(format_error(
"chrono value is out of range"));
935 return static_cast<Int
>(
value);
937template <
typename T,
typename Int, FMT_ENABLE_IF(!std::is_
integral<T>::value)>
939 auto int_value =
static_cast<Int
>(value);
940 if (int_value < 0 || value >
static_cast<T
>(upper))
941 FMT_THROW(format_error(
"invalid value"));
945constexpr auto pow10(std::uint32_t n) ->
long long {
946 return n == 0 ? 1 : 10 *
pow10(n - 1);
952template <
long long Num,
long long Den,
int N = 0,
953 bool Enabled = (N < 19) && (Num <= max_value<long long>() / 10)>
961template <
long long Num,
long long Den,
int N>
963 static constexpr int value = (Num % Den == 0) ? N : 6;
968template <
typename Char,
typename OutputIt,
typename Duration>
970 constexpr auto num_fractional_digits =
972 Duration::period::den>::value;
974 using subsecond_precision = std::chrono::duration<
975 typename std::common_type<
typename Duration::rep,
976 std::chrono::seconds::rep>
::type,
977 std::ratio<1,
pow10(num_fractional_digits)>>;
980 const auto subseconds =
981 std::chrono::treat_as_floating_point<
982 typename subsecond_precision::rep>::value
988 int leading_zeroes = (std::max)(0, num_fractional_digits - num_digits);
990 FMT_ASSERT(!std::is_floating_point<typename Duration::rep>::value,
"");
991 if (std::ratio_less<
typename subsecond_precision::period,
992 std::chrono::seconds::period>::value) {
1000 int remaining =
precision - leading_zeroes;
1002 if (remaining < num_digits) {
1003 int num_truncated_digits = num_digits - remaining;
1010 remaining -= num_digits;
1019template <
typename Duration>
1021 int num_fractional_digits = -1) {
1022 using rep =
typename Duration::rep;
1023 FMT_ASSERT(std::is_floating_point<rep>::value,
"");
1025 auto val = duration.count();
1027 if (num_fractional_digits < 0) {
1030 using namespace std;
1031 num_fractional_digits =
1033 Duration::period::den>::value;
1034 if (num_fractional_digits < 6 &&
static_cast<rep
>(round(val)) != val)
1035 num_fractional_digits = 6;
1038 fmt::format_to(std::back_inserter(buf),
FMT_STRING(
"{:.{}f}"),
1039 std::fmod(val *
static_cast<rep
>(Duration::period::num) /
1040 static_cast<rep
>(Duration::period::den),
1041 static_cast<rep
>(60)),
1042 num_fractional_digits);
1045template <
typename OutputIt,
typename Char,
1046 typename Duration = std::chrono::seconds>
1049 static constexpr int days_per_week = 7;
1051 const std::locale& loc_;
1054 const Duration* subsecs_;
1057 auto tm_sec()
const noexcept ->
int {
1058 FMT_ASSERT(tm_.tm_sec >= 0 && tm_.tm_sec <= 61,
"");
1061 auto tm_min()
const noexcept ->
int {
1062 FMT_ASSERT(tm_.tm_min >= 0 && tm_.tm_min <= 59,
"");
1065 auto tm_hour()
const noexcept ->
int {
1066 FMT_ASSERT(tm_.tm_hour >= 0 && tm_.tm_hour <= 23,
"");
1069 auto tm_mday()
const noexcept ->
int {
1070 FMT_ASSERT(tm_.tm_mday >= 1 && tm_.tm_mday <= 31,
"");
1073 auto tm_mon()
const noexcept ->
int {
1074 FMT_ASSERT(tm_.tm_mon >= 0 && tm_.tm_mon <= 11,
"");
1077 auto tm_year()
const noexcept ->
long long {
return 1900ll + tm_.tm_year; }
1078 auto tm_wday()
const noexcept ->
int {
1079 FMT_ASSERT(tm_.tm_wday >= 0 && tm_.tm_wday <= 6,
"");
1082 auto tm_yday()
const noexcept ->
int {
1083 FMT_ASSERT(tm_.tm_yday >= 0 && tm_.tm_yday <= 365,
"");
1087 auto tm_hour12()
const noexcept ->
int {
1089 auto z = h < 12 ? h : h - 12;
1090 return z == 0 ? 12 : z;
1097 auto split_year_lower(
long long year)
const noexcept ->
int {
1098 auto l =
year % 100;
1100 return static_cast<int>(l);
1104 auto iso_year_weeks(
long long curr_year)
const noexcept ->
int {
1105 auto prev_year = curr_year - 1;
1107 (curr_year + curr_year / 4 - curr_year / 100 + curr_year / 400) %
1110 (prev_year + prev_year / 4 - prev_year / 100 + prev_year / 400) %
1112 return 52 + ((curr_p == 4 || prev_p == 3) ? 1 : 0);
1114 auto iso_week_num(
int tm_yday,
int tm_wday)
const noexcept ->
int {
1115 return (tm_yday + 11 - (tm_wday == 0 ? days_per_week : tm_wday)) /
1118 auto tm_iso_week_year()
const noexcept ->
long long {
1119 auto year = tm_year();
1120 auto w = iso_week_num(tm_yday(), tm_wday());
1121 if (w < 1)
return year - 1;
1122 if (w > iso_year_weeks(
year))
return year + 1;
1125 auto tm_iso_week_of_year()
const noexcept ->
int {
1126 auto year = tm_year();
1127 auto w = iso_week_num(tm_yday(), tm_wday());
1128 if (w < 1)
return iso_year_weeks(
year - 1);
1129 if (w > iso_year_weeks(
year))
return 1;
1133 void write1(
int value) {
1136 void write2(
int value) {
1149 *out_++ =
static_cast<char>(
'0' + v);
1153 void write_year_extended(
long long year,
pad_type pad) {
1156 bool negative =
year < 0;
1164 if (
width > num_digits)
1170 write_year_extended(
year, pad);
1181 write2(
static_cast<int>(offset / 60));
1183 write2(
static_cast<int>(offset % 60));
1186 template <
typename T, FMT_ENABLE_IF(has_tm_gmtoff<T>::value)>
1188 write_utc_offset(tm.tm_gmtoff, ns);
1190 template <
typename T, FMT_ENABLE_IF(!has_tm_gmtoff<T>::value)>
1192 write_utc_offset(0, ns);
1195 template <
typename T, FMT_ENABLE_IF(has_tm_zone<T>::value)>
1196 void format_tz_name(
const T& tm) {
1199 template <
typename T, FMT_ENABLE_IF(!has_tm_zone<T>::value)>
1200 void format_tz_name(
const T&) {
1201 out_ = std::copy_n(
utc(), 3, out_);
1204 void format_localized(
char format,
char modifier = 0) {
1209 tm_writer(
const std::locale& loc, OutputIt out,
const std::tm& tm,
1210 const Duration* subsecs =
nullptr)
1217 auto out() const -> OutputIt {
return out_; }
1227 format_localized(
'a');
1233 format_localized(
'A');
1237 format_localized(
'w',
'O');
1241 auto wday = tm_wday();
1242 write1(wday == 0 ? days_per_week : wday);
1244 format_localized(
'u',
'O');
1252 format_localized(
'b');
1258 format_localized(
'B');
1293 out_ =
copy<Char>(std::begin(buf), std::end(buf), out_);
1296 auto year = tm_year();
1309 out_ =
copy<Char>(std::begin(buf) + offset, std::end(buf), out_);
1317 return write_year(tm_year(), pad);
1318 format_localized(
'Y',
'E');
1322 return write2(split_year_lower(tm_year()));
1323 format_localized(
'y',
'O');
1326 if (is_classic_)
return write2(split_year_lower(tm_year()));
1327 format_localized(
'y',
'E');
1332 auto year = tm_year();
1333 auto upper =
year / 100;
1338 }
else if (upper >= 0 && upper < 100) {
1339 write2(
static_cast<int>(upper));
1344 format_localized(
'C',
'E');
1350 return write2(tm_mon() + 1, pad);
1351 format_localized(
'm',
'O');
1356 return write2((tm_yday() + days_per_week - tm_wday()) / days_per_week,
1358 format_localized(
'U',
'O');
1362 auto wday = tm_wday();
1363 write2((tm_yday() + days_per_week -
1364 (wday == 0 ? (days_per_week - 1) : (wday - 1))) /
1368 format_localized(
'W',
'O');
1373 return write2(tm_iso_week_of_year(), pad);
1374 format_localized(
'V',
'O');
1381 write2(split_year_lower(tm_iso_week_year()));
1385 auto yday = tm_yday() + 1;
1386 auto digit1 = yday / 100;
1391 write2(yday % 100, pad);
1396 return write2(tm_mday(), pad);
1397 format_localized(
'd',
'O');
1402 return write2(tm_hour(), pad);
1403 format_localized(
'H',
'O');
1407 return write2(tm_hour12(), pad);
1408 format_localized(
'I',
'O');
1412 return write2(tm_min(), pad);
1413 format_localized(
'M',
'O');
1418 write2(tm_sec(), pad);
1420 if (std::is_floating_point<typename Duration::rep>::value) {
1423 if (buf.size() > 1) {
1425 out_ =
copy<Char>(buf.begin() + 1, buf.end(), out_);
1433 format_localized(
'S',
'O');
1442 out_ =
copy<Char>(std::begin(buf), std::end(buf), out_);
1446 format_localized(
'r');
1462 *out_++ = tm_hour() < 12 ?
'A' :
'P';
1465 format_localized(
'p');
1479 template <
typename Char>
1492 FMT_THROW(format_error(
"precision not allowed for this argument type"));
1497template <
typename T,
1498 FMT_ENABLE_IF(std::is_integral<T>::value&& has_isfinite<T>::value)>
1503template <
typename T, FMT_ENABLE_IF(std::is_
integral<T>::value)>
1504inline auto mod(T x,
int y) -> T {
1505 return x %
static_cast<T
>(y);
1507template <
typename T, FMT_ENABLE_IF(std::is_
floating_po
int<T>::value)>
1508inline auto mod(T x,
int y) -> T {
1509 return std::fmod(x,
static_cast<T
>(y));
1514template <typename T, bool INTEGRAL = std::is_integral<T>::value>
1520 using type =
typename std::make_unsigned<T>::type;
1523template <
typename Rep,
typename Period,
1526 -> std::chrono::duration<Rep, std::milli> {
1528#if FMT_SAFE_DURATION_CAST
1529 using common_seconds_type =
1530 typename std::common_type<
decltype(d), std::chrono::seconds>::type;
1532 auto d_as_whole_seconds =
1535 auto diff = d_as_common - d_as_whole_seconds;
1544template <
typename Char,
typename Rep,
typename OutputIt,
1550template <
typename Char,
typename Rep,
typename OutputIt,
1560template <
typename Char,
typename OutputIt>
1562 return copy<Char>(unit.begin(), unit.end(), out);
1565template <
typename OutputIt>
1573template <
typename Char,
typename Period,
typename OutputIt>
1593 bool has_locale_ =
false;
1598 ::new (&
locale_) std::locale(loc.template get<std::locale>());
1601 if (has_locale_)
locale_.~locale();
1603 inline operator const std::locale&()
const {
1608template <
typename Char,
typename Rep,
typename Period>
1630 if (d.count() < 0) {
1650 std::copy_n(
"inf", 3, out);
1652 std::copy_n(
"-inf", 4, out);
1656 auto days() const -> Rep {
return static_cast<Rep
>(
s.count() / 86400); }
1658 return static_cast<Rep
>(
mod((
s.count() / 3600), 24));
1662 Rep
hour =
static_cast<Rep
>(
mod((
s.count() / 3600), 12));
1667 return static_cast<Rep
>(
mod((
s.count() / 60), 60));
1669 auto second() const -> Rep {
return static_cast<Rep
>(
mod(
s.count(), 60)); }
1672 auto time = std::tm();
1691 if (
width > num_digits) {
1699 template <
typename Callback,
typename... Args>
1708 void on_text(
const Char* begin,
const Char* end) {
1774 if (std::is_floating_point<rep>::value) {
1779 if (buf.size() < 2 || buf[1] ==
'.')
1781 out =
copy<Char>(buf.begin(), buf.end(), out);
1785 out, std::chrono::duration<rep, Period>(
val),
precision);
1834#if defined(__cpp_lib_chrono) && __cpp_lib_chrono >= 201907
1835using weekday = std::chrono::weekday;
1836using day = std::chrono::day;
1837using month = std::chrono::month;
1838using year = std::chrono::year;
1844 unsigned char value_;
1849 : value_(
static_cast<unsigned char>(wd != 7 ? wd : 0)) {}
1850 constexpr auto c_encoding() const noexcept ->
unsigned {
return value_; }
1855 unsigned char value_;
1859 constexpr explicit day(
unsigned d) noexcept
1860 : value_(
static_cast<unsigned char>(d)) {}
1861 constexpr explicit operator unsigned() const noexcept {
return value_; }
1866 unsigned char value_;
1870 constexpr explicit month(
unsigned m) noexcept
1871 : value_(
static_cast<unsigned char>(m)) {}
1872 constexpr explicit operator unsigned() const noexcept {
return value_; }
1881 constexpr explicit year(
int y) noexcept : value_(y) {}
1882 constexpr explicit operator int() const noexcept {
return value_; }
1894 : year_(y), month_(m), day_(d) {}
1895 constexpr auto year() const noexcept -> fmt::
year {
return year_; }
1896 constexpr auto month() const noexcept -> fmt::
month {
return month_; }
1897 constexpr auto day() const noexcept -> fmt::
day {
return day_; }
1901template <
typename Char>
1904 bool use_tm_formatter_ =
false;
1908 auto it = ctx.begin(), end = ctx.end();
1909 if (it != end && *it ==
'L') {
1911 this->set_localized();
1913 use_tm_formatter_ = it != end && *it !=
'}';
1917 template <
typename FormatContext>
1919 auto time = std::tm();
1920 time.tm_wday =
static_cast<int>(wd.c_encoding());
1924 w.on_abbr_weekday();
1929template <
typename Char>
1932 bool use_tm_formatter_ =
false;
1936 auto it = ctx.begin(), end = ctx.end();
1937 use_tm_formatter_ = it != end && *it !=
'}';
1941 template <
typename FormatContext>
1942 auto format(
day d, FormatContext& ctx)
const ->
decltype(ctx.out()) {
1943 auto time = std::tm();
1944 time.tm_mday =
static_cast<int>(
static_cast<unsigned>(d));
1953template <
typename Char>
1956 bool use_tm_formatter_ =
false;
1960 auto it = ctx.begin(), end = ctx.end();
1961 if (it != end && *it ==
'L') {
1963 this->set_localized();
1965 use_tm_formatter_ = it != end && *it !=
'}';
1969 template <
typename FormatContext>
1970 auto format(
month m, FormatContext& ctx)
const ->
decltype(ctx.out()) {
1971 auto time = std::tm();
1972 time.tm_mon =
static_cast<int>(
static_cast<unsigned>(m)) - 1;
1981template <
typename Char>
1984 bool use_tm_formatter_ =
false;
1988 auto it = ctx.begin(), end = ctx.end();
1989 use_tm_formatter_ = it != end && *it !=
'}';
1993 template <
typename FormatContext>
1994 auto format(
year y, FormatContext& ctx)
const ->
decltype(ctx.out()) {
1995 auto time = std::tm();
1996 time.tm_year =
static_cast<int>(y) - 1900;
2005template <
typename Char>
2008 bool use_tm_formatter_ =
false;
2012 auto it = ctx.begin(), end = ctx.end();
2013 use_tm_formatter_ = it != end && *it !=
'}';
2017 template <
typename FormatContext>
2019 ->
decltype(ctx.out()) {
2020 auto time = std::tm();
2021 time.tm_year =
static_cast<int>(val.year()) - 1900;
2022 time.tm_mon =
static_cast<int>(
static_cast<unsigned>(val.month())) - 1;
2023 time.tm_mday =
static_cast<int>(
static_cast<unsigned>(val.day()));
2032template <
typename Rep,
typename Period,
typename Char>
2042 auto it = ctx.begin(), end = ctx.end();
2043 if (it == end || *it ==
'}')
return it;
2046 if (it == end)
return it;
2049 if ((c >=
'0' && c <=
'9') || c ==
'{') {
2051 if (it == end)
return it;
2056 checker.has_precision_integral = !std::is_floating_point<Rep>::value;
2059 if (it != end && *it ==
'L') {
2068 template <
typename FormatContext>
2069 auto format(std::chrono::duration<Rep, Period> d, FormatContext& ctx)
const
2070 ->
decltype(ctx.out()) {
2071 auto specs = specs_;
2072 auto precision = specs.precision;
2073 specs.precision = -1;
2074 auto begin = fmt_.
begin(), end = fmt_.
end();
2082 precision_ref_, ctx);
2083 if (begin == end || *begin ==
'}') {
2089 f.precision = precision;
2111 auto it = ctx.begin(), end = ctx.end();
2112 if (it == end || *it ==
'}')
return it;
2115 if (it == end)
return it;
2118 if ((c >=
'0' && c <=
'9') || c ==
'{') {
2120 if (it == end)
return it;
2135 template <
typename Duration,
typename FormatContext>
2137 const Duration* subsecs)
const ->
decltype(ctx.out()) {
2138 auto specs = specs_;
2144 auto loc_ref = specs.localized() ? ctx.locale() :
locale_ref();
2147 loc, out, tm, subsecs);
2158 template <
typename FormatContext>
2159 auto format(
const std::tm& tm, FormatContext& ctx)
const
2160 ->
decltype(ctx.out()) {
2161 return do_format<std::chrono::seconds>(tm, ctx,
nullptr);
2166template <
typename Char,
typename Duration>
2169 return this->do_parse(ctx,
true);
2172 template <
typename FormatContext>
2174 ->
decltype(ctx.out()) {
2175 std::tm tm =
gmtime(val);
2176 using period =
typename Duration::period;
2178 period::num == 1 && period::den == 1 &&
2179 !std::is_floating_point<typename Duration::rep>::value)) {
2183 Duration epoch = val.time_since_epoch();
2186 if (subsecs.count() < 0) {
2188 if (tm.tm_sec != 0) {
2191 tm =
gmtime(val - second);
2200template <
typename Duration,
typename Char>
2203 template <
typename FormatContext>
2205 ->
decltype(ctx.out()) {
2211template <
typename Duration,
typename Char>
2215 return this->do_parse(ctx,
false);
2218 template <
typename FormatContext>
2220 ->
decltype(ctx.out()) {
2221 auto time_since_epoch = val.time_since_epoch();
2222 auto seconds_since_epoch =
2226 std::tm t =
gmtime(seconds_since_epoch.count());
2227 using period =
typename Duration::period;
2228 if (period::num == 1 && period::den == 1 &&
2229 !std::is_floating_point<typename Duration::rep>::value) {
and restrictions which apply to each piece of software is included later in this file and or inside of the individual applicable source files The disclaimer of warranty in the WPILib license above applies to all code in and nothing in any of the other licenses gives permission to use the names of FIRST nor the names of the WPILib contributors to endorse or promote products derived from this software The following pieces of software have additional or alternate and or glfw and nanopb were modified for use in Google Inc All rights reserved Redistribution and use in source and binary with or without are permitted provided that the following conditions are this list of conditions and the following disclaimer *Redistributions in binary form must reproduce the above copyright this list of conditions and the following disclaimer in the documentation and or other materials provided with the distribution *Neither the name of Google Inc nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY EXPRESS OR IMPLIED BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY OR CONSEQUENTIAL WHETHER IN STRICT OR EVEN IF ADVISED OF THE POSSIBILITY OF SUCH January AND DISTRIBUTION Definitions License shall mean the terms and conditions for and distribution as defined by Sections through of this document Licensor shall mean the copyright owner or entity authorized by the copyright owner that is granting the License Legal Entity shall mean the union of the acting entity and all other entities that control are controlled by or are under common control with that entity For the purposes of this definition control direct or to cause the direction or management of such whether by contract or including but not limited to software source documentation and configuration files Object form shall mean any form resulting from mechanical transformation or translation of a Source including but not limited to compiled object generated and conversions to other media types Work shall mean the work of whether in Source or Object made available under the as indicated by a copyright notice that is included in or attached to the whether in Source or Object that is based or other modifications as a an original work of authorship For the purposes of this Derivative Works shall not include works that remain separable from
Definition ThirdPartyNotices.txt:140
#define FMT_ASSERT(condition, message)
Definition base.h:391
#define FMT_END_EXPORT
Definition base.h:264
std::integral_constant< bool, B > bool_constant
Definition base.h:307
#define FMT_PRAGMA_CLANG(x)
Definition base.h:222
basic_string_view< char > string_view
Definition base.h:613
constexpr auto min_of(T a, T b) -> T
Definition base.h:344
#define FMT_CONSTEXPR
Definition base.h:113
#define FMT_BEGIN_NAMESPACE
Definition base.h:253
#define FMT_ENABLE_IF(...)
Definition base.h:341
#define FMT_BEGIN_EXPORT
Definition base.h:263
void void_t
Definition base.h:328
#define FMT_NORETURN
Definition base.h:193
typename std::conditional< B, T, F >::type conditional_t
Definition base.h:306
#define FMT_END_NAMESPACE
Definition base.h:256
A dynamically growing memory buffer for trivially copyable/constructible types with the first SIZE el...
Definition format.h:785
constexpr auto localized() const -> bool
Definition base.h:785
FMT_CONSTEXPR void set_localized()
Definition base.h:788
constexpr auto end() const noexcept -> iterator
Definition base.h:563
constexpr auto begin() const noexcept -> iterator
Definition base.h:562
constexpr day(unsigned d) noexcept
Definition chrono.h:1859
A contiguous memory buffer with an optional growing ability.
Definition base.h:1763
FMT_CONSTEXPR20 void append(const U *begin, const U *end)
Appends data to the end of the buffer.
Definition base.h:1845
FMT_CONSTEXPR void push_back(const T &value)
Definition base.h:1832
get_locale(bool localized, locale_ref loc)
Definition chrono.h:1596
std::locale locale_
Definition chrono.h:1591
~get_locale()
Definition chrono.h:1600
void on_offset_year()
Definition chrono.h:1325
void on_12_hour_time()
Definition chrono.h:1437
void on_dec0_week_of_year(numeric_system ns, pad_type pad)
Definition chrono.h:1354
void on_abbr_month()
Definition chrono.h:1248
void on_iso_date()
Definition chrono.h:1295
void on_iso_week_based_year()
Definition chrono.h:1377
void on_dec_month(numeric_system ns, pad_type pad)
Definition chrono.h:1348
void on_abbr_weekday()
Definition chrono.h:1223
void on_am_pm()
Definition chrono.h:1460
void on_dec0_weekday(numeric_system ns)
Definition chrono.h:1235
tm_writer(const std::locale &loc, OutputIt out, const std::tm &tm, const Duration *subsecs=nullptr)
Definition chrono.h:1209
void on_us_date()
Definition chrono.h:1288
void on_iso_time()
Definition chrono.h:1454
void on_duration_unit()
Definition chrono.h:1471
void on_24_hour_time()
Definition chrono.h:1449
void on_second(numeric_system ns, pad_type pad)
Definition chrono.h:1416
void on_full_weekday()
Definition chrono.h:1229
void on_12_hour(numeric_system ns, pad_type pad)
Definition chrono.h:1405
FMT_CONSTEXPR void on_text(const Char *begin, const Char *end)
Definition chrono.h:1219
void on_loc_time(numeric_system ns)
Definition chrono.h:1282
auto out() const -> OutputIt
Definition chrono.h:1217
void on_day_of_month(numeric_system ns, pad_type pad)
Definition chrono.h:1394
void on_tz_name()
Definition chrono.h:1313
void on_day_of_year(pad_type pad)
Definition chrono.h:1384
void on_short_year(numeric_system ns)
Definition chrono.h:1320
void on_iso_week_based_short_year()
Definition chrono.h:1380
void on_century(numeric_system ns)
Definition chrono.h:1330
void on_dec1_week_of_year(numeric_system ns, pad_type pad)
Definition chrono.h:1360
void on_minute(numeric_system ns, pad_type pad)
Definition chrono.h:1410
void on_dec1_weekday(numeric_system ns)
Definition chrono.h:1239
void on_year(numeric_system ns, pad_type pad)
Definition chrono.h:1315
void on_loc_date(numeric_system ns)
Definition chrono.h:1276
void on_full_month()
Definition chrono.h:1254
void on_utc_offset(numeric_system ns)
Definition chrono.h:1312
void on_duration_value()
Definition chrono.h:1470
void on_24_hour(numeric_system ns, pad_type pad)
Definition chrono.h:1400
void on_datetime(numeric_system ns)
Definition chrono.h:1261
void on_iso_week_of_year(numeric_system ns, pad_type pad)
Definition chrono.h:1371
auto size() const -> size_t
Definition format.h:1297
auto c_str() const -> const wchar_t *
Definition format.h:1298
constexpr month(unsigned m) noexcept
Definition chrono.h:1870
Parsing context consisting of a format string range being parsed and an argument counter for automati...
Definition base.h:850
constexpr auto c_encoding() const noexcept -> unsigned
Definition chrono.h:1850
constexpr weekday(unsigned wd) noexcept
Definition chrono.h:1848
constexpr auto year() const noexcept -> fmt::year
Definition chrono.h:1895
constexpr year_month_day(const year &y, const month &m, const day &d) noexcept
Definition chrono.h:1893
constexpr auto month() const noexcept -> fmt::month
Definition chrono.h:1896
constexpr auto day() const noexcept -> fmt::day
Definition chrono.h:1897
constexpr year(int y) noexcept
Definition chrono.h:1881
std::chrono::time_point< detail::utc_clock, Duration > utc_time
Definition chrono.h:263
FMT_BEGIN_EXPORT auto gmtime(std::time_t time) -> std::tm
Converts given time since epoch as std::time_t value into calendar time, expressed in Coordinated Uni...
Definition chrono.h:500
std::chrono::time_point< std::chrono::system_clock, Duration > sys_time
Definition chrono.h:260
std::chrono::time_point< detail::local_t, Duration > local_time
Definition chrono.h:266
Converts a string literal into a format string that will be parsed at compile time and converted into...
Definition printf.h:50
conditional_t< num_bits< T >()<=32 &&!FMT_REDUCE_INT_INSTANTIATIONS, uint32_t, conditional_t< num_bits< T >()<=64, uint64_t, uint128_t > > uint32_or_64_or_128_t
Definition format.h:1010
auto get_iterator(Buf &buf, OutputIt) -> decltype(buf.out())
Definition base.h:2126
FMT_CONSTEXPR20 auto isfinite(T value) -> bool
Definition format.h:2617
auto tm_mon_short_name(int mon) -> const char *
Definition chrono.h:896
void write_floating_seconds(memory_buffer &buf, Duration duration, int num_fractional_digits=-1)
Definition chrono.h:1020
FMT_CONSTEXPR auto parse_precision(const Char *begin, const Char *end, format_specs &specs, arg_ref< Char > &precision_ref, parse_context< Char > &ctx) -> const Char *
Definition base.h:1442
FMT_CONSTEXPR auto get_units() -> const char *
Definition chrono.h:577
auto is_big_endian() -> bool
Definition format.h:286
pad_type
Definition chrono.h:609
auto duration_cast(std::chrono::duration< FromRep, FromPeriod > from) -> To
Definition chrono.h:425
void write_fractional_seconds(OutputIt &out, Duration d, int precision=-1)
Definition chrono.h:969
auto utc() -> char *
Definition chrono.h:923
auto format_duration_unit(OutputIt out) -> OutputIt
Definition chrono.h:1574
constexpr auto max_value() -> T
Definition format.h:423
FMT_CONSTEXPR auto to_unsigned(Int value) -> make_unsigned_t< Int >
Definition base.h:432
numeric_system
Definition chrono.h:602
auto write_encoded_tm_str(OutputIt out, string_view in, const std::locale &loc) -> OutputIt
Definition chrono.h:338
void do_write(buffer< Char > &buf, const std::tm &time, const std::locale &loc, char format, char modifier)
Definition chrono.h:383
constexpr auto pow10(std::uint32_t n) -> long long
Definition chrono.h:945
auto tm_wday_short_name(int wday) -> const char *
Definition chrono.h:884
auto to_time_t(sys_time< Duration > time_point) -> std::time_t
Definition chrono.h:482
auto digits2(size_t value) -> const char *
Definition format.h:1024
auto get_classic_locale() -> const std::locale &
Definition chrono.h:311
FMT_CONSTEXPR auto fill_n(OutputIt out, Size count, const T &value) -> OutputIt
Definition format.h:553
auto mod(T x, int y) -> T
Definition chrono.h:1504
void write_digit2_separated(char *buf, unsigned a, unsigned b, unsigned c, char sep)
Definition chrono.h:545
FMT_ALWAYS_INLINE constexpr auto const_check(T val) -> T
Definition base.h:377
FMT_CONSTEXPR auto parse_width(const Char *begin, const Char *end, format_specs &specs, arg_ref< Char > &width_ref, parse_context< Char > &ctx) -> const Char *
Definition base.h:1433
FMT_NORETURN void throw_duration_error()
Definition chrono.h:417
auto get_milliseconds(std::chrono::duration< Rep, Period > d) -> std::chrono::duration< Rep, std::milli >
Definition chrono.h:1525
auto tm_mon_full_name(int mon) -> const char *
Definition chrono.h:890
FMT_CONSTEXPR20 auto copy(InputIt begin, InputIt end, OutputIt out) -> OutputIt
Definition base.h:2068
auto set_tm_zone(T &time, char *tz) -> bool
Definition chrono.h:914
auto gmtime_r(...) -> null<>
Definition chrono.h:275
FMT_CONSTEXPR auto parse_align(const Char *begin, const Char *end, format_specs &specs) -> const Char *
Definition format.h:2300
auto to_nonnegative_int(T value, Int upper) -> Int
Definition chrono.h:930
auto copy_unit(string_view unit, OutputIt out, Char) -> OutputIt
Definition chrono.h:1561
auto write_padding(OutputIt out, pad_type pad, int width) -> OutputIt
Definition chrono.h:619
FMT_CONSTEXPR void handle_dynamic_spec(arg_id_kind kind, int &value, const arg_ref< typename Context::char_type > &ref, Context &ctx)
Definition format.h:3700
auto format_duration_value(OutputIt out, Rep val, int) -> OutputIt
Definition chrono.h:1546
@ use_utf8
Definition base.h:452
FMT_CONSTEXPR FMT_INLINE auto write(basic_appender< Char > out, T value, const format_specs &specs, locale_ref loc) -> basic_appender< Char >
Definition format.h:2125
type
Definition base.h:975
auto write_tm_str(OutputIt out, string_view sv, const std::locale &loc) -> OutputIt
Definition chrono.h:368
auto get_buffer(OutputIt out) -> iterator_buffer< OutputIt, T >
Definition base.h:2116
auto gmtime_s(...) -> null<>
Definition chrono.h:276
FMT_CONSTEXPR20 FMT_INLINE void write2digits(Char *out, size_t value)
Definition format.h:1194
constexpr auto count() -> int
Definition base.h:1071
FMT_CONSTEXPR20 auto count_digits(uint64_t n) -> int
Definition format.h:1084
auto tm_wday_full_name(int wday) -> const char *
Definition chrono.h:878
FMT_CONSTEXPR auto parse_chrono_format(const Char *begin, const Char *end, Handler &&handler) -> const Char *
Definition chrono.h:632
FMT_CONSTEXPR FMT_INLINE auto format_decimal(Char *out, UInt value, int num_digits) -> Char *
Definition format.h:1229
void write_codecvt(codecvt_result< CodeUnit > &out, string_view in, const std::locale &loc)
Definition chrono.h:323
constexpr auto isnan(T value) -> bool
Definition format.h:2604
bool_constant<(std::is_integral< T >::value &&std::is_integral< U >::value)||(std::is_floating_point< T >::value && std::is_floating_point< U >::value)> is_similar_arithmetic_type
Definition chrono.h:412
Definition PointerIntPair.h:280
CodeUnit * end
Definition chrono.h:319
static constexpr size_t max_size
Definition chrono.h:317
CodeUnit buf[max_size]
Definition chrono.h:318
Definition format-inl.h:57
typename std::make_unsigned< T >::type type
Definition chrono.h:1520
T type
Definition chrono.h:1516
FMT_CONSTEXPR void on_dec0_weekday(numeric_system)
Definition chrono.h:788
FMT_CONSTEXPR void on_iso_week_of_year(numeric_system, pad_type)
Definition chrono.h:799
FMT_CONSTEXPR void on_iso_date()
Definition chrono.h:814
FMT_CONSTEXPR void on_loc_date(numeric_system)
Definition chrono.h:811
FMT_CONSTEXPR void on_day_of_year(pad_type)
Definition chrono.h:802
FMT_CONSTEXPR void on_duration_value()
Definition chrono.h:819
FMT_CONSTEXPR void on_dec1_weekday(numeric_system)
Definition chrono.h:789
FMT_CONSTEXPR void on_12_hour(numeric_system)
Definition chrono.h:807
FMT_CONSTEXPR void on_duration_unit()
Definition chrono.h:820
FMT_CONSTEXPR void on_24_hour_time()
Definition chrono.h:816
FMT_CONSTEXPR void on_century(numeric_system)
Definition chrono.h:783
FMT_CONSTEXPR void on_minute(numeric_system)
Definition chrono.h:808
FMT_CONSTEXPR void on_utc_offset(numeric_system)
Definition chrono.h:821
FMT_CONSTEXPR void on_day_of_month(numeric_system, pad_type)
Definition chrono.h:803
FMT_CONSTEXPR void on_dec_month(numeric_system, pad_type)
Definition chrono.h:792
FMT_CONSTEXPR void on_iso_time()
Definition chrono.h:817
FMT_CONSTEXPR void on_datetime(numeric_system)
Definition chrono.h:810
FMT_CONSTEXPR void on_offset_year()
Definition chrono.h:782
FMT_CONSTEXPR void on_abbr_month()
Definition chrono.h:790
FMT_CONSTEXPR void on_second(numeric_system)
Definition chrono.h:809
FMT_CONSTEXPR void on_full_weekday()
Definition chrono.h:787
FMT_CONSTEXPR void on_iso_week_based_short_year()
Definition chrono.h:785
FMT_CONSTEXPR void on_us_date()
Definition chrono.h:813
FMT_CONSTEXPR void on_year(numeric_system, pad_type)
Definition chrono.h:780
FMT_CONSTEXPR void on_short_year(numeric_system)
Definition chrono.h:781
FMT_CONSTEXPR void on_tz_name()
Definition chrono.h:822
FMT_CONSTEXPR void on_dec1_week_of_year(numeric_system, pad_type)
Definition chrono.h:796
FMT_CONSTEXPR void on_12_hour_time()
Definition chrono.h:815
FMT_CONSTEXPR void on_full_month()
Definition chrono.h:791
FMT_CONSTEXPR void unsupported()
Definition chrono.h:777
FMT_CONSTEXPR void on_dec0_week_of_year(numeric_system, pad_type)
Definition chrono.h:793
FMT_CONSTEXPR void on_loc_time(numeric_system)
Definition chrono.h:812
FMT_CONSTEXPR void on_am_pm()
Definition chrono.h:818
FMT_CONSTEXPR void on_abbr_weekday()
Definition chrono.h:786
FMT_CONSTEXPR void on_iso_week_based_year()
Definition chrono.h:784
FMT_CONSTEXPR void on_24_hour(numeric_system)
Definition chrono.h:806