From e7756bf4ebdee4141a10a672079f633e5192ff5f Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 24 Feb 2020 15:17:50 +0100 Subject: [PATCH] Printing order of base units according to the recipe fixed --- src/include/units/bits/unit_text.h | 29 ++++++++++++++++------- test/unit_test/runtime/fmt_units_test.cpp | 15 ++++++++---- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/include/units/bits/unit_text.h b/src/include/units/bits/unit_text.h index 44b5f719..0a45215e 100644 --- a/src/include/units/bits/unit_text.h +++ b/src/include/units/bits/unit_text.h @@ -104,20 +104,33 @@ constexpr auto derived_dimension_unit_text(exp_list list) return derived_dimension_unit_text(list, std::index_sequence_for()); } -template -constexpr bool all_named(exp_list) +template +constexpr auto exp_list_with_named_units(exp_list); + +template +constexpr auto exp_list_with_named_units(Exp) { - return (dimension_unit::is_named && ...); + using dim = Exp::dimension; + if constexpr(dimension_unit::is_named) { + return exp_list(); + } + else { + using recipe = dim::recipe; + return exp_list_with_named_units(recipe()); + } +} + +template +constexpr auto exp_list_with_named_units(exp_list) +{ + return type_list_join(); } template constexpr auto derived_dimension_unit_text() { - using recipe = typename Dim::recipe; - if constexpr(all_named(recipe())) - return derived_dimension_unit_text(recipe()); - else - return derived_dimension_unit_text(typename Dim::exponents()); + using recipe = Dim::recipe; + return derived_dimension_unit_text(exp_list_with_named_units(recipe())); } // TODO Inline below concept when switched to gcc-10 diff --git a/test/unit_test/runtime/fmt_units_test.cpp b/test/unit_test/runtime/fmt_units_test.cpp index 31291cef..75c6415f 100644 --- a/test/unit_test/runtime/fmt_units_test.cpp +++ b/test/unit_test/runtime/fmt_units_test.cpp @@ -21,7 +21,9 @@ // SOFTWARE. #include "units/physical/si/area.h" +#include "units/physical/si/constants.h" #include "units/physical/si/frequency.h" +#include "units/physical/si/momentum.h" #include "units/physical/si/power.h" #include "units/physical/si/velocity.h" #include "units/physical/si/volume.h" @@ -105,10 +107,10 @@ TEST_CASE("fmt::format on synthesized unit symbols", "[text][fmt]") SECTION("resistance") { - CHECK(fmt::format("{}", 1q_R) == "1 Ω"); - CHECK(fmt::format("{}", 1q_kR) == "1 kΩ"); - CHECK(fmt::format("{}", 1q_mR) == "1 mΩ"); - CHECK(fmt::format("{}", 1q_MR) == "1 MΩ"); + CHECK(fmt::format("{}", 1q_R) == "1 Ω"); + CHECK(fmt::format("{}", 1q_kR) == "1 kΩ"); + CHECK(fmt::format("{}", 1q_mR) == "1 mΩ"); + CHECK(fmt::format("{}", 1q_MR) == "1 MΩ"); } SECTION("voltage") @@ -150,6 +152,11 @@ TEST_CASE("fmt::format on synthesized unit symbols", "[text][fmt]") CHECK(fmt::format("{}", 1q_mps2) == "1 m/s²"); } + SECTION("momentum") + { + CHECK(fmt::format("{}", 1q_kgmps) == "1 kg⋅m/s"); + } + SECTION("energy") { CHECK(fmt::format("{}", 1q_mJ) == "1 mJ");