forked from mpusz/mp-units
Use Magnitude concept where appropriate
This commit is contained in:
@@ -49,18 +49,18 @@ struct int_base : std::integral_constant<std::intmax_t, n> {};
|
|||||||
template <std::intmax_t n, std::intmax_t num = 1, std::intmax_t den = 1>
|
template <std::intmax_t n, std::intmax_t num = 1, std::intmax_t den = 1>
|
||||||
using int_base_power = base_power<int_base<n>, ratio{num, den}>;
|
using int_base_power = base_power<int_base<n>, ratio{num, den}>;
|
||||||
|
|
||||||
template <typename mag_t>
|
template <Magnitude M>
|
||||||
struct inverse;
|
struct inverse;
|
||||||
template <typename mag_t>
|
template <Magnitude M>
|
||||||
using inverse_t = typename inverse<mag_t>::type;
|
using inverse_t = typename inverse<M>::type;
|
||||||
|
|
||||||
template <typename... mags>
|
template <Magnitude... Mags>
|
||||||
struct product;
|
struct product;
|
||||||
template <typename... mags>
|
template <Magnitude... Mags>
|
||||||
using product_t = typename product<mags...>::type;
|
using product_t = typename product<Mags...>::type;
|
||||||
|
|
||||||
template <typename mag1, typename mag2>
|
template <Magnitude T, Magnitude U>
|
||||||
using quotient_t = product_t<mag1, inverse_t<mag2>>;
|
using quotient_t = product_t<T, inverse_t<U>>;
|
||||||
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
@@ -129,10 +129,10 @@ struct inverse<magnitude<base_power<bases, powers>...>> {
|
|||||||
// Convenience utility to prepend a base_power to a magnitude.
|
// Convenience utility to prepend a base_power to a magnitude.
|
||||||
//
|
//
|
||||||
// Assumes that the prepended power has a smaller base than every base power in the magnitude.
|
// Assumes that the prepended power has a smaller base than every base power in the magnitude.
|
||||||
template <typename new_base, typename mag_t>
|
template <typename new_base, Magnitude M>
|
||||||
struct prepend_base;
|
struct prepend_base;
|
||||||
template <typename new_base, typename mag_t>
|
template <typename new_base, Magnitude M>
|
||||||
using prepend_base_t = typename prepend_base<new_base, mag_t>::type;
|
using prepend_base_t = typename prepend_base<new_base, M>::type;
|
||||||
template <typename new_base, typename... old_bases>
|
template <typename new_base, typename... old_bases>
|
||||||
struct prepend_base<new_base, magnitude<old_bases...>> {
|
struct prepend_base<new_base, magnitude<old_bases...>> {
|
||||||
using type = magnitude<new_base, old_bases...>;
|
using type = magnitude<new_base, old_bases...>;
|
||||||
@@ -143,12 +143,12 @@ template <>
|
|||||||
struct product<> { using type = magnitude<>; };
|
struct product<> { using type = magnitude<>; };
|
||||||
|
|
||||||
// Unary case.
|
// Unary case.
|
||||||
template <typename mag_t>
|
template <Magnitude M>
|
||||||
struct product<mag_t> { using type = mag_t; };
|
struct product<M> { using type = M; };
|
||||||
|
|
||||||
// Binary case, where right argument is null magnitude.
|
// Binary case, where right argument is null magnitude.
|
||||||
template <typename mag_t>
|
template <Magnitude M>
|
||||||
struct product<mag_t, magnitude<>> { using type = mag_t; };
|
struct product<M, magnitude<>> { using type = M; };
|
||||||
|
|
||||||
// Binary case, where left argument is null magnitude, and right is non-null.
|
// Binary case, where left argument is null magnitude, and right is non-null.
|
||||||
template <typename head, typename... tail>
|
template <typename head, typename... tail>
|
||||||
@@ -187,10 +187,10 @@ struct product<magnitude<base_power<base, pow1>, tail1...>,
|
|||||||
};
|
};
|
||||||
|
|
||||||
// N-ary case (N > 2).
|
// N-ary case (N > 2).
|
||||||
template <typename mag_a, typename mag_b, typename... tail>
|
template <Magnitude T, Magnitude U, typename... tail>
|
||||||
struct product<mag_a, mag_b, tail...>
|
struct product<T, U, tail...>
|
||||||
{
|
{
|
||||||
using type = product_t<product_t<mag_a, mag_b>, tail...>;
|
using type = product_t<product_t<T, U>, tail...>;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace units::mag
|
} // namespace units::mag
|
||||||
|
Reference in New Issue
Block a user