forked from mpusz/mp-units
@@ -23,6 +23,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <units/derived_dimension.h>
|
#include <units/derived_dimension.h>
|
||||||
|
#include <units/magnitude.h>
|
||||||
|
|
||||||
namespace units::detail {
|
namespace units::detail {
|
||||||
|
|
||||||
@@ -35,23 +36,20 @@ inline constexpr bool same_scaled_units<exponent_list<Es...>, Us...> = (UnitOf<U
|
|||||||
|
|
||||||
// derived_unit
|
// derived_unit
|
||||||
|
|
||||||
template<Exponent E>
|
template<Unit... Us, typename... Es>
|
||||||
constexpr ratio inverse_if_negative(const ratio& r)
|
constexpr Magnitude auto derived_mag(exponent_list<Es...>)
|
||||||
{
|
{
|
||||||
if constexpr (E::num * E::den > 0)
|
return (as_magnitude<1>() * ... *
|
||||||
return r;
|
pow<ratio{Es::num, Es::den}>(Us::mag / dimension_unit<typename Es::dimension>::mag));
|
||||||
else
|
|
||||||
return inverse(r);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Unit... Us, typename... Es>
|
template<Unit... Us, typename... Es>
|
||||||
constexpr ratio derived_ratio(exponent_list<Es...>)
|
constexpr ratio derived_ratio(exponent_list<Es...> es)
|
||||||
{
|
{
|
||||||
return (... * inverse_if_negative<Es>(
|
return as_ratio(derived_mag<Us...>(es));
|
||||||
pow<detail::abs(Es::num)>(Us::ratio / dimension_unit<typename Es::dimension>::ratio)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<DerivedDimension D, Unit... Us>
|
template<DerivedDimension D, Unit... Us>
|
||||||
using derived_unit = scaled_unit<derived_ratio<Us...>(typename D::recipe()), typename D::coherent_unit::reference>;
|
using derived_unit = scaled_unit<derived_mag<Us...>(typename D::recipe()), typename D::coherent_unit::reference>;
|
||||||
|
|
||||||
} // namespace units::detail
|
} // namespace units::detail
|
||||||
|
Reference in New Issue
Block a user