9#include "../microfmt.hpp"
10#include <boost/chrono.hpp>
11#include <boost/date_time/gregorian/gregorian_types.hpp>
12#include <boost/date_time/posix_time/posix_time_types.hpp>
19 if constexpr (Period::num == 1 && Period::den == 1000000000) {
21 }
else if constexpr (Period::num == 1 && Period::den == 1000000) {
23 }
else if constexpr (Period::num == 1 && Period::den == 1000) {
25 }
else if constexpr (Period::num == 1 && Period::den == 1) {
27 }
else if constexpr (Period::num == 60 && Period::den == 1) {
29 }
else if constexpr (Period::num == 3600 && Period::den == 1) {
37 if (date.is_not_a_date()) {
38 out.write(
"not-a-date");
41 if (date.is_pos_infinity()) {
42 out.write(
"+infinity");
45 if (date.is_neg_infinity()) {
46 out.write(
"-infinity");
49 detail::format_unsigned<detail::radix::decimal>(out,
static_cast<uint64_t
>(date.year()),
false, 4);
51 detail::format_unsigned<detail::radix::decimal>(out,
static_cast<uint64_t
>(date.month()),
false, 2);
53 detail::format_unsigned<detail::radix::decimal>(out,
static_cast<uint64_t
>(date.day()),
false, 2);
57 if (duration.is_special()) {
58 if (duration.is_not_a_date_time()) {
59 out.write(
"not-a-date-time");
60 }
else if (duration.is_pos_infinity()) {
61 out.write(
"+infinity");
63 out.write(
"-infinity");
68 if (duration.is_negative()) {
71 detail::format_unsigned<detail::radix::decimal>(
72 out,
static_cast<uint64_t
>(duration.hours() < 0 ? -duration.hours() : duration.hours()),
false, 2);
74 detail::format_unsigned<detail::radix::decimal>(
75 out,
static_cast<uint64_t
>(duration.minutes() < 0 ? -duration.minutes() : duration.minutes()),
false, 2);
77 detail::format_unsigned<detail::radix::decimal>(
78 out,
static_cast<uint64_t
>(duration.seconds() < 0 ? -duration.seconds() : duration.seconds()),
false, 2);
79 const auto fractional = duration.fractional_seconds();
80 if (fractional != 0) {
82 detail::format_unsigned<detail::radix::decimal>(
83 out,
static_cast<uint64_t
>(fractional < 0 ? -fractional : fractional),
false,
84 static_cast<unsigned>(boost::posix_time::time_duration::num_fractional_digits()));
90template <
typename Rep,
typename Period>
struct formatter<boost::chrono::duration<Rep, Period>> {
91 bool hide_suffix{
false};
94 for (
const char character : ctx.spec()) {
95 if (character ==
'c' || character ==
'C') {
101 void format(
const boost::chrono::duration<Rep, Period> &duration,
const sink &out)
const noexcept {
104 count_formatter.parse(count_context);
105 count_formatter.format(duration.count(), out);
107 out.write(detail::boost_duration_suffix<Period>());
112template <
typename Clock,
typename Duration>
struct formatter<boost::chrono::time_point<Clock, Duration>> {
117 void format(
const boost::chrono::time_point<Clock, Duration> &time_point,
const sink &out)
const noexcept {
118 duration_formatter.format(time_point.time_since_epoch(), out);
119 out.write(
" since epoch");
126 void format(
const boost::gregorian::date &date,
const sink &out)
const noexcept {
131template <>
struct formatter<boost::posix_time::time_duration> {
134 void format(
const boost::posix_time::time_duration &duration,
const sink &out)
const noexcept {
142 void format(
const boost::posix_time::ptime &time,
const sink &out)
const noexcept {
143 if (time.is_not_a_date_time()) {
144 out.write(
"not-a-date-time");
147 if (time.is_pos_infinity()) {
148 out.write(
"+infinity");
151 if (time.is_neg_infinity()) {
152 out.write(
"-infinity");
Definition microfmt.hpp:881
void format_boost_date(const boost::gregorian::date &date, const sink &out) noexcept
Definition boost_time.hpp:36
constexpr microfmt::string_view boost_duration_suffix() noexcept
Definition boost_time.hpp:18
void format_boost_time_duration(const boost::posix_time::time_duration &duration, const sink &out) noexcept
Definition boost_time.hpp:56
reloco::sink sink
Type-erased, zero-allocation output sink.
Definition microfmt.hpp:46