From 21470714d6ad08252d7fa11994e4783d2ae98330 Mon Sep 17 00:00:00 2001 From: zeffy Date: Thu, 23 Jan 2020 04:43:03 -0800 Subject: [PATCH] =?UTF-8?q?Fix=20incorrect=20wide=20encoding=20of=20'?= =?UTF-8?q?=C2=B5s'=20I=20think=20might=20be=20a=20source=20file=20encodin?= =?UTF-8?q?g=20issue,=20so=20I=20used=20\u00B5=20instead.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/fmt/chrono.h | 100 ++++++++++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 39 deletions(-) diff --git a/include/fmt/chrono.h b/include/fmt/chrono.h index 3052233e..b6a49da3 100644 --- a/include/fmt/chrono.h +++ b/include/fmt/chrono.h @@ -440,32 +440,50 @@ template struct formatter { }; namespace internal { -template FMT_CONSTEXPR const char* get_units() { - return nullptr; + +template FMT_CONSTEXPR const Char* get_units() { return nullptr; } +template <> FMT_CONSTEXPR const char* get_units() { return "as"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"as"; } +template <> FMT_CONSTEXPR const char* get_units() { return "fs"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"fs"; } +template <> FMT_CONSTEXPR const char* get_units() { return "ps"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"ps"; } +template <> FMT_CONSTEXPR const char* get_units() { return "ns"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"ns"; } +template <> FMT_CONSTEXPR const char* get_units() { + return "µs"; } -template <> FMT_CONSTEXPR const char* get_units() { return "as"; } -template <> FMT_CONSTEXPR const char* get_units() { return "fs"; } -template <> FMT_CONSTEXPR const char* get_units() { return "ps"; } -template <> FMT_CONSTEXPR const char* get_units() { return "ns"; } -template <> FMT_CONSTEXPR const char* get_units() { return "µs"; } -template <> FMT_CONSTEXPR const char* get_units() { return "ms"; } -template <> FMT_CONSTEXPR const char* get_units() { return "cs"; } -template <> FMT_CONSTEXPR const char* get_units() { return "ds"; } -template <> FMT_CONSTEXPR const char* get_units>() { return "s"; } -template <> FMT_CONSTEXPR const char* get_units() { return "das"; } -template <> FMT_CONSTEXPR const char* get_units() { return "hs"; } -template <> FMT_CONSTEXPR const char* get_units() { return "ks"; } -template <> FMT_CONSTEXPR const char* get_units() { return "Ms"; } -template <> FMT_CONSTEXPR const char* get_units() { return "Gs"; } -template <> FMT_CONSTEXPR const char* get_units() { return "Ts"; } -template <> FMT_CONSTEXPR const char* get_units() { return "Ps"; } -template <> FMT_CONSTEXPR const char* get_units() { return "Es"; } -template <> FMT_CONSTEXPR const char* get_units>() { - return "m"; -} -template <> FMT_CONSTEXPR const char* get_units>() { - return "h"; +template <> FMT_CONSTEXPR const wchar_t* get_units() { + return L"\u00B5s"; } +template <> FMT_CONSTEXPR const char* get_units() { return "ms"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"ms"; } +template <> FMT_CONSTEXPR const char* get_units() { return "cs"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"cs"; } +template <> FMT_CONSTEXPR const char* get_units() { return "ds"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"ds"; } +template <> FMT_CONSTEXPR const char* get_units>() { return "s"; } +template <> FMT_CONSTEXPR const wchar_t* get_units>() { return L"s"; } +template <> FMT_CONSTEXPR const char* get_units() { return "das"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"das"; } +template <> FMT_CONSTEXPR const char* get_units() { return "hs"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"hs"; } +template <> FMT_CONSTEXPR const char* get_units() { return "ks"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"ks"; } +template <> FMT_CONSTEXPR const char* get_units() { return "Ms"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"Ms"; } +template <> FMT_CONSTEXPR const char* get_units() { return "Gs"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"Gs"; } +template <> FMT_CONSTEXPR const char* get_units() { return "Ts"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"Ts"; } +template <> FMT_CONSTEXPR const char* get_units() { return "Ps"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"Ps"; } +template <> FMT_CONSTEXPR const char* get_units() { return "Es"; } +template <> FMT_CONSTEXPR const wchar_t* get_units() { return L"Es"; } +template <> FMT_CONSTEXPR const char* get_units>() { return "m"; } +template <> FMT_CONSTEXPR const wchar_t* get_units>() { return L"m"; } +template <> FMT_CONSTEXPR const char* get_units>() { return "h"; } +template <> FMT_CONSTEXPR const wchar_t* get_units>() { return L"h"; } enum class numeric_system { standard, @@ -496,12 +514,12 @@ FMT_CONSTEXPR const Char* parse_chrono_format(const Char* begin, break; case 'n': { const Char newline[] { '\n', 0 }; - handler.on_text(newline, newline + 1); + handler.on_text(newline, &newline[1]); break; } case 't': { const Char tab[] { '\t', 0 }; - handler.on_text(tab, tab + 1); + handler.on_text(tab, &tab[1]); break; } // Day of the week: @@ -759,18 +777,23 @@ inline std::chrono::duration get_milliseconds( return std::chrono::duration(static_cast(ms)); } -template +template OutputIt format_duration_value(OutputIt out, Rep val, int precision) { - if (precision >= 0) return format_to(out, "{:.{}f}", val, precision); - return format_to(out, std::is_floating_point::value ? "{:g}" : "{}", - val); + const Char pr_f[] { '{', ':', '.', '{', '}', 'f', '}', 0 }; + if (precision >= 0) return format_to(out, pr_f, val, precision); + const Char fp_f[] { '{', ':', 'g', '}', 0 }; + const Char format[] { '{', '}', 0 }; + return format_to(out, std::is_floating_point::value ? fp_f : format, val); } -template +template OutputIt format_duration_unit(OutputIt out) { - if (const char* unit = get_units()) return format_to(out, "{}", unit); - if (Period::den == 1) return format_to(out, "[{}]s", Period::num); - return format_to(out, "[{}/{}]s", Period::num, Period::den); + const Char format[] { '{', '}', 0 }; + if (const Char* unit = get_units()) return format_to(out, format, unit); + const Char num_f[] { '[', '{', '}', ']', 's', 0 }; + if (Period::den == 1) return format_to(out, num_f, Period::num); + const Char num_def_f[] { '[', '{', '}', '/', '{', '}', ']', 's', 0 }; + return format_to(out, num_def_f, Period::num, Period::den); } template (out, val, precision); } - void on_duration_unit() { out = format_duration_unit(out); } + void on_duration_unit() { out = format_duration_unit(out); } }; } // namespace internal @@ -1094,8 +1116,8 @@ struct formatter, Char> { internal::handle_dynamic_spec( precision, precision_ref, ctx); if (begin == end || *begin == '}') { - out = internal::format_duration_value(out, d.count(), precision); - internal::format_duration_unit(out); + out = internal::format_duration_value(out, d.count(), precision); + internal::format_duration_unit(out); } else { internal::chrono_formatter f( ctx, out, d);