refactor: magnitude::pow() now takes two ints rather than a ratio (consistent with the rest of library)

This commit is contained in:
Mateusz Pusz
2023-06-01 08:47:55 +02:00
parent 03b58ee073
commit 14258c97fd
2 changed files with 8 additions and 9 deletions

View File

@@ -517,26 +517,26 @@ template<Magnitude M1, Magnitude M2>
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Magnitude rational powers implementation. // Magnitude rational powers implementation.
template<ratio E, auto... Ms> template<std::intmax_t Num, std::intmax_t Den = 1, auto... Ms>
[[nodiscard]] consteval auto pow(magnitude<Ms...>) [[nodiscard]] consteval auto pow(magnitude<Ms...>)
{ {
if constexpr (E.num == 0) { if constexpr (Num == 0) {
return magnitude<>{}; return magnitude<>{};
} else { } else {
return magnitude<detail::power_v_or_T<detail::get_base(Ms), detail::get_exponent(Ms) * E>()...>{}; return magnitude<detail::power_v_or_T<detail::get_base(Ms), detail::get_exponent(Ms) * ratio{Num, Den}>()...>{};
} }
} }
template<auto... Ms> template<auto... Ms>
[[nodiscard]] consteval auto sqrt(magnitude<Ms...> m) [[nodiscard]] consteval auto sqrt(magnitude<Ms...> m)
{ {
return pow<ratio{1, 2}>(m); return pow<1, 2>(m);
} }
template<auto... Ms> template<auto... Ms>
[[nodiscard]] consteval auto cbrt(magnitude<Ms...> m) [[nodiscard]] consteval auto cbrt(magnitude<Ms...> m)
{ {
return pow<ratio{1, 3}>(m); return pow<1, 3>(m);
} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -781,7 +781,7 @@ inline constexpr Magnitude auto mag = detail::prime_factorization_v<R.num> / det
*/ */
template<ratio Base, ratio Pow> template<ratio Base, ratio Pow>
requires detail::gt_zero<Base.num> requires detail::gt_zero<Base.num>
inline constexpr Magnitude auto mag_power = pow<Pow>(mag<Base>); inline constexpr Magnitude auto mag_power = pow<Pow.num, Pow.den>(mag<Base>);
namespace detail { namespace detail {

View File

@@ -372,10 +372,9 @@ template<typename T, typename F, int Num, int... Den>
if constexpr (requires { typename decltype(base.reference_unit)::_num_; }) { if constexpr (requires { typename decltype(base.reference_unit)::_num_; }) {
auto num = get_canonical_unit_impl(power<F, Num, Den...>{}, typename decltype(base.reference_unit)::_num_{}); auto num = get_canonical_unit_impl(power<F, Num, Den...>{}, typename decltype(base.reference_unit)::_num_{});
auto den = get_canonical_unit_impl(power<F, Num, Den...>{}, typename decltype(base.reference_unit)::_den_{}); auto den = get_canonical_unit_impl(power<F, Num, Den...>{}, typename decltype(base.reference_unit)::_den_{});
return canonical_unit{pow<power<F, Num, Den...>::exponent>(base.mag) * num.mag / den.mag, return canonical_unit{pow<Num, Den...>(base.mag) * num.mag / den.mag, num.reference_unit / den.reference_unit};
num.reference_unit / den.reference_unit};
} else { } else {
return canonical_unit{pow<power<F, Num, Den...>::exponent>(base.mag), return canonical_unit{pow<Num, Den...>(base.mag),
derived_unit<power<std::remove_const_t<decltype(base.reference_unit)>, Num, Den...>>{}}; derived_unit<power<std::remove_const_t<decltype(base.reference_unit)>, Num, Den...>>{}};
} }
} }