diff --git a/src/utility/include/mp_units/math.h b/src/utility/include/mp_units/math.h index 32632d75..aeacf88a 100644 --- a/src/utility/include/mp_units/math.h +++ b/src/utility/include/mp_units/math.h @@ -23,6 +23,7 @@ #pragma once #include +#include #include #include #include @@ -114,7 +115,7 @@ template Q> requires requires { exp(q.number()); } || requires { std::exp(q.number()); } { using std::exp; - return quantity_cast(exp(quantity_cast(q).number()) * dimensionless[one]); + return value_cast(exp(value_cast(q).number()) * dimensionless[one]); } /** @@ -157,7 +158,7 @@ template requires((!treat_as_floating_point) || requires { floor(q.number()); } || requires { std::floor(q.number()); }) && (To == get_unit(R) || requires { - ::mp_units::quantity_cast(q); + ::mp_units::value_cast(q); quantity{}, Rep>::one(); }) { @@ -173,13 +174,13 @@ template return quantity{}, Rep>(floor(q.number())); } else { return handle_signed_results( - quantity{}, Rep>(floor(quantity_cast(q).number()))); + quantity{}, Rep>(floor(value_cast(q).number()))); } } else { if constexpr (To == get_unit(R)) { - return quantity_cast(q); + return value_cast(q); } else { - return handle_signed_results(quantity_cast(q)); + return handle_signed_results(value_cast(q)); } } } @@ -194,7 +195,7 @@ template [[nodiscard]] constexpr quantity{}, Rep> ceil(const quantity& q) noexcept requires((!treat_as_floating_point) || requires { ceil(q.number()); } || requires { std::ceil(q.number()); }) && (To == get_unit(R) || requires { - ::mp_units::quantity_cast(q); + ::mp_units::value_cast(q); quantity{}, Rep>::one(); }) { @@ -210,13 +211,13 @@ template return quantity{}, Rep>(ceil(q.number())); } else { return handle_signed_results( - quantity{}, Rep>(ceil(quantity_cast(q).number()))); + quantity{}, Rep>(ceil(value_cast(q).number()))); } } else { if constexpr (To == get_unit(R)) { - return quantity_cast(q); + return value_cast(q); } else { - return handle_signed_results(quantity_cast(q)); + return handle_signed_results(value_cast(q)); } } } @@ -243,7 +244,7 @@ template using std::round; return quantity{}, Rep>(round(q.number())); } else { - return quantity_cast(q); + return value_cast(q); } } else { const auto res_low = mp_units::floor(q); @@ -268,15 +269,15 @@ template * without undue overflow or underflow at intermediate stages of the computation */ template -[[nodiscard]] inline QuantityOf auto hypot(const Q1& x, - const Q2& y) noexcept +[[nodiscard]] inline QuantityOf auto hypot( + const Q1& x, const Q2& y) noexcept requires requires { common_reference(Q1::reference, Q2::reference); } && ( requires { hypot(x.number(), y.number()); } || requires { std::hypot(x.number(), y.number()); }) { using std::hypot; using type = quantity; - return type{hypot(type{x}.number(), type{y}.number())}; + return hypot(type{x}.number(), type{y}.number()) * type::reference; } /** @@ -284,8 +285,8 @@ template * without undue overflow or underflow at intermediate stages of the computation */ template -[[nodiscard]] inline QuantityOf auto hypot( - const Q1& x, const Q2& y, const Q3& z) noexcept +[[nodiscard]] inline QuantityOf auto +hypot(const Q1& x, const Q2& y, const Q3& z) noexcept requires requires { common_reference(Q1::reference, Q2::reference, Q3::reference); } && ( requires { hypot(x.number(), y.number(), z.number()); } || @@ -294,32 +295,32 @@ template using std::hypot; using type = quantity; - return type{hypot(type{x}.number(), type{y}.number(), type{z}.number())}; + return hypot(type{x}.number(), type{y}.number(), type{z}.number()) * type::reference; } namespace isq { -template Q> +template Q> requires treat_as_floating_point -[[nodiscard]] inline QuantityOf auto sin(const Q& q) noexcept +[[nodiscard]] inline QuantityOf auto sin(const Q& q) noexcept requires requires { sin(q.number()); } || requires { std::sin(q.number()); } { using std::sin; return quantity{sin(q[si::radian].number())}; } -template Q> +template Q> requires treat_as_floating_point -[[nodiscard]] inline QuantityOf auto cos(const Q& q) noexcept +[[nodiscard]] inline QuantityOf auto cos(const Q& q) noexcept requires requires { cos(q.number()); } || requires { std::cos(q.number()); } { using std::cos; return quantity{cos(q[si::radian].number())}; } -template Q> +template Q> requires treat_as_floating_point -[[nodiscard]] inline QuantityOf auto tan(const Q& q) noexcept +[[nodiscard]] inline QuantityOf auto tan(const Q& q) noexcept requires requires { tan(q.number()); } || requires { std::tan(q.number()); } { using std::tan; @@ -328,88 +329,88 @@ template Q> template Q> requires treat_as_floating_point -[[nodiscard]] inline QuantityOf auto asin(const Q& q) noexcept +[[nodiscard]] inline QuantityOf auto asin(const Q& q) noexcept requires requires { asin(q.number()); } || requires { std::asin(q.number()); } { using std::asin; - return asin(quantity_cast(q).number()) * angular_measure[si::radian]; + return asin(value_cast(q).number()) * angular_measure[si::radian]; } template Q> requires treat_as_floating_point -[[nodiscard]] inline QuantityOf auto acos(const Q& q) noexcept +[[nodiscard]] inline QuantityOf auto acos(const Q& q) noexcept requires requires { acos(q.number()); } || requires { std::acos(q.number()); } { using std::acos; - return acos(quantity_cast(q).number()) * angular_measure[si::radian]; + return acos(value_cast(q).number()) * angular_measure[si::radian]; } template Q> requires treat_as_floating_point -[[nodiscard]] inline QuantityOf auto atan(const Q& q) noexcept +[[nodiscard]] inline QuantityOf auto atan(const Q& q) noexcept requires requires { atan(q.number()); } || requires { std::atan(q.number()); } { using std::atan; - return atan(quantity_cast(q).number()) * angular_measure[si::radian]; + return atan(value_cast(q).number()) * angular_measure[si::radian]; } } // namespace isq namespace angular { -// TODO cannot use `WeakQuantityOf` as it is not interconvertible with `isq_angle::angular_measure` +// TODO cannot use `QuantityOf` as it is not interconvertible with `isq_angle::angular_measure` template Q> requires treat_as_floating_point -[[nodiscard]] inline QuantityOf auto sin(const Q& q) noexcept +[[nodiscard]] inline QuantityOf auto sin(const Q& q) noexcept requires requires { sin(q.number()); } || requires { std::sin(q.number()); } { using std::sin; - return quantity{sin(q[radian].number())}; + return sin(q[radian].number()) * one; } template Q> requires treat_as_floating_point -[[nodiscard]] inline QuantityOf auto cos(const Q& q) noexcept +[[nodiscard]] inline QuantityOf auto cos(const Q& q) noexcept requires requires { cos(q.number()); } || requires { std::cos(q.number()); } { using std::cos; - return quantity{cos(q[radian].number())}; + return cos(q[radian].number()) * one; } template Q> requires treat_as_floating_point -[[nodiscard]] inline QuantityOf auto tan(const Q& q) noexcept +[[nodiscard]] inline QuantityOf auto tan(const Q& q) noexcept requires requires { tan(q.number()); } || requires { std::tan(q.number()); } { using std::tan; - return quantity{tan(q[radian].number())}; + return tan(q[radian].number()) * one; } template Q> requires treat_as_floating_point -[[nodiscard]] inline QuantityOf auto asin(const Q& q) noexcept +[[nodiscard]] inline QuantityOf auto asin(const Q& q) noexcept requires requires { asin(q.number()); } || requires { std::asin(q.number()); } { using std::asin; - return asin(quantity_cast(q).number()) * angle[radian]; + return asin(value_cast(q).number()) * angle[radian]; } template Q> requires treat_as_floating_point -[[nodiscard]] inline QuantityOf auto acos(const Q& q) noexcept +[[nodiscard]] inline QuantityOf auto acos(const Q& q) noexcept requires requires { acos(q.number()); } || requires { std::acos(q.number()); } { using std::acos; - return acos(quantity_cast(q).number()) * angle[radian]; + return acos(value_cast(q).number()) * angle[radian]; } template Q> requires treat_as_floating_point -[[nodiscard]] inline QuantityOf auto atan(const Q& q) noexcept +[[nodiscard]] inline QuantityOf auto atan(const Q& q) noexcept requires requires { atan(q.number()); } || requires { std::atan(q.number()); } { using std::atan; - return atan(quantity_cast(q).number()) * angle[radian]; + return atan(value_cast(q).number()) * angle[radian]; } } // namespace angular