10#include "../microfmt.hpp"
28struct is_bintime_struct<T, std::void_t<decltype(std::declval<T>().sec), decltype(std::declval<T>().frac)>>
72 uint64_t multiplier = 1'000'000'000;
78 multiplier = 1'000'000;
81 multiplier = 1'000'000'000;
84 multiplier = 1'000'000'000'000ULL;
91 constexpr uint64_t half_mask = 0xFFFFFFFFULL;
92 const uint64_t frac_low = frac & half_mask;
93 const uint64_t frac_high = frac >> 32;
94 const uint64_t multiplier_low = multiplier & half_mask;
95 const uint64_t multiplier_high = multiplier >> 32;
97 const uint64_t low_product = frac_low * multiplier_low;
98 const uint64_t middle = frac_high * multiplier_low + (low_product >> 32);
99 const uint64_t middle_low = middle & half_mask;
100 const uint64_t middle_high = middle >> 32;
101 const uint64_t cross = middle_low + frac_low * multiplier_high;
103 return frac_high * multiplier_high + middle_high + (cross >> 32);
114 uint64_t multiplier = 1'000'000'000;
120 multiplier = 1'000'000;
123 multiplier = 1'000'000'000;
128 multiplier = 1'000'000'000;
131 return static_cast<uint32_t
>((
static_cast<uint64_t
>(frac32) * multiplier) >> 32);
148template <
typename T>
struct formatter<T, std::enable_if_t<is_bintime_v<T>>> {
156 bool show_unit{
true};
163 auto spec = ctx.spec();
164 for (
char c : spec) {
165 if (c ==
'm' || c ==
'3')
167 else if (c ==
'u' || c ==
'6')
169 else if (c ==
'n' || c ==
'9')
171 else if (c ==
'p' || c ==
'1')
173 else if (c ==
'r' || c ==
'R')
184 RELOCO_BEGIN_UNSAFE_CODE
186 int64_t
sec =
static_cast<int64_t
>(bt.sec);
187 uint64_t frac =
static_cast<uint64_t
>(bt.frac);
191 detail::format_unsigned<detail::radix::decimal>(out,
static_cast<uint64_t
>(-
sec),
false, 0);
193 detail::format_unsigned<detail::radix::decimal>(out,
static_cast<uint64_t
>(
sec),
false, 0);
199 detail::format_unsigned<detail::radix::decimal>(out, dec_frac,
false,
static_cast<int>(precision));
232template <
typename T,
typename = std::enable_if_t<std::is_
integral_v<T>>>
253 bool show_unit{
true};
260 auto spec = ctx.spec();
261 for (
char c : spec) {
262 if (c ==
'm' || c ==
'3')
264 else if (c ==
'u' || c ==
'6')
266 else if (c ==
'n' || c ==
'9')
268 else if (c ==
'r' || c ==
'R')
279 const int64_t val = sv.sbt;
280 uint64_t magnitude = 0;
283 magnitude =
static_cast<uint64_t
>(-(val + 1)) + 1;
285 magnitude =
static_cast<uint64_t
>(val);
288 const uint64_t
sec = magnitude >> 32;
289 const uint32_t frac =
static_cast<uint32_t
>(magnitude & UINT64_C(0xFFFFFFFF));
291 detail::format_unsigned<detail::radix::decimal>(out,
sec,
false, 0);
296 detail::format_unsigned<detail::radix::decimal>(out, dec_frac,
false,
static_cast<int>(precision));
Definition microfmt.hpp:881
uint64_t bintime_frac_to_decimal(uint64_t frac, time_precision prec) noexcept
Converts a bintime fractional part into decimal-scaling digits.
Definition bintime.hpp:71
uint32_t sbintime_frac_to_decimal(uint32_t frac32, time_precision prec) noexcept
Converts an sbintime_t fractional part into decimal-scaling digits.
Definition bintime.hpp:113
constexpr auto as_sbintime(T val) noexcept
Wraps an integral sbintime_t value in an sbintime_view.
Definition bintime.hpp:233
reloco::sink sink
Type-erased, zero-allocation output sink.
Definition microfmt.hpp:46
time_precision
Fractional-second precision selectors for time formatting.
Definition bintime.hpp:56
RELOCO_END_UNSAFE_CODE
Definition remote_object.hpp:132
constexpr bool is_bintime_v
Convenience variable template for is_bintime.
Definition bintime.hpp:48
Definition bintime.hpp:25
Customization point trait detecting FreeBSD-style binary time types.
Definition bintime.hpp:41
Non-owning view disambiguating an sbintime_t value from a plain int64_t.
Definition bintime.hpp:219
int64_t sbt
Raw 64-bit sbintime_t value (signed fixed-point, 32.32).
Definition bintime.hpp:223