diff --git a/sprout/math/atan2.hpp b/sprout/math/atan2.hpp new file mode 100644 index 00000000..897f68ad --- /dev/null +++ b/sprout/math/atan2.hpp @@ -0,0 +1,91 @@ +#ifndef SPROUT_MATH_ATAN2_HPP +#define SPROUT_MATH_ATAN2_HPP + +#include +#include +#include +#include +#include +#if SPROUT_USE_BUILTIN_CMATH_FUNCTION +# include +#endif + +namespace sprout { + namespace math { + namespace detail { + template + struct atan2_promoted {}; + template + struct atan2_promoted< + Y, + X, + typename std::enable_if< + std::is_arithmetic::value && std::is_arithmetic::value + && (std::is_same::value || std::is_same::value) + >::type + > { + public: + typedef long double type; + }; + template + struct atan2_promoted< + Y, + X, + typename std::enable_if< + std::is_arithmetic::value && std::is_arithmetic::value + && !(std::is_same::value || std::is_same::value) + >::type + > { + public: + typedef double type; + }; + } // namespace detail + // + // atan2_promoted + // + template + struct atan2_promoted + : public sprout::math::detail::atan2_promoted< + typename std::remove_cv::type, + typename std::remove_cv::type + > + {}; + + namespace detail { + template< + typename FloatType, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CONSTEXPR FloatType + atan2(FloatType y, FloatType x) { + return x < 0 + ? sprout::math::detail::atan(y / x) + (y < 0 ? -1 : 1) * sprout::math::pi() + : sprout::math::detail::atan(y / x) + ; + } + + template< + typename ArithmeticType1, + typename ArithmeticType2, + typename sprout::enabler_if< + std::is_arithmetic::value && std::is_arithmetic::value + >::type = sprout::enabler + > + inline SPROUT_CONSTEXPR typename sprout::math::atan2_promoted::type + atan2(ArithmeticType1 y, ArithmeticType2 x) { + typedef typename sprout::math::atan2_promoted::type type; + return sprout::math::detail::atan2(static_cast(y), static_cast(x)); + } + } // namespace detail + +# if SPROUT_USE_BUILTIN_CMATH_FUNCTION + using std::atan2; +# else + using sprout::math::detail::atan2; +# endif + } // namespace math + + using sprout::math::atan2; +} // namespace sprout + +#endif // #ifndef SPROUT_MATH_ATAN2_HPP diff --git a/sprout/math/trigonometric.hpp b/sprout/math/trigonometric.hpp index 299062a1..70185ef0 100644 --- a/sprout/math/trigonometric.hpp +++ b/sprout/math/trigonometric.hpp @@ -7,5 +7,6 @@ #include #include #include +#include #endif // #ifndef SPROUT_MATH_TRIGONOMETRIC_HPP