diff --git a/src/core/include/mp-units/framework/dimension.h b/src/core/include/mp-units/framework/dimension.h index 6b5bb846..72b15dd6 100644 --- a/src/core/include/mp-units/framework/dimension.h +++ b/src/core/include/mp-units/framework/dimension.h @@ -204,14 +204,8 @@ template requires detail::non_zero [[nodiscard]] consteval Dimension auto pow(D d) { - if constexpr (detail::BaseDimension) { - if constexpr (Den == 1) - return derived_dimension>{}; - else - return derived_dimension>{}; - } else - return detail::expr_pow(d); + return detail::expr_pow( + d); } /** diff --git a/src/core/include/mp-units/framework/expression_template.h b/src/core/include/mp-units/framework/expression_template.h index 565ad8f0..9b7e2a6c 100644 --- a/src/core/include/mp-units/framework/expression_template.h +++ b/src/core/include/mp-units/framework/expression_template.h @@ -475,9 +475,18 @@ template typename To template typename To, typename OneType, template typename Pred, typename T> requires detail::non_zero -[[nodiscard]] consteval auto expr_pow(T) +[[nodiscard]] consteval auto expr_pow(T v) { - return expr_pow_impl(typename T::_num_{}, typename T::_den_{}); + if constexpr (Num == 0 || is_same_v) + return OneType{}; + else if constexpr (detail::ratio{Num, Den} == 1) + return v; + else if constexpr (is_specialization_of) + return expr_pow_impl(typename T::_num_{}, typename T::_den_{}); + else if constexpr (Den == 1) + return To>{}; + else + return To>{}; } diff --git a/src/core/include/mp-units/framework/quantity_spec.h b/src/core/include/mp-units/framework/quantity_spec.h index 7e8f0b35..34ea2c0e 100644 --- a/src/core/include/mp-units/framework/quantity_spec.h +++ b/src/core/include/mp-units/framework/quantity_spec.h @@ -590,18 +590,9 @@ template requires detail::non_zero [[nodiscard]] consteval QuantitySpec auto pow(Q q) { - if constexpr (Num == 0 || Q{} == dimensionless) - return dimensionless; - else if constexpr (detail::ratio{Num, Den} == 1) - return q; - else if constexpr (detail::DerivedQuantitySpec) - return detail::clone_kind_of( - detail::expr_pow( - detail::remove_kind(q))); - else if constexpr (Den == 1) - return detail::clone_kind_of(derived_quantity_spec>{}); - else - return detail::clone_kind_of(derived_quantity_spec>{}); + return detail::clone_kind_of( + detail::expr_pow( + detail::remove_kind(q))); } diff --git a/src/core/include/mp-units/framework/unit.h b/src/core/include/mp-units/framework/unit.h index ed58a7e5..e4a6dc2a 100644 --- a/src/core/include/mp-units/framework/unit.h +++ b/src/core/include/mp-units/framework/unit.h @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -608,16 +607,7 @@ template requires detail::non_zero [[nodiscard]] consteval Unit auto pow(U u) { - if constexpr (Num == 0 || is_same_v) - return one; - else if constexpr (detail::ratio{Num, Den} == 1) - return u; - else if constexpr (is_specialization_of) - return detail::expr_pow(u); - else if constexpr (Den == 1) - return derived_unit>{}; - else - return derived_unit>{}; + return detail::expr_pow(u); } /**