From d6b249677b9edf993786be70442b01473c43fc5c Mon Sep 17 00:00:00 2001 From: Patrick Roocks Date: Wed, 12 Oct 2022 20:56:48 +0200 Subject: [PATCH] Review fixes 3 --- include/fmt/chrono.h | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/include/fmt/chrono.h b/include/fmt/chrono.h index beb8e580..abfb900e 100644 --- a/include/fmt/chrono.h +++ b/include/fmt/chrono.h @@ -982,7 +982,7 @@ inline Int to_nonnegative_int(T value, Int upper) { return static_cast(value); } -template ::is_signed)> constexpr std::chrono::duration abs( std::chrono::duration d) { @@ -995,7 +995,7 @@ constexpr std::chrono::duration abs( return d.count() >= d.zero().count() ? d : -d; } -template ::is_signed)> constexpr std::chrono::duration abs( std::chrono::duration d) { @@ -1025,7 +1025,7 @@ struct count_fractional_digits { // Format subseconds which are given as an integer type with an appropriate // number of digits. -template +template void write_fractional_seconds(OutputIt& out, Duration d) { FMT_ASSERT(!std::is_floating_point::value, ""); constexpr auto num_fractional_digits = @@ -1052,26 +1052,33 @@ void write_fractional_seconds(OutputIt& out, Duration d) { int num_digits = detail::count_digits(n); if (num_fractional_digits > num_digits) out = std::fill_n(out, num_fractional_digits - num_digits, '0'); - out = format_decimal(out, n, num_digits).end; + out = format_decimal(out, n, num_digits).end; } } // Format subseconds which are given as a floating point type with an appropiate // number of digits. We cannot pass the Duration here, as we explicitly need to // pass the Rep value in the chrono_formatter. -template -void format_floating_seconds(memory_buffer& buf, Rep val) { - FMT_ASSERT(std::is_floating_point::value, ""); - auto num_fractional_digits = count_fractional_digits::value; +template +void write_floating_seconds(memory_buffer& buf, Duration duration) { + FMT_ASSERT(std::is_floating_point::value, ""); + auto num_fractional_digits = + count_fractional_digits::value; // For non-integer values, we ensure at least 6 digits to get microsecond // precision. - if (num_fractional_digits < 6 && static_cast(std::round(val)) != val) + auto val = duration.count(); + if (num_fractional_digits < 6 && + static_cast(std::round(val)) != val) num_fractional_digits = 6; - format_to(std::back_inserter(buf), runtime("{:.{}f}"), - std::fmod(val * static_cast(Num) / static_cast(Den), - static_cast(60)), - num_fractional_digits); + format_to( + std::back_inserter(buf), runtime("{:.{}f}"), + std::fmod(val * + static_cast(Duration::period::num) / + static_cast(Duration::period::den), + static_cast(60)), + num_fractional_digits); } template ::value) { auto buf = memory_buffer(); - format_floating_seconds(buf, - subsecs_->count()); + write_floating_seconds(buf, *subsecs_); if (buf.size() > 1) { // Remove the leading "0", write something like ".123". out_ = std::copy(buf.begin() + 1, buf.end(), out_); @@ -1826,7 +1831,7 @@ struct chrono_formatter { if (ns == numeric_system::standard) { if (std::is_floating_point::value) { auto buf = memory_buffer(); - format_floating_seconds(buf, val); + write_floating_seconds(buf, std::chrono::duration(val)); if (negative) *out++ = '-'; if (buf.size() < 2 || buf[1] == '.') *out++ = '0'; out = std::copy(buf.begin(), buf.end(), out);