From 0ce6fed70d4f52038e6acbb1b403fdf655081eee Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 23 Jan 2024 21:19:45 +0100 Subject: [PATCH] fix: quantity alignment formatting fixed --- src/core/include/mp-units/bits/fmt.h | 4 +++- src/core/include/mp-units/format.h | 34 +++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/core/include/mp-units/bits/fmt.h b/src/core/include/mp-units/bits/fmt.h index 5b7305b4..e570a0ef 100644 --- a/src/core/include/mp-units/bits/fmt.h +++ b/src/core/include/mp-units/bits/fmt.h @@ -341,7 +341,8 @@ constexpr int code_point_length(It begin) // Parses fill and alignment. template -[[nodiscard]] constexpr const Char* parse_align(const Char* begin, const Char* end, Specs& specs) +[[nodiscard]] constexpr const Char* parse_align(const Char* begin, const Char* end, Specs& specs, + fmt_align default_align = fmt_align::none) { gsl_Expects(begin != end); auto align = fmt_align::none; @@ -378,6 +379,7 @@ template } p = begin; } + if (align == fmt_align::none) align = default_align; // mp-units extension specs.align = align; return begin; } diff --git a/src/core/include/mp-units/format.h b/src/core/include/mp-units/format.h index 21a95e53..c3bc9d7c 100644 --- a/src/core/include/mp-units/format.h +++ b/src/core/include/mp-units/format.h @@ -40,6 +40,30 @@ struct fill_align_width_format_specs { fmt_arg_ref width_ref; }; +template +OutputIt format_global_buffer(OutputIt out, const fill_align_width_format_specs& specs) +{ + MP_UNITS_STD_FMT::format_to(out, "{{:"); + if (specs.fill.size() != 1 || specs.fill[0] != ' ') { + MP_UNITS_STD_FMT::format_to(out, "{}", specs.fill.data()); + } + switch (specs.align) { + case fmt_align::left: + MP_UNITS_STD_FMT::format_to(out, "<"); + break; + case fmt_align::right: + MP_UNITS_STD_FMT::format_to(out, ">"); + break; + case fmt_align::center: + MP_UNITS_STD_FMT::format_to(out, "^"); + break; + default: + break; + } + if (specs.width >= 1) MP_UNITS_STD_FMT::format_to(out, "{}", specs.width); + return MP_UNITS_STD_FMT::format_to(out, "}}"); +} + template [[nodiscard]] constexpr const Char* at_most_one_of(const Char* begin, const Char* end, std::string_view modifiers) { @@ -215,7 +239,6 @@ class MP_UNITS_STD_FMT::formatter, Char> { using format_specs = mp_units::detail::fill_align_width_format_specs; - std::basic_string_view fill_align_width_format_str_; std::basic_string_view modifiers_format_str_; std::vector format_str_lengths_; format_specs specs_{}; @@ -370,14 +393,12 @@ public: auto it = begin, end = ctx.end(); if (it == end || *it == '}') return it; - it = mp_units::detail::parse_align(it, end, specs_); + it = mp_units::detail::parse_align(it, end, specs_, mp_units::detail::fmt_align::right); if (it == end) return it; it = mp_units::detail::parse_dynamic_spec(it, end, specs_.width, specs_.width_ref, ctx); if (it == end) return it; - fill_align_width_format_str_ = {begin, it}; - format_checker checker(ctx, format_str_lengths_); end = parse_quantity_specs(it, end, checker); modifiers_format_str_ = {it, end}; @@ -397,8 +418,9 @@ public: std::basic_string quantity_buffer; format_quantity(std::back_inserter(quantity_buffer), q, ctx); - std::basic_string global_format_buffer = "{:" + std::basic_string{fill_align_width_format_str_} + "}"; - return MP_UNITS_STD_FMT::vformat_to(ctx.out(), global_format_buffer, + std::basic_string fill_align_width_format_str; + mp_units::detail::format_global_buffer(std::back_inserter(fill_align_width_format_str), specs); + return MP_UNITS_STD_FMT::vformat_to(ctx.out(), fill_align_width_format_str, MP_UNITS_STD_FMT::make_format_args(quantity_buffer)); } }