#pragma once #include "core/math/concepts.hh" namespace math { template constexpr std::size_t array_size(const type (&)[size]); } // namespace math namespace math { template constexpr scalar log2(const scalar x); template constexpr scalar mod_signed(const scalar x, const scalar m); template constexpr result_scalar sign(const scalar x); } // namespace math namespace math { template constexpr scalar degrees(const scalar x); template constexpr scalar radians(const scalar x); } // namespace math template constexpr std::size_t math::array_size(const type (&)[size]) { return size; } template constexpr scalar math::log2(const scalar x) { if(x < static_cast(2)) return static_cast(0); return math::log2((x + static_cast(1)) >> 1) + static_cast(1); } template constexpr scalar math::mod_signed(const scalar x, const scalar m) { auto result = static_cast(x % m); if(result < static_cast(0)) return result + m; return result; } template constexpr result_scalar math::sign(const scalar x) { if(x < static_cast(0)) return static_cast(-1); if(x > static_cast(0)) return static_cast(+1); return static_cast(0); } template constexpr scalar math::degrees(const scalar x) { return static_cast(static_cast(x) * 180.0 / M_PI); } template constexpr scalar math::radians(const scalar x) { return static_cast(static_cast(x) * M_PI / 180.0); }