diff --git a/src/core/include/units/math.h b/src/core/include/units/math.h index 8573766f..e97babb9 100644 --- a/src/core/include/units/math.h +++ b/src/core/include/units/math.h @@ -23,7 +23,9 @@ #pragma once #include +#include #include +#include #include // IWYU pragma: begin_exports @@ -294,4 +296,62 @@ template return type{hypot(type{x}.number(), type{y}.number(), type{z}.number())}; } +namespace isq { + +template Q> + requires treat_as_floating_point +[[nodiscard]] inline quantity_of 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> + requires treat_as_floating_point +[[nodiscard]] inline quantity_of 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> + requires treat_as_floating_point +[[nodiscard]] inline quantity_of auto tan(const Q& q) noexcept + requires requires { tan(q.number()); } || requires { std::tan(q.number()); } +{ + using std::tan; + return quantity{tan(q[si::radian].number())}; +} + +template Q> + requires treat_as_floating_point +[[nodiscard]] inline quantity_of 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]; +} + +template Q> + requires treat_as_floating_point +[[nodiscard]] inline quantity_of 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]; +} + +template Q> + requires treat_as_floating_point +[[nodiscard]] inline quantity_of 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]; +} + +} // namespace isq + } // namespace units