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 {
306 buffer_.append(s, s +
count);
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);
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 =
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) {
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;
1597 if (!localized)
return;
1606 if (has_locale_)
locale_.~locale();
1608 inline operator const std::locale&()
const {
1613template <
typename Char,
typename Rep,
typename Period>
1635 if (d.count() < 0) {
1655 std::copy_n(
"inf", 3,
out);
1657 std::copy_n(
"-inf", 4,
out);
1661 auto days() const -> Rep {
return static_cast<Rep
>(
s.count() / 86400); }
1663 return static_cast<Rep
>(
mod((
s.count() / 3600), 24));
1667 Rep
hour =
static_cast<Rep
>(
mod((
s.count() / 3600), 12));
1672 return static_cast<Rep
>(
mod((
s.count() / 60), 60));
1674 auto second() const -> Rep {
return static_cast<Rep
>(
mod(
s.count(), 60)); }
1677 auto time = std::tm();
1696 if (
width > num_digits) {
1704 template <
typename Callback,
typename... Args>
1713 void on_text(
const Char* begin,
const Char* end) {
1779 if (std::is_floating_point<rep>::value) {
1784 if (buf.size() < 2 || buf[1] ==
'.')
1839#if defined(__cpp_lib_chrono) && __cpp_lib_chrono >= 201907
1840using weekday = std::chrono::weekday;
1841using day = std::chrono::day;
1842using month = std::chrono::month;
1843using year = std::chrono::year;
1849 unsigned char value_;
1854 : value_(
static_cast<unsigned char>(wd != 7 ? wd : 0)) {}
1855 constexpr auto c_encoding() const noexcept ->
unsigned {
return value_; }
1860 unsigned char value_;
1864 constexpr explicit day(
unsigned d) noexcept
1865 : value_(
static_cast<unsigned char>(d)) {}
1866 constexpr explicit operator unsigned() const noexcept {
return value_; }
1871 unsigned char value_;
1875 constexpr explicit month(
unsigned m) noexcept
1876 : value_(
static_cast<unsigned char>(m)) {}
1877 constexpr explicit operator unsigned() const noexcept {
return value_; }
1886 constexpr explicit year(
int y) noexcept : value_(y) {}
1887 constexpr explicit operator int() const noexcept {
return value_; }
1899 : year_(y), month_(m), day_(d) {}
1900 constexpr auto year() const noexcept -> fmt::
year {
return year_; }
1901 constexpr auto month() const noexcept -> fmt::
month {
return month_; }
1902 constexpr auto day() const noexcept -> fmt::
day {
return day_; }
1906template <
typename Char>
1909 bool use_tm_formatter_ =
false;
1913 auto it = ctx.begin(), end = ctx.end();
1914 if (it != end && *it ==
'L') {
1918 use_tm_formatter_ = it != end && *it !=
'}';
1922 template <
typename FormatContext>
1924 auto time = std::tm();
1925 time.tm_wday =
static_cast<int>(wd.c_encoding());
1929 w.on_abbr_weekday();
1934template <
typename Char>
1937 bool use_tm_formatter_ =
false;
1941 auto it = ctx.begin(), end = ctx.end();
1942 use_tm_formatter_ = it != end && *it !=
'}';
1946 template <
typename FormatContext>
1947 auto format(
day d, FormatContext& ctx)
const ->
decltype(ctx.out()) {
1948 auto time = std::tm();
1949 time.tm_mday =
static_cast<int>(
static_cast<unsigned>(d));
1958template <
typename Char>
1961 bool use_tm_formatter_ =
false;
1965 auto it = ctx.begin(), end = ctx.end();
1966 if (it != end && *it ==
'L') {
1970 use_tm_formatter_ = it != end && *it !=
'}';
1974 template <
typename FormatContext>
1975 auto format(
month m, FormatContext& ctx)
const ->
decltype(ctx.out()) {
1976 auto time = std::tm();
1977 time.tm_mon =
static_cast<int>(
static_cast<unsigned>(m)) - 1;
1986template <
typename Char>
1989 bool use_tm_formatter_ =
false;
1993 auto it = ctx.begin(), end = ctx.end();
1994 use_tm_formatter_ = it != end && *it !=
'}';
1998 template <
typename FormatContext>
1999 auto format(
year y, FormatContext& ctx)
const ->
decltype(ctx.out()) {
2000 auto time = std::tm();
2001 time.tm_year =
static_cast<int>(y) - 1900;
2010template <
typename Char>
2013 bool use_tm_formatter_ =
false;
2017 auto it = ctx.begin(), end = ctx.end();
2018 use_tm_formatter_ = it != end && *it !=
'}';
2022 template <
typename FormatContext>
2024 ->
decltype(ctx.out()) {
2025 auto time = std::tm();
2026 time.tm_year =
static_cast<int>(val.year()) - 1900;
2027 time.tm_mon =
static_cast<int>(
static_cast<unsigned>(val.month())) - 1;
2028 time.tm_mday =
static_cast<int>(
static_cast<unsigned>(val.day()));
2037template <
typename Rep,
typename Period,
typename Char>
2047 auto it = ctx.begin(), end = ctx.end();
2048 if (it == end || *it ==
'}')
return it;
2051 if (it == end)
return it;
2054 if ((c >=
'0' && c <=
'9') || c ==
'{') {
2056 if (it == end)
return it;
2061 checker.has_precision_integral = !std::is_floating_point<Rep>::value;
2064 if (it != end && *it ==
'L') {
2065 specs_.set_localized();
2073 template <
typename FormatContext>
2074 auto format(std::chrono::duration<Rep, Period> d, FormatContext& ctx)
const
2075 ->
decltype(ctx.out()) {
2076 auto specs = specs_;
2077 auto precision = specs.precision;
2078 specs.precision = -1;
2079 auto begin = fmt_.begin(), end = fmt_.end();
2087 precision_ref_, ctx);
2088 if (begin == end || *begin ==
'}') {
2094 f.precision = precision;
2095 f.localized = specs_.localized();
2111 auto localized() const ->
bool {
return specs_.localized(); }
2116 auto it = ctx.begin(), end = ctx.end();
2117 if (it == end || *it ==
'}')
return it;
2120 if (it == end)
return it;
2123 if ((c >=
'0' && c <=
'9') || c ==
'{') {
2125 if (it == end)
return it;
2129 specs_.set_localized();
2140 template <
typename Duration,
typename FormatContext>
2142 const Duration* subsecs)
const ->
decltype(ctx.out()) {
2143 auto specs = specs_;
2149 auto loc_ref = specs.localized() ? ctx.locale() :
locale_ref();
2152 loc, out, tm, subsecs);
2163 template <
typename FormatContext>
2164 auto format(
const std::tm& tm, FormatContext& ctx)
const
2165 ->
decltype(ctx.out()) {
2171template <
typename Char,
typename Duration>
2177 template <
typename FormatContext>
2179 ->
decltype(ctx.out()) {
2180 std::tm tm =
gmtime(val);
2181 using period =
typename Duration::period;
2183 period::num == 1 && period::den == 1 &&
2184 !std::is_floating_point<typename Duration::rep>::value)) {
2188 Duration epoch = val.time_since_epoch();
2191 if (subsecs.count() < 0) {
2193 if (tm.tm_sec != 0) {
2196 tm =
gmtime(val - second);
2205template <
typename Duration,
typename Char>
2208 template <
typename FormatContext>
2210 ->
decltype(ctx.out()) {
2216template <
typename Duration,
typename Char>
2223 template <
typename FormatContext>
2225 ->
decltype(ctx.out()) {
2226 auto time_since_epoch = val.time_since_epoch();
2227 auto seconds_since_epoch =
2231 std::tm t =
gmtime(seconds_since_epoch.count());
2232 using period =
typename Duration::period;
2233 if (period::num == 1 && period::den == 1 &&
2234 !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
constexpr T & get(wpi::util::array< T, N > &arr) noexcept
Definition array.hpp:66
#define FMT_ASSERT(condition, message)
Definition base.h:394
#define FMT_END_EXPORT
Definition base.h:267
std::integral_constant< bool, B > bool_constant
Definition base.h:310
#define FMT_PRAGMA_CLANG(x)
Definition base.h:224
basic_string_view< char > string_view
Definition base.h:620
constexpr auto min_of(T a, T b) -> T
Definition base.h:347
#define FMT_USE_LOCALE
Definition base.h:915
#define FMT_CONSTEXPR
Definition base.h:113
#define FMT_BEGIN_NAMESPACE
Definition base.h:256
#define FMT_ENABLE_IF(...)
Definition base.h:344
#define FMT_BEGIN_EXPORT
Definition base.h:266
void void_t
Definition base.h:331
#define FMT_NORETURN
Definition base.h:195
typename std::conditional< B, T, F >::type conditional_t
Definition base.h:309
@ general
Definition base.h:684
@ fixed
Definition base.h:683
#define FMT_END_NAMESPACE
Definition base.h:259
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
A dynamically growing memory buffer for trivially copyable/constructible types with the first SIZE el...
Definition format.h:797
An implementation of std::basic_string_view for pre-C++17.
Definition base.h:522
constexpr day(unsigned d) noexcept
Definition chrono.h:1864
A contiguous memory buffer with an optional growing ability.
Definition base.h:1773
get_locale(bool localized, locale_ref loc)
Definition chrono.h:1596
std::locale locale_
Definition chrono.h:1591
~get_locale()
Definition chrono.h:1605
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 -> iterator
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:1309
auto c_str() const -> const wchar_t *
Definition format.h:1310
constexpr month(unsigned m) noexcept
Definition chrono.h:1875
Parsing context consisting of a format string range being parsed and an argument counter for automati...
Definition base.h:857
constexpr auto c_encoding() const noexcept -> unsigned
Definition chrono.h:1855
constexpr weekday(unsigned wd) noexcept
Definition chrono.h:1853
constexpr auto year() const noexcept -> fmt::year
Definition chrono.h:1900
constexpr year_month_day(const year &y, const month &m, const day &d) noexcept
Definition chrono.h:1898
constexpr auto month() const noexcept -> fmt::month
Definition chrono.h:1901
constexpr auto day() const noexcept -> fmt::day
Definition chrono.h:1902
constexpr year(int y) noexcept
Definition chrono.h:1886
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:1022
auto get_iterator(Buf &buf, OutputIt) -> decltype(buf.out())
Definition base.h:2141
FMT_CONSTEXPR20 auto isfinite(T value) -> bool
Definition format.h:2629
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 void ignore_unused(const T &...)
Definition base.h:361
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:1452
FMT_CONSTEXPR auto get_units() -> const char *
Definition chrono.h:577
auto is_big_endian() -> bool
Definition format.h:290
pad_type
Definition chrono.h:609
@ none
Definition chrono.h:613
@ zero
Definition chrono.h:611
@ space
Definition chrono.h:615
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:427
FMT_CONSTEXPR auto to_unsigned(Int value) -> make_unsigned_t< Int >
Definition base.h:439
numeric_system
Definition chrono.h:602
@ alternative
Definition chrono.h:605
@ standard
Definition chrono.h:603
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 in(type t, int set) -> bool
Definition base.h:1040
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:1036
@ use_utf8
Definition base.h:459
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:557
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:380
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:1443
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:2083
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:2312
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:3712
auto format_duration_value(OutputIt out, Rep val, int) -> OutputIt
Definition chrono.h:1546
@ precision
Definition base.h:1467
@ width
Definition base.h:1467
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:2137
type
Definition base.h:985
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:2131
auto gmtime_s(...) -> null<>
Definition chrono.h:276
FMT_CONSTEXPR20 FMT_INLINE void write2digits(Char *out, size_t value)
Definition format.h:1206
constexpr auto count() -> int
Definition base.h:1081
FMT_CONSTEXPR20 auto count_digits(uint64_t n) -> int
Definition format.h:1096
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:1241
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:2616
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 StringMap.hpp:773
CodeUnit * end
Definition chrono.h:319
static constexpr size_t max_size
Definition chrono.h:317
CodeUnit buf[max_size]
Definition chrono.h:318
static constexpr int value
Definition chrono.h:963
static constexpr int value
Definition chrono.h:955
Definition format-inl.h:52
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