From c2e91d41c4708fe6c3930778f010951a072afeff Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 5 Jun 2023 11:09:02 +0200 Subject: [PATCH] fix: commutativity of a `common_unit()` fixed --- src/core/include/mp-units/bits/external/type_name.h | 13 +++++++++++++ src/core/include/mp-units/unit.h | 5 ++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/core/include/mp-units/bits/external/type_name.h b/src/core/include/mp-units/bits/external/type_name.h index 9a74759f..e8fb007f 100644 --- a/src/core/include/mp-units/bits/external/type_name.h +++ b/src/core/include/mp-units/bits/external/type_name.h @@ -25,3 +25,16 @@ template name.remove_suffix(suffix.size()); return name; } + +template +[[nodiscard]] consteval auto better_type_name(T1 v1, T2 v2) +{ + if constexpr (type_name().size() < type_name().size()) + return v1; + else if constexpr (type_name().size() < type_name().size()) + return v2; + else if constexpr (type_name() < type_name()) + return v1; + else + return v2; +} diff --git a/src/core/include/mp-units/unit.h b/src/core/include/mp-units/unit.h index 63ddbef8..0052f12b 100644 --- a/src/core/include/mp-units/unit.h +++ b/src/core/include/mp-units/unit.h @@ -629,8 +629,11 @@ template if constexpr (U1{} == U2{}) { if constexpr (std::derived_from) return u1; - else + else if constexpr (std::derived_from) return u2; + else + // TODO Check if there is a better choice here + return better_type_name(u1, u2); } else { constexpr auto canonical_lhs = detail::get_canonical_unit(U1{}); constexpr auto canonical_rhs = detail::get_canonical_unit(U2{});