2
0
mirror of https://github.com/boostorg/math.git synced 2026-02-22 03:22:28 +00:00

boost::math::pow is not constexpr #354 (#388)

* Made pow constexpr

* Added static_assert to test

* Changed constexpr to BOOST_CXX14_CONSTEXPR
This commit is contained in:
Matt Borland
2020-07-05 12:33:37 -05:00
committed by GitHub
parent 5a7e64a426
commit ceea26d144
3 changed files with 14 additions and 11 deletions

View File

@@ -1019,10 +1019,10 @@ namespace boost
// pow:
template <int N, typename T, class Policy>
typename tools::promote_args<T>::type pow(T base, const Policy& policy);
BOOST_CXX14_CONSTEXPR typename tools::promote_args<T>::type pow(T base, const Policy& policy);
template <int N, typename T>
typename tools::promote_args<T>::type pow(T base);
BOOST_CXX14_CONSTEXPR typename tools::promote_args<T>::type pow(T base);
// next:
template <class T, class U, class Policy>

View File

@@ -35,7 +35,7 @@ template <int N, int M = N%2>
struct positive_power
{
template <typename T>
static T result(T base)
static BOOST_CXX14_CONSTEXPR T result(T base)
{
T power = positive_power<N/2>::result(base);
return power * power;
@@ -46,7 +46,7 @@ template <int N>
struct positive_power<N, 1>
{
template <typename T>
static T result(T base)
static BOOST_CXX14_CONSTEXPR T result(T base)
{
T power = positive_power<N/2>::result(base);
return base * power * power;
@@ -57,7 +57,7 @@ template <>
struct positive_power<1, 1>
{
template <typename T>
static T result(T base){ return base; }
static BOOST_CXX14_CONSTEXPR T result(T base){ return base; }
};
@@ -65,7 +65,7 @@ template <int N, bool>
struct power_if_positive
{
template <typename T, class Policy>
static T result(T base, const Policy&)
static BOOST_CXX14_CONSTEXPR T result(T base, const Policy&)
{ return positive_power<N>::result(base); }
};
@@ -73,7 +73,7 @@ template <int N>
struct power_if_positive<N, false>
{
template <typename T, class Policy>
static T result(T base, const Policy& policy)
static BOOST_CXX14_CONSTEXPR T result(T base, const Policy& policy)
{
if (base == 0)
{
@@ -92,7 +92,7 @@ template <>
struct power_if_positive<0, true>
{
template <typename T, class Policy>
static T result(T base, const Policy& policy)
static BOOST_CXX14_CONSTEXPR T result(T base, const Policy& policy)
{
if (base == 0)
{
@@ -126,15 +126,14 @@ struct select_power_if_positive
template <int N, typename T, class Policy>
inline typename tools::promote_args<T>::type pow(T base, const Policy& policy)
BOOST_CXX14_CONSTEXPR inline typename tools::promote_args<T>::type pow(T base, const Policy& policy)
{
typedef typename tools::promote_args<T>::type result_type;
return detail::select_power_if_positive<N>::type::result(static_cast<result_type>(base), policy);
}
template <int N, typename T>
inline typename tools::promote_args<T>::type pow(T base)
BOOST_CXX14_CONSTEXPR inline typename tools::promote_args<T>::type pow(T base)
{ return pow<N>(base, policies::policy<>()); }
#ifdef BOOST_MSVC