From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Tyler Veness Date: Sun, 26 Nov 2023 18:09:12 -0800 Subject: [PATCH 1/2] Call std functions if not constant-evaluated The subheaders now have namespace declarations so C++ standard library headers can be included in the global namespace. Doing otherwise can cause ambiguous declarations of cmath functions. --- include/gcem.hpp | 151 +++++++++--------- include/gcem_incl/abs.hpp | 12 ++ include/gcem_incl/acos.hpp | 12 ++ include/gcem_incl/acosh.hpp | 12 ++ include/gcem_incl/asin.hpp | 12 ++ include/gcem_incl/asinh.hpp | 11 ++ include/gcem_incl/atan.hpp | 12 ++ include/gcem_incl/atan2.hpp | 12 ++ include/gcem_incl/atanh.hpp | 12 ++ include/gcem_incl/beta.hpp | 16 ++ include/gcem_incl/binomial_coef.hpp | 7 +- include/gcem_incl/ceil.hpp | 12 ++ include/gcem_incl/copysign.hpp | 12 ++ include/gcem_incl/cos.hpp | 12 ++ include/gcem_incl/cosh.hpp | 12 ++ include/gcem_incl/erf.hpp | 12 ++ include/gcem_incl/erf_inv.hpp | 4 + include/gcem_incl/exp.hpp | 12 ++ include/gcem_incl/expm1.hpp | 12 ++ include/gcem_incl/factorial.hpp | 5 + include/gcem_incl/find_exponent.hpp | 5 + include/gcem_incl/find_fraction.hpp | 5 + include/gcem_incl/find_whole.hpp | 5 + include/gcem_incl/floor.hpp | 12 ++ include/gcem_incl/fmod.hpp | 12 ++ include/gcem_incl/gcd.hpp | 5 + include/gcem_incl/hypot.hpp | 12 ++ include/gcem_incl/incomplete_beta.hpp | 5 + include/gcem_incl/incomplete_beta_inv.hpp | 5 + include/gcem_incl/incomplete_gamma.hpp | 5 + include/gcem_incl/incomplete_gamma_inv.hpp | 5 + include/gcem_incl/inv_sqrt.hpp | 5 + include/gcem_incl/is_even.hpp | 5 + include/gcem_incl/is_finite.hpp | 5 + include/gcem_incl/is_inf.hpp | 5 + include/gcem_incl/is_nan.hpp | 5 + include/gcem_incl/is_odd.hpp | 5 + include/gcem_incl/lbeta.hpp | 5 + include/gcem_incl/lcm.hpp | 5 + include/gcem_incl/lgamma.hpp | 12 ++ include/gcem_incl/lmgamma.hpp | 5 + include/gcem_incl/log.hpp | 12 ++ include/gcem_incl/log10.hpp | 12 ++ include/gcem_incl/log1p.hpp | 12 ++ include/gcem_incl/log2.hpp | 12 ++ include/gcem_incl/log_binomial_coef.hpp | 7 +- include/gcem_incl/mantissa.hpp | 5 + include/gcem_incl/max.hpp | 12 ++ include/gcem_incl/min.hpp | 12 ++ include/gcem_incl/neg_zero.hpp | 5 + include/gcem_incl/pow.hpp | 12 ++ include/gcem_incl/pow_integral.hpp | 5 + .../quadrature/gauss_legendre_30.hpp | 5 + .../quadrature/gauss_legendre_50.hpp | 5 + include/gcem_incl/round.hpp | 12 ++ include/gcem_incl/sgn.hpp | 5 + include/gcem_incl/signbit.hpp | 12 ++ include/gcem_incl/sin.hpp | 12 ++ include/gcem_incl/sinh.hpp | 12 ++ include/gcem_incl/sqrt.hpp | 12 ++ include/gcem_incl/tan.hpp | 12 ++ include/gcem_incl/tanh.hpp | 12 ++ include/gcem_incl/tgamma.hpp | 12 ++ include/gcem_incl/trunc.hpp | 12 ++ 64 files changed, 645 insertions(+), 79 deletions(-) diff --git a/include/gcem.hpp b/include/gcem.hpp index 650d05d894786b123aefbc6d88c93604164d56d2..8ea7b2a279ecf4dcf684a39ee7e96db84e61a421 100644 --- a/include/gcem.hpp +++ b/include/gcem.hpp @@ -23,82 +23,79 @@ #include "gcem_incl/gcem_options.hpp" -namespace gcem -{ - #include "gcem_incl/quadrature/gauss_legendre_50.hpp" - - #include "gcem_incl/is_inf.hpp" - #include "gcem_incl/is_nan.hpp" - #include "gcem_incl/is_finite.hpp" - - #include "gcem_incl/signbit.hpp" - #include "gcem_incl/copysign.hpp" - #include "gcem_incl/neg_zero.hpp" - #include "gcem_incl/sgn.hpp" - - #include "gcem_incl/abs.hpp" - #include "gcem_incl/ceil.hpp" - #include "gcem_incl/floor.hpp" - #include "gcem_incl/trunc.hpp" - #include "gcem_incl/is_odd.hpp" - #include "gcem_incl/is_even.hpp" - #include "gcem_incl/max.hpp" - #include "gcem_incl/min.hpp" - #include "gcem_incl/sqrt.hpp" - #include "gcem_incl/inv_sqrt.hpp" - #include "gcem_incl/hypot.hpp" - - #include "gcem_incl/find_exponent.hpp" - #include "gcem_incl/find_fraction.hpp" - #include "gcem_incl/find_whole.hpp" - #include "gcem_incl/mantissa.hpp" - #include "gcem_incl/round.hpp" - #include "gcem_incl/fmod.hpp" - - #include "gcem_incl/pow_integral.hpp" - #include "gcem_incl/exp.hpp" - #include "gcem_incl/expm1.hpp" - #include "gcem_incl/log.hpp" - #include "gcem_incl/log1p.hpp" - #include "gcem_incl/log2.hpp" - #include "gcem_incl/log10.hpp" - #include "gcem_incl/pow.hpp" - - #include "gcem_incl/gcd.hpp" - #include "gcem_incl/lcm.hpp" - - #include "gcem_incl/tan.hpp" - #include "gcem_incl/cos.hpp" - #include "gcem_incl/sin.hpp" - - #include "gcem_incl/atan.hpp" - #include "gcem_incl/atan2.hpp" - #include "gcem_incl/acos.hpp" - #include "gcem_incl/asin.hpp" - - #include "gcem_incl/tanh.hpp" - #include "gcem_incl/cosh.hpp" - #include "gcem_incl/sinh.hpp" - - #include "gcem_incl/atanh.hpp" - #include "gcem_incl/acosh.hpp" - #include "gcem_incl/asinh.hpp" - - #include "gcem_incl/binomial_coef.hpp" - #include "gcem_incl/lgamma.hpp" - #include "gcem_incl/tgamma.hpp" - #include "gcem_incl/factorial.hpp" - #include "gcem_incl/lbeta.hpp" - #include "gcem_incl/beta.hpp" - #include "gcem_incl/lmgamma.hpp" - #include "gcem_incl/log_binomial_coef.hpp" - - #include "gcem_incl/erf.hpp" - #include "gcem_incl/erf_inv.hpp" - #include "gcem_incl/incomplete_beta.hpp" - #include "gcem_incl/incomplete_beta_inv.hpp" - #include "gcem_incl/incomplete_gamma.hpp" - #include "gcem_incl/incomplete_gamma_inv.hpp" -} +#include "gcem_incl/quadrature/gauss_legendre_50.hpp" + +#include "gcem_incl/is_inf.hpp" +#include "gcem_incl/is_nan.hpp" +#include "gcem_incl/is_finite.hpp" + +#include "gcem_incl/signbit.hpp" +#include "gcem_incl/copysign.hpp" +#include "gcem_incl/neg_zero.hpp" +#include "gcem_incl/sgn.hpp" + +#include "gcem_incl/abs.hpp" +#include "gcem_incl/ceil.hpp" +#include "gcem_incl/floor.hpp" +#include "gcem_incl/trunc.hpp" +#include "gcem_incl/is_odd.hpp" +#include "gcem_incl/is_even.hpp" +#include "gcem_incl/max.hpp" +#include "gcem_incl/min.hpp" +#include "gcem_incl/sqrt.hpp" +#include "gcem_incl/inv_sqrt.hpp" +#include "gcem_incl/hypot.hpp" + +#include "gcem_incl/find_exponent.hpp" +#include "gcem_incl/find_fraction.hpp" +#include "gcem_incl/find_whole.hpp" +#include "gcem_incl/mantissa.hpp" +#include "gcem_incl/round.hpp" +#include "gcem_incl/fmod.hpp" + +#include "gcem_incl/pow_integral.hpp" +#include "gcem_incl/exp.hpp" +#include "gcem_incl/expm1.hpp" +#include "gcem_incl/log.hpp" +#include "gcem_incl/log1p.hpp" +#include "gcem_incl/log2.hpp" +#include "gcem_incl/log10.hpp" +#include "gcem_incl/pow.hpp" + +#include "gcem_incl/gcd.hpp" +#include "gcem_incl/lcm.hpp" + +#include "gcem_incl/tan.hpp" +#include "gcem_incl/cos.hpp" +#include "gcem_incl/sin.hpp" + +#include "gcem_incl/atan.hpp" +#include "gcem_incl/atan2.hpp" +#include "gcem_incl/acos.hpp" +#include "gcem_incl/asin.hpp" + +#include "gcem_incl/tanh.hpp" +#include "gcem_incl/cosh.hpp" +#include "gcem_incl/sinh.hpp" + +#include "gcem_incl/atanh.hpp" +#include "gcem_incl/acosh.hpp" +#include "gcem_incl/asinh.hpp" + +#include "gcem_incl/binomial_coef.hpp" +#include "gcem_incl/lgamma.hpp" +#include "gcem_incl/tgamma.hpp" +#include "gcem_incl/factorial.hpp" +#include "gcem_incl/lbeta.hpp" +#include "gcem_incl/beta.hpp" +#include "gcem_incl/lmgamma.hpp" +#include "gcem_incl/log_binomial_coef.hpp" + +#include "gcem_incl/erf.hpp" +#include "gcem_incl/erf_inv.hpp" +#include "gcem_incl/incomplete_beta.hpp" +#include "gcem_incl/incomplete_beta_inv.hpp" +#include "gcem_incl/incomplete_gamma.hpp" +#include "gcem_incl/incomplete_gamma_inv.hpp" #endif diff --git a/include/gcem_incl/abs.hpp b/include/gcem_incl/abs.hpp index 6d7b66d91bc9f4d0c05fd0c3dd1571b552d8a19a..8e8330b198a206ea4f422d6782c66fe92bdd6522 100644 --- a/include/gcem_incl/abs.hpp +++ b/include/gcem_incl/abs.hpp @@ -21,6 +21,12 @@ #ifndef _gcem_abs_HPP #define _gcem_abs_HPP +#include +#include + +namespace gcem +{ + /** * Compile-time absolute value function * @@ -34,12 +40,18 @@ T abs(const T x) noexcept { + if (std::is_constant_evaluated()) { return( // deal with signed-zeros x == T(0) ? \ T(0) : // else x < T(0) ? \ - x : x ); + } else { + return std::abs(x); + } +} + } #endif diff --git a/include/gcem_incl/acos.hpp b/include/gcem_incl/acos.hpp index a47003d61d8ab2fb7dd0226410e1457809a73458..2e24d2acb61b5a5b647e707950cded8850b0ea66 100644 --- a/include/gcem_incl/acos.hpp +++ b/include/gcem_incl/acos.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_acos_HPP #define _gcem_acos_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -78,7 +84,13 @@ return_t acos(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::acos_check( static_cast>(x) ); + } else { + return std::acos(x); + } +} + } #endif diff --git a/include/gcem_incl/acosh.hpp b/include/gcem_incl/acosh.hpp index 8767200778168aeb409f16945b2ceac75b69158d..778c36cad6ebd849696aaa68d2697a5145a410a3 100644 --- a/include/gcem_incl/acosh.hpp +++ b/include/gcem_incl/acosh.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_acosh_HPP #define _gcem_acosh_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -62,7 +68,13 @@ return_t acosh(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::acosh_compute( static_cast>(x) ); + } else { + return std::acosh(x); + } +} + } #endif diff --git a/include/gcem_incl/asin.hpp b/include/gcem_incl/asin.hpp index 6a79e87df435c7e60b140b7c7133b22deea7fd73..39784aa10eb07ea9328ab819a1f396dd036719b4 100644 --- a/include/gcem_incl/asin.hpp +++ b/include/gcem_incl/asin.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_asin_HPP #define _gcem_asin_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -76,7 +82,13 @@ return_t asin(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::asin_check( static_cast>(x) ); + } else { + return std::asin(x); + } +} + } #endif diff --git a/include/gcem_incl/asinh.hpp b/include/gcem_incl/asinh.hpp index a5f3ff62a0208d350f4027d736ce3fc035c16ded..0a5969369a7a7856e41de1d891d571d5dd3c481f 100644 --- a/include/gcem_incl/asinh.hpp +++ b/include/gcem_incl/asinh.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_asinh_HPP #define _gcem_asinh_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -59,8 +65,13 @@ return_t asinh(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::asinh_compute( static_cast>(x) ); + } else { + return std::asinh(x); + } } +} #endif diff --git a/include/gcem_incl/atan.hpp b/include/gcem_incl/atan.hpp index 3f46974c07920fca6396e42e93261d8167a27eb1..19b9d4e10d75b067527133060d3b07719f6cfb4c 100644 --- a/include/gcem_incl/atan.hpp +++ b/include/gcem_incl/atan.hpp @@ -29,6 +29,12 @@ #ifndef _gcem_atan_HPP #define _gcem_atan_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -149,7 +155,13 @@ return_t atan(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::atan_check( static_cast>(x) ); + } else { + return std::atan(x); + } +} + } #endif diff --git a/include/gcem_incl/atan2.hpp b/include/gcem_incl/atan2.hpp index 5ca55b79c8e11569511fb6d4842c74be50c70c67..07a02cf4a2e134705b514a1031d1d7f47294bdf1 100644 --- a/include/gcem_incl/atan2.hpp +++ b/include/gcem_incl/atan2.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_atan2_HPP #define _gcem_atan2_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -82,7 +88,13 @@ common_return_t atan2(const T1 y, const T2 x) noexcept { + if (std::is_constant_evaluated()) { return internal::atan2_type_check(x,y); + } else { + return std::atan2(y, x); + } +} + } #endif diff --git a/include/gcem_incl/atanh.hpp b/include/gcem_incl/atanh.hpp index dfb4dc312d479e2c6dd837d2391bc658e3b678ed..5c4475bead1034c1b5b1583ad3050a85d380d629 100644 --- a/include/gcem_incl/atanh.hpp +++ b/include/gcem_incl/atanh.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_atanh_HPP #define _gcem_atanh_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -73,7 +79,13 @@ return_t atanh(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::atanh_check( static_cast>(x) ); + } else { + return std::atanh(x); + } +} + } #endif diff --git a/include/gcem_incl/beta.hpp b/include/gcem_incl/beta.hpp index e43d4fcd9a10e37e16652351ec7092cb7200f808..3439af1b57e0135eb1c53a15d14dbbbfbe57bc13 100644 --- a/include/gcem_incl/beta.hpp +++ b/include/gcem_incl/beta.hpp @@ -21,6 +21,12 @@ #ifndef _gcem_beta_HPP #define _gcem_beta_HPP +#include +#include + +namespace gcem +{ + /** * Compile-time beta function * @@ -36,7 +42,17 @@ common_return_t beta(const T1 a, const T2 b) noexcept { + if (std::is_constant_evaluated()) { + return exp( lbeta(a,b) ); + } else { +#ifdef __cpp_lib_math_special_functions + return std::beta(a, b); +#else return exp( lbeta(a,b) ); +#endif + } +} + } #endif diff --git a/include/gcem_incl/binomial_coef.hpp b/include/gcem_incl/binomial_coef.hpp index 0fc17f384d708b4bd81905d49b20f8037c4701ae..a1f764b97b78cbaf8fb66117dab374dc55f04d49 100644 --- a/include/gcem_incl/binomial_coef.hpp +++ b/include/gcem_incl/binomial_coef.hpp @@ -21,6 +21,9 @@ #ifndef _gcem_binomial_coef_HPP #define _gcem_binomial_coef_HPP +namespace gcem +{ + namespace internal { @@ -88,4 +91,6 @@ noexcept return internal::binomial_coef_type_check(n,k); } -#endif \ No newline at end of file +} + +#endif diff --git a/include/gcem_incl/ceil.hpp b/include/gcem_incl/ceil.hpp index ff1097bac2f53c3f6a4b3d4bfc612e0fcd34a63b..2611e6560bfefc4efe782849c88d74bc3ebf9d76 100644 --- a/include/gcem_incl/ceil.hpp +++ b/include/gcem_incl/ceil.hpp @@ -21,6 +21,12 @@ #ifndef _gcem_ceil_HPP #define _gcem_ceil_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -124,7 +130,13 @@ return_t ceil(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::ceil_check( static_cast>(x) ); + } else { + return std::ceil(x); + } +} + } #endif diff --git a/include/gcem_incl/copysign.hpp b/include/gcem_incl/copysign.hpp index c1741f7f321110ff3cf52cb9035d5f2dca5f0ffc..d1181995c7d0fd92668c766f7fd9288c17312159 100644 --- a/include/gcem_incl/copysign.hpp +++ b/include/gcem_incl/copysign.hpp @@ -21,6 +21,12 @@ #ifndef _gcem_copysign_HPP #define _gcem_copysign_HPP +#include +#include + +namespace gcem +{ + /** * Compile-time copy sign function * @@ -35,7 +41,13 @@ T1 copysign(const T1 x, const T2 y) noexcept { + if (std::is_constant_evaluated()) { return( signbit(x) != signbit(y) ? -x : x ); + } else { + return std::copysign(x, y); + } +} + } #endif diff --git a/include/gcem_incl/cos.hpp b/include/gcem_incl/cos.hpp index 82f4c609f5268d19771e281987ed1653e81ef173..be73b55e3f2023538d33eedc78c9ed3e93014384 100644 --- a/include/gcem_incl/cos.hpp +++ b/include/gcem_incl/cos.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_cos_HPP #define _gcem_cos_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -77,7 +83,13 @@ return_t cos(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::cos_check( static_cast>(x) ); + } else { + return std::cos(x); + } +} + } #endif diff --git a/include/gcem_incl/cosh.hpp b/include/gcem_incl/cosh.hpp index fc89c0d06482a687442998da511eb1e7b17f95d5..53e5bb12641b4f13d43aee7a77c0d02bf845688a 100644 --- a/include/gcem_incl/cosh.hpp +++ b/include/gcem_incl/cosh.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_cosh_HPP #define _gcem_cosh_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -59,7 +65,13 @@ return_t cosh(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::cosh_compute( static_cast>(x) ); + } else { + return std::cosh(x); + } +} + } #endif diff --git a/include/gcem_incl/erf.hpp b/include/gcem_incl/erf.hpp index d0bc83ada14af7a4b50262541c8558016823303a..319669d7f0d0bfd0cd91e3bd94e9bbd0c92c66ea 100644 --- a/include/gcem_incl/erf.hpp +++ b/include/gcem_incl/erf.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_erf_HPP #define _gcem_erf_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -137,7 +143,13 @@ return_t erf(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::erf_check( static_cast>(x) ); + } else { + return std::erf(x); + } +} + } #endif diff --git a/include/gcem_incl/erf_inv.hpp b/include/gcem_incl/erf_inv.hpp index 412d686be268dd7668ca517e10e5e4be4263f0d7..c4f0d9d5abb46172fda7c6702bc31561f5680a37 100644 --- a/include/gcem_incl/erf_inv.hpp +++ b/include/gcem_incl/erf_inv.hpp @@ -28,6 +28,9 @@ #ifndef _gcem_erf_inv_HPP #define _gcem_erf_inv_HPP +namespace gcem +{ + namespace internal { @@ -260,5 +263,6 @@ noexcept return internal::erf_inv_begin( static_cast>(p) ); } +} #endif diff --git a/include/gcem_incl/exp.hpp b/include/gcem_incl/exp.hpp index 595ffc2a6202d763560fd879f27fcef32c6b2d64..1708542df5153aeb6c2366078f32660ea002d51c 100644 --- a/include/gcem_incl/exp.hpp +++ b/include/gcem_incl/exp.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_exp_HPP #define _gcem_exp_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -124,7 +130,13 @@ return_t exp(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::exp_check( static_cast>(x) ); + } else { + return std::exp(x); + } +} + } #endif diff --git a/include/gcem_incl/expm1.hpp b/include/gcem_incl/expm1.hpp index 70c9ecf5a4a241bfef617e6e4ee0000a80978355..6adddc929aff7c87395a6b78070c65646ad61f2f 100644 --- a/include/gcem_incl/expm1.hpp +++ b/include/gcem_incl/expm1.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_expm1_HPP #define _gcem_expm1_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -70,7 +76,13 @@ return_t expm1(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::expm1_check( static_cast>(x) ); + } else { + return std::expm1(x); + } +} + } #endif diff --git a/include/gcem_incl/factorial.hpp b/include/gcem_incl/factorial.hpp index ffb9c824751a572c0982e11b9cddbe40cb567a3f..977e6970e4479ab39e65affbdd400827d29e7809 100644 --- a/include/gcem_incl/factorial.hpp +++ b/include/gcem_incl/factorial.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_factorial_HPP #define _gcem_factorial_HPP +namespace gcem +{ + namespace internal { @@ -95,4 +98,6 @@ noexcept return internal::factorial_recur(x); } +} + #endif diff --git a/include/gcem_incl/find_exponent.hpp b/include/gcem_incl/find_exponent.hpp index 200e4e9be1558a61ed608be290bde5a6921363ea..4ffbcf294e61aa847d3e769e50ad9c3eddd8927a 100644 --- a/include/gcem_incl/find_exponent.hpp +++ b/include/gcem_incl/find_exponent.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_find_exponent_HPP #define _gcem_find_exponent_HPP +namespace gcem +{ + namespace internal { @@ -54,4 +57,6 @@ noexcept } +} + #endif diff --git a/include/gcem_incl/find_fraction.hpp b/include/gcem_incl/find_fraction.hpp index 5ed3d269ab54b3c90b3d681b76e8420e89e4527f..76893135383e5f6f5993d335c7b232114fdd90e3 100644 --- a/include/gcem_incl/find_fraction.hpp +++ b/include/gcem_incl/find_fraction.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_find_fraction_HPP #define _gcem_find_fraction_HPP +namespace gcem +{ + namespace internal { @@ -43,4 +46,6 @@ noexcept } +} + #endif diff --git a/include/gcem_incl/find_whole.hpp b/include/gcem_incl/find_whole.hpp index d19363219871803f8cfeafadb0a88189d2f98f0e..561050e91f9e43faf4d80fd08b7e63537b622422 100644 --- a/include/gcem_incl/find_whole.hpp +++ b/include/gcem_incl/find_whole.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_find_whole_HPP #define _gcem_find_whole_HPP +namespace gcem +{ + namespace internal { @@ -43,4 +46,6 @@ noexcept } +} + #endif diff --git a/include/gcem_incl/floor.hpp b/include/gcem_incl/floor.hpp index 8b260ff8a10fb8b9d048307c7d9b18a7e91900c1..3b3b86a12aa49e1c51957d170744a65690aeefdc 100644 --- a/include/gcem_incl/floor.hpp +++ b/include/gcem_incl/floor.hpp @@ -21,6 +21,12 @@ #ifndef _gcem_floor_HPP #define _gcem_floor_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -124,7 +130,13 @@ return_t floor(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::floor_check( static_cast>(x) ); + } else { + return std::floor(x); + } +} + } #endif diff --git a/include/gcem_incl/fmod.hpp b/include/gcem_incl/fmod.hpp index 02459efd4b3a016939a306c9fd1a7ead12ff123b..58c454455edf132c078779ec15e254c96228b514 100644 --- a/include/gcem_incl/fmod.hpp +++ b/include/gcem_incl/fmod.hpp @@ -21,6 +21,12 @@ #ifndef _gcem_fmod_HPP #define _gcem_fmod_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -64,7 +70,13 @@ common_return_t fmod(const T1 x, const T2 y) noexcept { + if (std::is_constant_evaluated()) { return internal::fmod_type_check(x,y); + } else { + return std::fmod(x, y); + } +} + } #endif diff --git a/include/gcem_incl/gcd.hpp b/include/gcem_incl/gcd.hpp index 1e277fbab61a06a20758f55d2c71ca57037f9d57..c5b14a22aafe7738dd14d120cab4dc6b31a5ad91 100644 --- a/include/gcem_incl/gcd.hpp +++ b/include/gcem_incl/gcd.hpp @@ -21,6 +21,9 @@ #ifndef _gcem_gcd_HPP #define _gcem_gcd_HPP +namespace gcem +{ + namespace internal { @@ -79,4 +82,6 @@ noexcept return internal::gcd_type_check(a,b); } +} + #endif diff --git a/include/gcem_incl/hypot.hpp b/include/gcem_incl/hypot.hpp index 01ad4e9212547c649113e50954a73ee9f7394334..00e10f899ace8f0da925fa9e46fa3f79f7e83aa0 100644 --- a/include/gcem_incl/hypot.hpp +++ b/include/gcem_incl/hypot.hpp @@ -27,6 +27,12 @@ #ifndef _gcem_hypot_HPP #define _gcem_hypot_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -84,7 +90,13 @@ common_return_t hypot(const T1 x, const T2 y) noexcept { + if (std::is_constant_evaluated()) { return internal::hypot_type_check(x,y); + } else { + return std::hypot(x, y); + } +} + } #endif diff --git a/include/gcem_incl/incomplete_beta.hpp b/include/gcem_incl/incomplete_beta.hpp index dbb9f60341b09102b137de2b9ded75280a315d57..681cc59953f0f2b1bd3603216286edce06ce46cc 100644 --- a/include/gcem_incl/incomplete_beta.hpp +++ b/include/gcem_incl/incomplete_beta.hpp @@ -27,6 +27,9 @@ #ifndef _gcem_incomplete_beta_HPP #define _gcem_incomplete_beta_HPP +namespace gcem +{ + namespace internal { @@ -191,4 +194,6 @@ noexcept return internal::incomplete_beta_type_check(a,b,z); } +} + #endif diff --git a/include/gcem_incl/incomplete_beta_inv.hpp b/include/gcem_incl/incomplete_beta_inv.hpp index 9f575a360427d8b4ba9ebb940c2baf7ee242251c..3878d37db3bbef56e14bc053b9577b4f96c6c63c 100644 --- a/include/gcem_incl/incomplete_beta_inv.hpp +++ b/include/gcem_incl/incomplete_beta_inv.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_incomplete_beta_inv_HPP #define _gcem_incomplete_beta_inv_HPP +namespace gcem +{ + namespace internal { @@ -349,4 +352,6 @@ noexcept return internal::incomplete_beta_inv_type_check(a,b,p); } +} + #endif diff --git a/include/gcem_incl/incomplete_gamma.hpp b/include/gcem_incl/incomplete_gamma.hpp index 9ee4146de0aacffee1f418bd91069c921e0a6a29..0432b7d3c6f75a726847c9d84d52e387df16f618 100644 --- a/include/gcem_incl/incomplete_gamma.hpp +++ b/include/gcem_incl/incomplete_gamma.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_incomplete_gamma_HPP #define _gcem_incomplete_gamma_HPP +namespace gcem +{ + namespace internal { @@ -244,4 +247,6 @@ noexcept return internal::incomplete_gamma_type_check(a,x); } +} + #endif diff --git a/include/gcem_incl/incomplete_gamma_inv.hpp b/include/gcem_incl/incomplete_gamma_inv.hpp index e5976d08fddb5eb83ad40d200c5973d8ce2d6a36..6b1575b89c8e7284aee55882d12f1ee308d0cba3 100644 --- a/include/gcem_incl/incomplete_gamma_inv.hpp +++ b/include/gcem_incl/incomplete_gamma_inv.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_incomplete_gamma_inv_HPP #define _gcem_incomplete_gamma_inv_HPP +namespace gcem +{ + namespace internal { @@ -268,4 +271,6 @@ noexcept return internal::incomplete_gamma_inv_type_check(a,p); } +} + #endif diff --git a/include/gcem_incl/inv_sqrt.hpp b/include/gcem_incl/inv_sqrt.hpp index d0e33fb743b09e7c72506599414f7a4e0e7e5058..466e76fc5e844ba4b3c6be1a6a2a5f20b4e3607f 100644 --- a/include/gcem_incl/inv_sqrt.hpp +++ b/include/gcem_incl/inv_sqrt.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_inv_sqrt_HPP #define _gcem_inv_sqrt_HPP +namespace gcem +{ + namespace internal { @@ -85,4 +88,6 @@ noexcept return internal::inv_sqrt_check( static_cast>(x) ); } +} + #endif diff --git a/include/gcem_incl/is_even.hpp b/include/gcem_incl/is_even.hpp index de0641d85299a77380ba204e5e1d88538106468f..5aff6a3fa634d84b3fad6c831e3bb93797daee37 100644 --- a/include/gcem_incl/is_even.hpp +++ b/include/gcem_incl/is_even.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_is_even_HPP #define _gcem_is_even_HPP +namespace gcem +{ + namespace internal { @@ -38,4 +41,6 @@ noexcept } +} + #endif diff --git a/include/gcem_incl/is_finite.hpp b/include/gcem_incl/is_finite.hpp index b632fa34728ea66b595be68d48185474c3fe775e..805cbc4ab6708a51c95186801a1b0b02e0083e92 100644 --- a/include/gcem_incl/is_finite.hpp +++ b/include/gcem_incl/is_finite.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_is_finite_HPP #define _gcem_is_finite_HPP +namespace gcem +{ + namespace internal { @@ -75,4 +78,6 @@ noexcept } +} + #endif diff --git a/include/gcem_incl/is_inf.hpp b/include/gcem_incl/is_inf.hpp index 568614f8efa0e25fad4f87e1b71080849127378d..fdc31de71a3e73fda17216fb29e962c9f8a00958 100644 --- a/include/gcem_incl/is_inf.hpp +++ b/include/gcem_incl/is_inf.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_is_inf_HPP #define _gcem_is_inf_HPP +namespace gcem +{ + namespace internal { @@ -169,4 +172,6 @@ noexcept } +} + #endif diff --git a/include/gcem_incl/is_nan.hpp b/include/gcem_incl/is_nan.hpp index a3fcbc6c7cf6593965bee84b0eda0fc148f8f7ff..74092e6b087e47df45f70c6fcb5e62da53317f29 100644 --- a/include/gcem_incl/is_nan.hpp +++ b/include/gcem_incl/is_nan.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_is_nan_HPP #define _gcem_is_nan_HPP +namespace gcem +{ + namespace internal { @@ -77,4 +80,6 @@ noexcept } +} + #endif diff --git a/include/gcem_incl/is_odd.hpp b/include/gcem_incl/is_odd.hpp index a74a8d34f20da4a060b000b58fe7abd5b53f38b0..a76802f7ffc9b0faecae4f64c981ea76116e7c2a 100644 --- a/include/gcem_incl/is_odd.hpp +++ b/include/gcem_incl/is_odd.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_is_odd_HPP #define _gcem_is_odd_HPP +namespace gcem +{ + namespace internal { @@ -39,4 +42,6 @@ noexcept } +} + #endif diff --git a/include/gcem_incl/lbeta.hpp b/include/gcem_incl/lbeta.hpp index 60c87b4f53ec120121f1755635531dc4cc5ab26c..78f6849e72f56c35896e7e00ed9c3227a98114ba 100644 --- a/include/gcem_incl/lbeta.hpp +++ b/include/gcem_incl/lbeta.hpp @@ -21,6 +21,9 @@ #ifndef _gcem_lbeta_HPP #define _gcem_lbeta_HPP +namespace gcem +{ + /** * Compile-time log-beta function * @@ -39,4 +42,6 @@ noexcept return( (lgamma(a) + lgamma(b)) - lgamma(a+b) ); } +} + #endif diff --git a/include/gcem_incl/lcm.hpp b/include/gcem_incl/lcm.hpp index a7ca7766f8906c1d26c071146aba3543880d8dd9..aa1f3397309a8a4517fed63d954737e043e28d1b 100644 --- a/include/gcem_incl/lcm.hpp +++ b/include/gcem_incl/lcm.hpp @@ -21,6 +21,9 @@ #ifndef _gcem_lcm_HPP #define _gcem_lcm_HPP +namespace gcem +{ + namespace internal { @@ -62,4 +65,6 @@ noexcept return internal::lcm_type_check(a,b); } +} + #endif diff --git a/include/gcem_incl/lgamma.hpp b/include/gcem_incl/lgamma.hpp index 507c6d4c91423b31be55426f494f67b0cb085c9f..e349ee88dba2d23982a6d4485bc33da076c70e22 100644 --- a/include/gcem_incl/lgamma.hpp +++ b/include/gcem_incl/lgamma.hpp @@ -28,6 +28,12 @@ #ifndef _gcem_lgamma_HPP #define _gcem_lgamma_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -129,7 +135,13 @@ return_t lgamma(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::lgamma_check( static_cast>(x) ); + } else { + return std::lgamma(x); + } +} + } #endif diff --git a/include/gcem_incl/lmgamma.hpp b/include/gcem_incl/lmgamma.hpp index 58915dc1e1a2edbbfdea58b57137cd22aaf4b717..b009de18e71c4360b55d0c1d80763f140190706f 100644 --- a/include/gcem_incl/lmgamma.hpp +++ b/include/gcem_incl/lmgamma.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_lmgamma_HPP #define _gcem_lmgamma_HPP +namespace gcem +{ + namespace internal { @@ -70,4 +73,6 @@ noexcept return internal::lmgamma_recur(static_cast>(a),p); } +} + #endif diff --git a/include/gcem_incl/log.hpp b/include/gcem_incl/log.hpp index c2e24b006c2fdd01196b189220f35ca982d8bf9e..15577c8bacca3f4d0036997a2a34603ff56b4b24 100644 --- a/include/gcem_incl/log.hpp +++ b/include/gcem_incl/log.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_log_HPP #define _gcem_log_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -180,7 +186,13 @@ return_t log(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::log_integral_check( x ); + } else { + return std::log(x); + } +} + } #endif diff --git a/include/gcem_incl/log10.hpp b/include/gcem_incl/log10.hpp index cda8894fdd62054f11ec4c3c3e6402c3752e0dd7..0e9a4dbdf58e2ed077e2f682706d98e71d794d67 100644 --- a/include/gcem_incl/log10.hpp +++ b/include/gcem_incl/log10.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_log10_HPP #define _gcem_log10_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -53,7 +59,13 @@ return_t log10(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::log10_check( x ); + } else { + return std::log10(x); + } +} + } #endif diff --git a/include/gcem_incl/log1p.hpp b/include/gcem_incl/log1p.hpp index ccd08b8cb8799f2d4d34d5634dbc2fcabb3fd5b3..ed41daf39ec7e7062dc1da51ef0b0e106b56cf4e 100644 --- a/include/gcem_incl/log1p.hpp +++ b/include/gcem_incl/log1p.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_log1p_HPP #define _gcem_log1p_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -74,7 +80,13 @@ return_t log1p(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::log1p_check( static_cast>(x) ); + } else { + return std::log1p(x); + } +} + } #endif diff --git a/include/gcem_incl/log2.hpp b/include/gcem_incl/log2.hpp index a97fed4c7236f816fa07ac2494f243adbac6742b..f8dc729f4f08348b8cc046468f40cfc84f1c9cb2 100644 --- a/include/gcem_incl/log2.hpp +++ b/include/gcem_incl/log2.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_log2_HPP #define _gcem_log2_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -53,7 +59,13 @@ return_t log2(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::log2_check( x ); + } else { + return std::log2(x); + } +} + } #endif diff --git a/include/gcem_incl/log_binomial_coef.hpp b/include/gcem_incl/log_binomial_coef.hpp index 2bcaadd8bc1c64744eb082955522339d48589aec..c4ba2fa3de9f4f77ac772d24c1432fc93cc51840 100644 --- a/include/gcem_incl/log_binomial_coef.hpp +++ b/include/gcem_incl/log_binomial_coef.hpp @@ -21,6 +21,9 @@ #ifndef _gcem_log_binomial_coef_HPP #define _gcem_log_binomial_coef_HPP +namespace gcem +{ + namespace internal { @@ -62,4 +65,6 @@ noexcept return internal::log_binomial_coef_type_check(n,k); } -#endif \ No newline at end of file +} + +#endif diff --git a/include/gcem_incl/mantissa.hpp b/include/gcem_incl/mantissa.hpp index af23ea21d247327fa224370544e5f4410eac214b..4c95110d627568577440e5e662e72fdeffd95ade 100644 --- a/include/gcem_incl/mantissa.hpp +++ b/include/gcem_incl/mantissa.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_mantissa_HPP #define _gcem_mantissa_HPP +namespace gcem +{ + namespace internal { @@ -44,4 +47,6 @@ noexcept } +} + #endif diff --git a/include/gcem_incl/max.hpp b/include/gcem_incl/max.hpp index ddc3e4e6caff1a781e662a3ded8909cb703729ab..9f3901b4b19eb35331cd22be16c5b3a1ab5f65d6 100644 --- a/include/gcem_incl/max.hpp +++ b/include/gcem_incl/max.hpp @@ -21,6 +21,12 @@ #ifndef _gcem_max_HPP #define _gcem_max_HPP +#include +#include + +namespace gcem +{ + /** * Compile-time pairwise maximum function * @@ -35,7 +41,13 @@ common_t max(const T1 x, const T2 y) noexcept { + if (std::is_constant_evaluated()) { return( y < x ? x : y ); + } else { + return std::max(x, y); + } +} + } #endif diff --git a/include/gcem_incl/min.hpp b/include/gcem_incl/min.hpp index 5ce70b38e6d243267a053ec33fae31e59f6a359f..a35bcf6e2cb65f8712b873d3ef2827aca2d4d0f0 100644 --- a/include/gcem_incl/min.hpp +++ b/include/gcem_incl/min.hpp @@ -21,6 +21,12 @@ #ifndef _gcem_min_HPP #define _gcem_min_HPP +#include +#include + +namespace gcem +{ + /** * Compile-time pairwise minimum function * @@ -35,7 +41,13 @@ common_t min(const T1 x, const T2 y) noexcept { + if (std::is_constant_evaluated()) { return( y > x ? x : y ); + } else { + return std::min(x, y); + } +} + } #endif diff --git a/include/gcem_incl/neg_zero.hpp b/include/gcem_incl/neg_zero.hpp index 79d24a4dd56f4c361774135bc9450c71a9f61627..90923035419d8b7a88ca46c9dcb3294f601312fb 100644 --- a/include/gcem_incl/neg_zero.hpp +++ b/include/gcem_incl/neg_zero.hpp @@ -22,6 +22,9 @@ * extract signbit for signed zeros */ +namespace gcem +{ + namespace internal { @@ -35,3 +38,5 @@ noexcept } } + +} diff --git a/include/gcem_incl/pow.hpp b/include/gcem_incl/pow.hpp index 3891edef0e8f1e7b64e8632f46e87fd39bdba162..372166d40644ec5403d9308b5325a36a78ad2589 100644 --- a/include/gcem_incl/pow.hpp +++ b/include/gcem_incl/pow.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_pow_HPP #define _gcem_pow_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -76,7 +82,13 @@ common_t pow(const T1 base, const T2 exp_term) noexcept { + if (std::is_constant_evaluated()) { return internal::pow_check(base,exp_term); + } else { + return std::pow(base, exp_term); + } +} + } #endif diff --git a/include/gcem_incl/pow_integral.hpp b/include/gcem_incl/pow_integral.hpp index 4e671557071e6377721f3ca721a7b5875f2ffd83..589d16406576bb637963aae33e40aeddf164079a 100644 --- a/include/gcem_incl/pow_integral.hpp +++ b/include/gcem_incl/pow_integral.hpp @@ -25,6 +25,9 @@ #ifndef _gcem_pow_integral_HPP #define _gcem_pow_integral_HPP +namespace gcem +{ + namespace internal { @@ -125,4 +128,6 @@ noexcept } +} + #endif diff --git a/include/gcem_incl/quadrature/gauss_legendre_30.hpp b/include/gcem_incl/quadrature/gauss_legendre_30.hpp index 295f43d9522dcdd7cae358dfc5b6382cfa7bd782..a80d2bb6f9b0dbc9936f3ed3e4f3770b4c307b7d 100644 --- a/include/gcem_incl/quadrature/gauss_legendre_30.hpp +++ b/include/gcem_incl/quadrature/gauss_legendre_30.hpp @@ -22,6 +22,9 @@ * Gauss-Legendre quadrature: 30 points */ +namespace gcem +{ + static const long double gauss_legendre_30_points[30] = \ { -0.05147184255531769583302521316672L, @@ -89,3 +92,5 @@ static const long double gauss_legendre_30_weights[30] = \ 0.00796819249616660561546588347467L, 0.00796819249616660561546588347467L\ }; + +} diff --git a/include/gcem_incl/quadrature/gauss_legendre_50.hpp b/include/gcem_incl/quadrature/gauss_legendre_50.hpp index d4e448c56e923876f2f8627df4caa5d29eb1c501..85244daf1057aa2f07979a19765bcec3865950e2 100644 --- a/include/gcem_incl/quadrature/gauss_legendre_50.hpp +++ b/include/gcem_incl/quadrature/gauss_legendre_50.hpp @@ -22,6 +22,9 @@ * Gauss-Legendre quadrature: 50 points */ +namespace gcem +{ + static const long double gauss_legendre_50_points[50] = \ { -0.03109833832718887611232898966595L, @@ -129,3 +132,5 @@ static const long double gauss_legendre_50_weights[50] = \ 0.00290862255315514095840072434286L, 0.00290862255315514095840072434286L\ }; + +} diff --git a/include/gcem_incl/round.hpp b/include/gcem_incl/round.hpp index 9ac4a09f0a9e7b09a303795d30ccee32ebe841b1..10fae649f89b0320e4f38f87fa8f8ffb41d75b9f 100644 --- a/include/gcem_incl/round.hpp +++ b/include/gcem_incl/round.hpp @@ -21,6 +21,12 @@ #ifndef _gcem_round_HPP #define _gcem_round_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -119,7 +125,13 @@ return_t round(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::round_check( static_cast>(x) ); + } else { + return std::round(x); + } +} + } #endif diff --git a/include/gcem_incl/sgn.hpp b/include/gcem_incl/sgn.hpp index e2eec9e80b57e73396f3cf7f335692d88dcd752b..4c4adfa5a8d9da0e04c55195ec596ce58f63c0a8 100644 --- a/include/gcem_incl/sgn.hpp +++ b/include/gcem_incl/sgn.hpp @@ -21,6 +21,9 @@ #ifndef _gcem_sgn_HPP #define _gcem_sgn_HPP +namespace gcem +{ + /** * Compile-time sign function * @@ -42,4 +45,6 @@ noexcept 0 ); } +} + #endif diff --git a/include/gcem_incl/signbit.hpp b/include/gcem_incl/signbit.hpp index 282e24403345dccfa8bf580112c129b43df5aa6d..40ec1dd157a687112f8258f76ea2ceb62d8ae22f 100644 --- a/include/gcem_incl/signbit.hpp +++ b/include/gcem_incl/signbit.hpp @@ -21,6 +21,12 @@ #ifndef _gcem_signbit_HPP #define _gcem_signbit_HPP +#include +#include + +namespace gcem +{ + /** * Compile-time sign bit detection function * @@ -34,11 +40,17 @@ bool signbit(const T x) noexcept { + if (std::is_constant_evaluated()) { #ifdef _MSC_VER return( (x == T(0)) ? (_fpclass(x) == _FPCLASS_NZ) : (x < T(0)) ); #else return GCEM_SIGNBIT(x); #endif + } else { + return std::signbit(x); + } +} + } #endif diff --git a/include/gcem_incl/sin.hpp b/include/gcem_incl/sin.hpp index 56c8dcaf62dc22207ee7f41ec84d272e4535ab4e..c7c17600db0c8cb862c433183139d1f727fcea8b 100644 --- a/include/gcem_incl/sin.hpp +++ b/include/gcem_incl/sin.hpp @@ -27,6 +27,12 @@ #ifndef _gcem_sin_HPP #define _gcem_sin_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -79,7 +85,13 @@ return_t sin(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::sin_check( static_cast>(x) ); + } else { + return std::sin(x); + } +} + } #endif diff --git a/include/gcem_incl/sinh.hpp b/include/gcem_incl/sinh.hpp index fe3ecdd0e719856c8bcc0e8d692d93c98c496942..9174d5d64a0622b56efac56fbfdc44994f78e78d 100644 --- a/include/gcem_incl/sinh.hpp +++ b/include/gcem_incl/sinh.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_sinh_HPP #define _gcem_sinh_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -59,7 +65,13 @@ return_t sinh(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::sinh_check( static_cast>(x) ); + } else { + return std::sinh(x); + } +} + } #endif diff --git a/include/gcem_incl/sqrt.hpp b/include/gcem_incl/sqrt.hpp index 1b2753c99ede5189fc2272080828c83ca63a184c..201d89fa0df5680ceb53ec3aabb20213b4326325 100644 --- a/include/gcem_incl/sqrt.hpp +++ b/include/gcem_incl/sqrt.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_sqrt_HPP #define _gcem_sqrt_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -103,7 +109,13 @@ return_t sqrt(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::sqrt_check( static_cast>(x) ); + } else { + return std::sqrt(x); + } +} + } #endif diff --git a/include/gcem_incl/tan.hpp b/include/gcem_incl/tan.hpp index 386cce0f412107f65183031b3458455059f55d54..08c12d4ea07ee06d1bd25bfd7cea2c3204a72e6c 100644 --- a/include/gcem_incl/tan.hpp +++ b/include/gcem_incl/tan.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_tan_HPP #define _gcem_tan_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -134,7 +140,13 @@ return_t tan(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::tan_check( static_cast>(x) ); + } else { + return std::tan(x); + } +} + } #endif diff --git a/include/gcem_incl/tanh.hpp b/include/gcem_incl/tanh.hpp index 30b431886601ec9f77ca9a93a6ca62b3cabd9e57..f25dabdb0f075d5597530cb9c1c41d0ba02e3783 100644 --- a/include/gcem_incl/tanh.hpp +++ b/include/gcem_incl/tanh.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_tanh_HPP #define _gcem_tanh_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -83,7 +89,13 @@ return_t tanh(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::tanh_check( static_cast>(x) ); + } else { + return std::tanh(x); + } +} + } #endif diff --git a/include/gcem_incl/tgamma.hpp b/include/gcem_incl/tgamma.hpp index deffd3a8e77c34a9ebfd5209ee32594dc5b241e2..1d9fceecf8f9e062f2f1fa6080091b64cf533849 100644 --- a/include/gcem_incl/tgamma.hpp +++ b/include/gcem_incl/tgamma.hpp @@ -25,6 +25,12 @@ #ifndef _gcem_tgamma_HPP #define _gcem_tgamma_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -74,7 +80,13 @@ return_t tgamma(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::tgamma_check( static_cast>(x) ); + } else { + return std::tgamma(x); + } +} + } #endif diff --git a/include/gcem_incl/trunc.hpp b/include/gcem_incl/trunc.hpp index af3f448915f0f9a1b5f2d843596331f7874a6da5..f7a31ce7271339626127d6ca80dfb936fe53cc03 100644 --- a/include/gcem_incl/trunc.hpp +++ b/include/gcem_incl/trunc.hpp @@ -21,6 +21,12 @@ #ifndef _gcem_trunc_HPP #define _gcem_trunc_HPP +#include +#include + +namespace gcem +{ + namespace internal { @@ -115,7 +121,13 @@ return_t trunc(const T x) noexcept { + if (std::is_constant_evaluated()) { return internal::trunc_check( static_cast>(x) ); + } else { + return std::trunc(x); + } +} + } #endif