9#include "../microfmt.hpp"
25 static constexpr microfmt::string_view
value =
" [custom]";
29 static constexpr microfmt::string_view
value =
"ns";
32 static constexpr microfmt::string_view
value =
"us";
35 static constexpr microfmt::string_view
value =
"ms";
38 static constexpr microfmt::string_view
value =
"s";
41 static constexpr microfmt::string_view
value =
"min";
44 static constexpr microfmt::string_view
value =
"h";
47 static constexpr microfmt::string_view
value =
"d";
59RELOCO_BEGIN_UNSAFE_CODE
62 const int32_t era = (z >= 0 ? z : z - 146096) / 146097;
63 const uint32_t doe =
static_cast<uint32_t
>(z - era * 146097);
64 const uint32_t yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365;
65 const int32_t y =
static_cast<int32_t
>(yoe) + era * 400;
66 const uint32_t doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
67 const uint32_t mp = (5 * doy + 2) / 153;
68 const uint8_t d =
static_cast<uint8_t
>(doy - (153 * mp + 2) / 5 + 1);
69 const uint8_t m =
static_cast<uint8_t
>(mp < 10 ? mp + 3 : mp - 9);
70 return {y + (m <= 2 ? 1 : 0), m, d};
80template <
typename Rep,
typename Period>
struct formatter<std::chrono::duration<Rep, Period>> {
81 bool hide_suffix{
false};
84 for (
char c : ctx.spec()) {
85 if (c ==
'c' || c ==
'C') {
91 void format(
const std::chrono::duration<Rep, Period> &d,
const sink &out)
const noexcept {
92 const auto count = d.count();
93 if constexpr (std::is_signed_v<Rep>) {
96 detail::format_unsigned<detail::radix::decimal>(out,
static_cast<uint64_t
>(-count),
false, 0);
98 detail::format_unsigned<detail::radix::decimal>(out,
static_cast<uint64_t
>(count),
false, 0);
101 detail::format_unsigned<detail::radix::decimal>(out,
static_cast<uint64_t
>(count),
false, 0);
114template <
typename Duration>
struct formatter<std::chrono::time_point<std::chrono::system_clock, Duration>> {
115 bool time_only{
false};
116 bool date_only{
false};
119 for (
char c : ctx.spec()) {
120 if (c ==
'T' || c ==
't')
122 if (c ==
'D' || c ==
'd')
128 RELOCO_BEGIN_UNSAFE_CODE
129 void format(
const std::chrono::time_point<std::chrono::system_clock, Duration> &tp,
const sink &out)
const noexcept {
130 using namespace std::chrono;
131 const auto dur = tp.time_since_epoch();
132 const auto total_secs = duration_cast<seconds>(dur).count();
133 const auto sub_ms = duration_cast<milliseconds>(dur).count() % 1000;
135 const int32_t days =
static_cast<int32_t
>(total_secs / 86400);
136 int32_t rem_secs =
static_cast<int32_t
>(total_secs % 86400);
140 const uint32_t hours =
static_cast<uint32_t
>(rem_secs / 3600);
141 const uint32_t mins =
static_cast<uint32_t
>((rem_secs % 3600) / 60);
142 const uint32_t secs =
static_cast<uint32_t
>(rem_secs % 60);
146 detail::format_unsigned<detail::radix::decimal>(out,
static_cast<uint32_t
>(date.year),
false, 4);
148 detail::format_unsigned<detail::radix::decimal>(out, date.month,
false, 2);
150 detail::format_unsigned<detail::radix::decimal>(out, date.day,
false, 2);
153 if (!date_only && !time_only) {
158 detail::format_unsigned<detail::radix::decimal>(out, hours,
false, 2);
160 detail::format_unsigned<detail::radix::decimal>(out, mins,
false, 2);
162 detail::format_unsigned<detail::radix::decimal>(out, secs,
false, 2);
164 detail::format_unsigned<detail::radix::decimal>(out,
static_cast<uint32_t
>(sub_ms < 0 ? -sub_ms : sub_ms),
false,
176template <
typename Duration>
struct formatter<std::chrono::time_point<std::chrono::steady_clock, Duration>> {
179 void format(
const std::chrono::time_point<std::chrono::steady_clock, Duration> &tp,
const sink &out)
const noexcept {
180 using namespace std::chrono;
181 const auto dur = tp.time_since_epoch();
182 const auto total_secs = duration_cast<seconds>(dur).count();
183 const auto ms = duration_cast<milliseconds>(dur).count() % 1000;
185 const uint32_t hours =
static_cast<uint32_t
>(total_secs / 3600);
186 const uint32_t mins =
static_cast<uint32_t
>((total_secs % 3600) / 60);
187 const uint32_t secs =
static_cast<uint32_t
>(total_secs % 60);
190 detail::format_unsigned<detail::radix::decimal>(out, hours,
false, 2);
192 detail::format_unsigned<detail::radix::decimal>(out, mins,
false, 2);
194 detail::format_unsigned<detail::radix::decimal>(out, secs,
false, 2);
196 detail::format_unsigned<detail::radix::decimal>(out,
static_cast<uint32_t
>(
ms),
false, 3);
Definition microfmt.hpp:881
#define MICROFMT_API_CLASS
Definition compat.hpp:181
RELOCO_BEGIN_UNSAFE_CODE constexpr civil_date civil_from_days(int32_t z) noexcept
Definition chrono.hpp:60
constexpr auto micro(IntType raw_val) noexcept
Definition fixed_point.hpp:64
reloco::sink sink
Type-erased, zero-allocation output sink.
Definition microfmt.hpp:46
RELOCO_END_UNSAFE_CODE
Definition remote_object.hpp:132
constexpr auto milli(IntType raw_val) noexcept
Definition fixed_point.hpp:56
static constexpr microfmt::string_view value
Definition chrono.hpp:25