diff --git a/src/core/include/mp-units/framework/magnitude.h b/src/core/include/mp-units/framework/magnitude.h index d4b960bc3..839f8f80d 100644 --- a/src/core/include/mp-units/framework/magnitude.h +++ b/src/core/include/mp-units/framework/magnitude.h @@ -190,6 +190,12 @@ template return is_rational(element) && get_exponent(element).num > 0; } +[[nodiscard]] consteval bool is_positive_integral_power(MagnitudeSpecExpr auto element) +{ + auto exp = get_exponent(element); + return exp.den == 1 && exp.num > 0; +} + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Magnitude product implementation. [[nodiscard]] consteval bool less(MagnitudeSpecExpr auto lhs, MagnitudeSpecExpr auto rhs) @@ -431,6 +437,10 @@ struct magnitude : detail::magnitude_base> { // all below functions should in fact be in a `detail` namespace but are placed here to benefit from the ADL [[nodiscard]] friend consteval bool _is_integral(const magnitude&) { return (detail::is_integral(Ms) && ...); } [[nodiscard]] friend consteval bool _is_rational(const magnitude&) { return (detail::is_rational(Ms) && ...); } + [[nodiscard]] friend consteval bool _is_positive_integral_power(const magnitude&) + { + return (detail::is_positive_integral_power(Ms) && ...); + } /** * @brief The value of a Magnitude in a desired type T. diff --git a/src/core/include/mp-units/framework/unit.h b/src/core/include/mp-units/framework/unit.h index 48c3cdf21..0e97ed9b8 100644 --- a/src/core/include/mp-units/framework/unit.h +++ b/src/core/include/mp-units/framework/unit.h @@ -674,9 +674,9 @@ template constexpr auto canonical_lhs = get_canonical_unit(U1{}); constexpr auto canonical_rhs = get_canonical_unit(U2{}); - if constexpr (_is_integral(canonical_lhs.mag / canonical_rhs.mag)) + if constexpr (_is_positive_integral_power(canonical_lhs.mag / canonical_rhs.mag)) return u2; - else if constexpr (_is_integral(canonical_rhs.mag / canonical_lhs.mag)) + else if constexpr (_is_positive_integral_power(canonical_rhs.mag / canonical_lhs.mag)) return u1; else { if constexpr (detail::unit_less::value) diff --git a/test/static/unit_symbol_test.cpp b/test/static/unit_symbol_test.cpp index 01f9448af..f053147db 100644 --- a/test/static/unit_symbol_test.cpp +++ b/test/static/unit_symbol_test.cpp @@ -211,9 +211,6 @@ static_assert(unit_symbol(get_common_unit(kilo / hour, metre / second) / static_assert(unit_symbol(get_common_unit(kilo / hour, metre / second) * second) == "EQUIV{[1/5 km/h], [1/18 m/s]} s"); static_assert(unit_symbol(get_common_unit(radian, degree)) == "EQUIV{[1/๐œ‹ยฐ], [1/180 rad]}"); -static_assert(unit_symbol(get_common_unit(angular::radian, angular::revolution)) == "EQUIV{rad, [2โปยน ๐œ‹โปยน rev]}"); -static_assert(unit_symbol(get_common_unit(angular::radian, angular::revolution)) == - "EQUIV{rad, [1/(2 ๐œ‹) rev]}"); // derived units static_assert(unit_symbol(one) == ""); // NOLINT(readability-container-size-empty) diff --git a/test/static/unit_test.cpp b/test/static/unit_test.cpp index f25b99878..94d3d942b 100644 --- a/test/static/unit_test.cpp +++ b/test/static/unit_test.cpp @@ -540,8 +540,7 @@ static_assert(is_of_type); static_assert( is_of_type>>); -static_assert(is_of_type>); -static_assert(is_of_type>); +static_assert(is_of_type); // those should return instantiations of the `common_unit` class template static_assert(is_of_type, mile_>>); @@ -550,6 +549,7 @@ static_assert(is_of_type>); static_assert(is_of_type>); +static_assert(is_of_type>); static_assert( is_of_type, mile_>, per>>);