diff --git a/src/Base/Tools.h b/src/Base/Tools.h index 895f7922dc..567814191c 100644 --- a/src/Base/Tools.h +++ b/src/Base/Tools.h @@ -129,18 +129,38 @@ constexpr std::enable_if_t && std::is_signed_v, T> sg return T(oneIfPositive - oneIfNegative); // 0/1 - 0/1 = -1/0/1 } +/// Convert degrees to radians, allow deduction for floating point types +template +constexpr T toRadians(T degrees) +{ + constexpr auto degToRad = std::numbers::pi_v / T(180); + return degrees * degToRad; } -template -inline T toRadians(T d) +/// Convert degrees to radians, allow **explicit-only** for any arithmetic type +template + requires(std::is_arithmetic_v && !std::floating_point) +constexpr T toRadians(std::type_identity_t degrees) { - return static_cast((d * std::numbers::pi) / 180.0); + using ResultT = std::conditional_t, double, T>; + return static_cast(toRadians(static_cast(degrees))); } -template -inline T toDegrees(T r) +/// Convert radians to degrees, allow deduction for floating point types +template +constexpr T toDegrees(T radians) { - return static_cast((r / std::numbers::pi) * 180.0); + constexpr auto radToDeg = T(180) / std::numbers::pi_v; + return radians * radToDeg; +} + +/// Convert radians to degrees, allow **explicit-only** for any arithmetic type +template + requires(std::is_arithmetic_v && !std::floating_point) +constexpr T toDegrees(std::type_identity_t radians) +{ + using ResultT = std::conditional_t, double, T>; + return static_cast(toDegrees(static_cast(radians))); } inline float fromPercent(const long value)