summaryrefslogtreecommitdiff
path: root/src/third_party/boost-1.60.0/boost/math/special_functions/pow.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/boost-1.60.0/boost/math/special_functions/pow.hpp')
-rw-r--r--src/third_party/boost-1.60.0/boost/math/special_functions/pow.hpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/third_party/boost-1.60.0/boost/math/special_functions/pow.hpp b/src/third_party/boost-1.60.0/boost/math/special_functions/pow.hpp
new file mode 100644
index 00000000000..494f721d058
--- /dev/null
+++ b/src/third_party/boost-1.60.0/boost/math/special_functions/pow.hpp
@@ -0,0 +1,148 @@
+// Boost pow.hpp header file
+// Computes a power with exponent known at compile-time
+
+// (C) Copyright Bruno Lalande 2008.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+
+#ifndef BOOST_MATH_POW_HPP
+#define BOOST_MATH_POW_HPP
+
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/tools/promotion.hpp>
+#include <boost/mpl/greater_equal.hpp>
+
+
+namespace boost {
+namespace math {
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4702) // Unreachable code, only triggered in release mode and /W4
+#endif
+
+namespace detail {
+
+
+template <int N, int M = N%2>
+struct positive_power
+{
+ template <typename T>
+ static T result(T base)
+ {
+ T power = positive_power<N/2>::result(base);
+ return power * power;
+ }
+};
+
+template <int N>
+struct positive_power<N, 1>
+{
+ template <typename T>
+ static T result(T base)
+ {
+ T power = positive_power<N/2>::result(base);
+ return base * power * power;
+ }
+};
+
+template <>
+struct positive_power<1, 1>
+{
+ template <typename T>
+ static T result(T base){ return base; }
+};
+
+
+template <int N, bool>
+struct power_if_positive
+{
+ template <typename T, class Policy>
+ static T result(T base, const Policy&)
+ { return positive_power<N>::result(base); }
+};
+
+template <int N>
+struct power_if_positive<N, false>
+{
+ template <typename T, class Policy>
+ static T result(T base, const Policy& policy)
+ {
+ if (base == 0)
+ {
+ return policies::raise_overflow_error<T>(
+ "boost::math::pow(%1%)",
+ "Attempted to compute a negative power of 0",
+ policy
+ );
+ }
+
+ return T(1) / positive_power<-N>::result(base);
+ }
+};
+
+template <>
+struct power_if_positive<0, true>
+{
+ template <typename T, class Policy>
+ static T result(T base, const Policy& policy)
+ {
+ if (base == 0)
+ {
+ return policies::raise_indeterminate_result_error<T>(
+ "boost::math::pow(%1%)",
+ "The result of pow<0>(%1%) is undetermined",
+ base,
+ T(1),
+ policy
+ );
+ }
+
+ return T(1);
+ }
+};
+
+
+template <int N>
+struct select_power_if_positive
+{
+ typedef typename mpl::greater_equal<
+ mpl::int_<N>,
+ mpl::int_<0>
+ >::type is_positive;
+
+ typedef power_if_positive<N, is_positive::value> type;
+};
+
+
+} // namespace detail
+
+
+template <int N, typename T, class Policy>
+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)
+{ return pow<N>(base, policies::policy<>()); }
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace math
+} // namespace boost
+
+
+#endif