12ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Copyright John Maddock 2007. 22ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Use, modification and distribution are subject to the 32ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Boost Software License, Version 1.0. (See accompanying file 42ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 52ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 62ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_POLICY_HPP 72ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_POLICY_HPP 82ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 92ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/list.hpp> 102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/contains.hpp> 112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/if.hpp> 122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/find_if.hpp> 132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/remove_if.hpp> 142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/vector.hpp> 152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/push_back.hpp> 162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/at.hpp> 172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/size.hpp> 182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/comparison.hpp> 192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/type_traits/is_same.hpp> 202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/static_assert.hpp> 212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/assert.hpp> 222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/math/tools/config.hpp> 232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <limits> 242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Sadly we do need the .h versions of these to be sure of getting 252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// FLT_MANT_DIG etc. 262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <limits.h> 272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <stdlib.h> 282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <stddef.h> 292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <math.h> 302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace boost{ namespace math{ 322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace tools{ 342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T> 362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehint digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T)); 372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T> 382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehT epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T)); 392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace policies{ 432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Define macros for our default policies, if they're not defined already: 462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_DOMAIN_ERROR_POLICY 482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_DOMAIN_ERROR_POLICY throw_on_error 492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_POLE_ERROR_POLICY 512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_POLE_ERROR_POLICY throw_on_error 522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_OVERFLOW_ERROR_POLICY 542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_OVERFLOW_ERROR_POLICY throw_on_error 552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_EVALUATION_ERROR_POLICY 572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_EVALUATION_ERROR_POLICY throw_on_error 582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_ROUNDING_ERROR_POLICY 602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_ROUNDING_ERROR_POLICY throw_on_error 612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_UNDERFLOW_ERROR_POLICY 632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_UNDERFLOW_ERROR_POLICY ignore_error 642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_DENORM_ERROR_POLICY 662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_DENORM_ERROR_POLICY ignore_error 672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_INDETERMINATE_RESULT_ERROR_POLICY 692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_INDETERMINATE_RESULT_ERROR_POLICY ignore_error 702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_DIGITS10_POLICY 722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_DIGITS10_POLICY 0 732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_PROMOTE_FLOAT_POLICY 752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_PROMOTE_FLOAT_POLICY true 762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_PROMOTE_DOUBLE_POLICY 782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS 792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_PROMOTE_DOUBLE_POLICY false 802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#else 812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_PROMOTE_DOUBLE_POLICY true 822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_DISCRETE_QUANTILE_POLICY 852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_DISCRETE_QUANTILE_POLICY integer_round_outwards 862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_ASSERT_UNDEFINED_POLICY 882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_ASSERT_UNDEFINED_POLICY true 892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_MAX_SERIES_ITERATION_POLICY 912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_MAX_SERIES_ITERATION_POLICY 1000000 922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MATH_MAX_ROOT_ITERATION_POLICY 942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_MAX_ROOT_ITERATION_POLICY 200 952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if !defined(__BORLANDC__) \ 982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh && !(defined(__GNUC__) && (__GNUC__ == 3) && (__GNUC_MINOR__ <= 2)) 992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_META_INT(type, name, Default)\ 1002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <type N = Default> struct name : public boost::mpl::int_<N>{};\ 1012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh namespace detail{\ 1022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <type N>\ 1032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh char test_is_valid_arg(const name<N>*);\ 1042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh char test_is_default_arg(const name<Default>*);\ 1052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class T> struct is_##name##_imp\ 1062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh {\ 1072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <type N> static char test(const name<N>*);\ 1082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static double test(...);\ 1092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = sizeof(test(static_cast<T*>(0))) == 1);\ 1102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh };\ 1112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }\ 1122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class T> struct is_##name : public boost::mpl::bool_< ::boost::math::policies::detail::is_##name##_imp<T>::value>{}; 1132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_META_BOOL(name, Default)\ 1152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <bool N = Default> struct name : public boost::mpl::bool_<N>{};\ 1162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh namespace detail{\ 1172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <bool N>\ 1182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh char test_is_valid_arg(const name<N>*);\ 1192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh char test_is_default_arg(const name<Default>*);\ 1202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class T> struct is_##name##_imp\ 1212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh {\ 1222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <bool N> static char test(const name<N>*);\ 1232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static double test(...);\ 1242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = sizeof(test(static_cast<T*>(0))) == 1);\ 1252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh };\ 1262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }\ 1272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class T> struct is_##name : public boost::mpl::bool_< ::boost::math::policies::detail::is_##name##_imp<T>::value>{}; 1282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#else 1292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_META_INT(Type, name, Default)\ 1302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <Type N = Default> struct name : public boost::mpl::int_<N>{};\ 1312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh namespace detail{\ 1322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <Type N>\ 1332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh char test_is_valid_arg(const name<N>*);\ 1342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh char test_is_default_arg(const name<Default>*);\ 1352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class T> struct is_##name##_tester\ 1362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh {\ 1372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <Type N> static char test(const name<N>&);\ 1382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static double test(...);\ 1392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh };\ 1402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class T> struct is_##name##_imp\ 1412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh {\ 1422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static T inst;\ 1432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = sizeof( ::boost::math::policies::detail::is_##name##_tester<T>::test(inst)) == 1);\ 1442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh };\ 1452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }\ 1462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class T> struct is_##name : public boost::mpl::bool_< ::boost::math::policies::detail::is_##name##_imp<T>::value>\ 1472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh {\ 1482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class U> struct apply{ typedef is_##name<U> type; };\ 1492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; 1502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_META_BOOL(name, Default)\ 1522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <bool N = Default> struct name : public boost::mpl::bool_<N>{};\ 1532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh namespace detail{\ 1542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <bool N>\ 1552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh char test_is_valid_arg(const name<N>*);\ 1562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh char test_is_default_arg(const name<Default>*);\ 1572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class T> struct is_##name##_tester\ 1582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh {\ 1592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <bool N> static char test(const name<N>&);\ 1602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static double test(...);\ 1612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh };\ 1622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class T> struct is_##name##_imp\ 1632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh {\ 1642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static T inst;\ 1652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = sizeof( ::boost::math::policies::detail::is_##name##_tester<T>::test(inst)) == 1);\ 1662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh };\ 1672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }\ 1682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class T> struct is_##name : public boost::mpl::bool_< ::boost::math::policies::detail::is_##name##_imp<T>::value>\ 1692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh {\ 1702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class U> struct apply{ typedef is_##name<U> type; };\ 1712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; 1722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 1732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 1742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Begin by defining policy types for error handling: 1752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 1762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehenum error_policy_type 1772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 1782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh throw_on_error = 0, 1792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh errno_on_error = 1, 1802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ignore_error = 2, 1812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh user_error = 3 1822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 1832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_INT(error_policy_type, domain_error, BOOST_MATH_DOMAIN_ERROR_POLICY) 1852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_INT(error_policy_type, pole_error, BOOST_MATH_POLE_ERROR_POLICY) 1862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_INT(error_policy_type, overflow_error, BOOST_MATH_OVERFLOW_ERROR_POLICY) 1872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_INT(error_policy_type, underflow_error, BOOST_MATH_UNDERFLOW_ERROR_POLICY) 1882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_INT(error_policy_type, denorm_error, BOOST_MATH_DENORM_ERROR_POLICY) 1892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_INT(error_policy_type, evaluation_error, BOOST_MATH_EVALUATION_ERROR_POLICY) 1902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_INT(error_policy_type, rounding_error, BOOST_MATH_ROUNDING_ERROR_POLICY) 1912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_INT(error_policy_type, indeterminate_result_error, BOOST_MATH_INDETERMINATE_RESULT_ERROR_POLICY) 1922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 1942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Policy types for internal promotion: 1952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 1962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_BOOL(promote_float, BOOST_MATH_PROMOTE_FLOAT_POLICY) 1972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_BOOL(promote_double, BOOST_MATH_PROMOTE_DOUBLE_POLICY) 1982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_BOOL(assert_undefined, BOOST_MATH_ASSERT_UNDEFINED_POLICY) 1992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 2002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Policy types for discrete quantiles: 2012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 2022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehenum discrete_quantile_policy_type 2032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 2042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh real, 2052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh integer_round_outwards, 2062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh integer_round_inwards, 2072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh integer_round_down, 2082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh integer_round_up, 2092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh integer_round_nearest 2102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 2112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_INT(discrete_quantile_policy_type, discrete_quantile, BOOST_MATH_DISCRETE_QUANTILE_POLICY) 2132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 2142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Precision: 2152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 2162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_INT(int, digits10, BOOST_MATH_DIGITS10_POLICY) 2172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_INT(int, digits2, 0) 2182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 2192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Iterations: 2202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 2212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_INT(unsigned long, max_series_iterations, BOOST_MATH_MAX_SERIES_ITERATION_POLICY) 2222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MATH_META_INT(unsigned long, max_root_iterations, BOOST_MATH_MAX_ROOT_ITERATION_POLICY) 2232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 2242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Define the names for each possible policy: 2252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 2262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MATH_PARAMETER(name)\ 2272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PARAMETER_TEMPLATE_KEYWORD(name##_name)\ 2282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PARAMETER_NAME(name##_name) 2292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct default_policy{}; 2312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace detail{ 2332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 2342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Trait to work out bits precision from digits10 and digits2: 2352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 2362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Digits10, class Digits2> 2372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct precision 2382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 2392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 2402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Now work out the precision: 2412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 2422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::if_c< 2432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh (Digits10::value == 0), 2442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh digits2<0>, 2452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh digits2<((Digits10::value + 1) * 1000L) / 301L> 2462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh >::type digits2_type; 2472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic: 2482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifdef __BORLANDC__ 2492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::if_c< 2502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh (Digits2::value > ::boost::math::policies::detail::precision<Digits10,Digits2>::digits2_type::value), 2512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh Digits2, digits2_type>::type type; 2522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#else 2532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::if_c< 2542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh (Digits2::value > digits2_type::value), 2552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh Digits2, digits2_type>::type type; 2562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 2572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 2582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A, class B, bool b> 2602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct select_result 2612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 2622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef A type; 2632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 2642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A, class B> 2652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct select_result<A, B, false> 2662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 2672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::deref<B>::type type; 2682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 2692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Seq, class Pred, class DefaultType> 2712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct find_arg 2722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 2732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprivate: 2742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::find_if<Seq, Pred>::type iter; 2752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::end<Seq>::type end_type; 2762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic: 2772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename select_result< 2782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh DefaultType, iter, 2792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ::boost::is_same<iter, end_type>::value>::type type; 2802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 2812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehdouble test_is_valid_arg(...); 2832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehdouble test_is_default_arg(...); 2842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehchar test_is_valid_arg(const default_policy*); 2852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehchar test_is_default_arg(const default_policy*); 2862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T> 2882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct is_valid_policy_imp 2892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 2902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = sizeof(::boost::math::policies::detail::test_is_valid_arg(static_cast<T*>(0))) == 1); 2912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 2922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T> 2942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct is_default_policy_imp 2952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 2962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = sizeof(::boost::math::policies::detail::test_is_default_arg(static_cast<T*>(0))) == 1); 2972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 2982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T> struct is_valid_policy 3002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh: public mpl::bool_< 3012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ::boost::math::policies::detail::is_valid_policy_imp<T>::value> 3022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{}; 3032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T> struct is_default_policy 3052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh: public mpl::bool_< 3062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ::boost::math::policies::detail::is_default_policy_imp<T>::value> 3072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 3082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class U> 3092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct apply 3102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 3112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef is_default_policy<U> type; 3122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; 3132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 3142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Seq, class T, int N> 3162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct append_N 3172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 3182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::push_back<Seq, T>::type new_seq; 3192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename append_N<new_seq, T, N-1>::type type; 3202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 3212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Seq, class T> 3232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct append_N<Seq, T, 0> 3242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 3252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef Seq type; 3262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 3272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 3292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Traits class to work out what template parameters our default 3302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// policy<> class will have when modified for forwarding: 3312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 3322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <bool f, bool d> 3332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct default_args 3342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 3352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef promote_float<false> arg1; 3362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef promote_double<false> arg2; 3372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 3382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <> 3402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct default_args<false, false> 3412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 3422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef default_policy arg1; 3432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef default_policy arg2; 3442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 3452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <> 3472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct default_args<true, false> 3482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 3492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef promote_float<false> arg1; 3502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef default_policy arg2; 3512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 3522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <> 3542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct default_args<false, true> 3552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 3562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef promote_double<false> arg1; 3572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef default_policy arg2; 3582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 3592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtypedef default_args<BOOST_MATH_PROMOTE_FLOAT_POLICY, BOOST_MATH_PROMOTE_DOUBLE_POLICY>::arg1 forwarding_arg1; 3612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtypedef default_args<BOOST_MATH_PROMOTE_FLOAT_POLICY, BOOST_MATH_PROMOTE_DOUBLE_POLICY>::arg2 forwarding_arg2; 3622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} // detail 3642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 3652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Now define the policy type with enough arguments to handle all 3662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// the policies: 3672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 3682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A1 = default_policy, 3692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A2 = default_policy, 3702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A3 = default_policy, 3712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A4 = default_policy, 3722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A5 = default_policy, 3732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A6 = default_policy, 3742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A7 = default_policy, 3752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A8 = default_policy, 3762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A9 = default_policy, 3772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A10 = default_policy, 3782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A11 = default_policy, 3792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A12 = default_policy, 3802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A13 = default_policy> 3812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct policy 3822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 3832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprivate: 3842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 3852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Validate all our arguments: 3862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 3872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A1>::value); 3882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A2>::value); 3892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A3>::value); 3902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A4>::value); 3912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A5>::value); 3922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A6>::value); 3932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A7>::value); 3942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A8>::value); 3952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A9>::value); 3962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A10>::value); 3972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A11>::value); 3982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A12>::value); 3992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A13>::value); 4002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 4012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Typelist of the arguments: 4022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 4032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef mpl::list<A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13> arg_list; 4042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 4052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic: 4062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_domain_error<mpl::_1>, domain_error<> >::type domain_error_type; 4072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_pole_error<mpl::_1>, pole_error<> >::type pole_error_type; 4082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_overflow_error<mpl::_1>, overflow_error<> >::type overflow_error_type; 4092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_underflow_error<mpl::_1>, underflow_error<> >::type underflow_error_type; 4102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_denorm_error<mpl::_1>, denorm_error<> >::type denorm_error_type; 4112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_evaluation_error<mpl::_1>, evaluation_error<> >::type evaluation_error_type; 4122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_rounding_error<mpl::_1>, rounding_error<> >::type rounding_error_type; 4132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_indeterminate_result_error<mpl::_1>, indeterminate_result_error<> >::type indeterminate_result_error_type; 4142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprivate: 4152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 4162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Now work out the precision: 4172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 4182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_digits10<mpl::_1>, digits10<> >::type digits10_type; 4192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_digits2<mpl::_1>, digits2<> >::type bits_precision_type; 4202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic: 4212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::precision<digits10_type, bits_precision_type>::type precision_type; 4222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 4232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Internal promotion: 4242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 4252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_promote_float<mpl::_1>, promote_float<> >::type promote_float_type; 4262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_promote_double<mpl::_1>, promote_double<> >::type promote_double_type; 4272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 4282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Discrete quantiles: 4292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 4302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_discrete_quantile<mpl::_1>, discrete_quantile<> >::type discrete_quantile_type; 4312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 4322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Mathematically undefined properties: 4332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 4342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_assert_undefined<mpl::_1>, assert_undefined<> >::type assert_undefined_type; 4352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 4362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Max iterations: 4372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 4382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_max_series_iterations<mpl::_1>, max_series_iterations<> >::type max_series_iterations_type; 4392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_max_root_iterations<mpl::_1>, max_root_iterations<> >::type max_root_iterations_type; 4402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 4412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 4422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// These full specializations are defined to reduce the amount of 4432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// template instantiations that have to take place when using the default 4442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// policies, they have quite a large impact on compile times: 4452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 4462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <> 4472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct policy<default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy> 4482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 4492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic: 4502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef domain_error<> domain_error_type; 4512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef pole_error<> pole_error_type; 4522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef overflow_error<> overflow_error_type; 4532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef underflow_error<> underflow_error_type; 4542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef denorm_error<> denorm_error_type; 4552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef evaluation_error<> evaluation_error_type; 4562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef rounding_error<> rounding_error_type; 4572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef indeterminate_result_error<> indeterminate_result_error_type; 4582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if BOOST_MATH_DIGITS10_POLICY == 0 4592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef digits2<> precision_type; 4602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#else 4612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef detail::precision<digits10<>, digits2<> >::type precision_type; 4622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 4632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef promote_float<> promote_float_type; 4642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef promote_double<> promote_double_type; 4652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef discrete_quantile<> discrete_quantile_type; 4662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef assert_undefined<> assert_undefined_type; 4672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef max_series_iterations<> max_series_iterations_type; 4682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef max_root_iterations<> max_root_iterations_type; 4692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 4702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 4712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <> 4722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct policy<detail::forwarding_arg1, detail::forwarding_arg2, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy> 4732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 4742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic: 4752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef domain_error<> domain_error_type; 4762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef pole_error<> pole_error_type; 4772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef overflow_error<> overflow_error_type; 4782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef underflow_error<> underflow_error_type; 4792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef denorm_error<> denorm_error_type; 4802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef evaluation_error<> evaluation_error_type; 4812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef rounding_error<> rounding_error_type; 4822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef indeterminate_result_error<> indeterminate_result_error_type; 4832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if BOOST_MATH_DIGITS10_POLICY == 0 4842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef digits2<> precision_type; 4852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#else 4862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef detail::precision<digits10<>, digits2<> >::type precision_type; 4872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 4882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef promote_float<false> promote_float_type; 4892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef promote_double<false> promote_double_type; 4902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef discrete_quantile<> discrete_quantile_type; 4912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef assert_undefined<> assert_undefined_type; 4922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef max_series_iterations<> max_series_iterations_type; 4932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef max_root_iterations<> max_root_iterations_type; 4942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 4952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 4962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Policy, 4972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A1 = default_policy, 4982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A2 = default_policy, 4992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A3 = default_policy, 5002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A4 = default_policy, 5012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A5 = default_policy, 5022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A6 = default_policy, 5032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A7 = default_policy, 5042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A8 = default_policy, 5052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A9 = default_policy, 5062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A10 = default_policy, 5072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A11 = default_policy, 5082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A12 = default_policy, 5092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A13 = default_policy> 5102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct normalise 5112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 5122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprivate: 5132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef mpl::list<A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13> arg_list; 5142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_domain_error<mpl::_1>, typename Policy::domain_error_type >::type domain_error_type; 5152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_pole_error<mpl::_1>, typename Policy::pole_error_type >::type pole_error_type; 5162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_overflow_error<mpl::_1>, typename Policy::overflow_error_type >::type overflow_error_type; 5172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_underflow_error<mpl::_1>, typename Policy::underflow_error_type >::type underflow_error_type; 5182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_denorm_error<mpl::_1>, typename Policy::denorm_error_type >::type denorm_error_type; 5192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_evaluation_error<mpl::_1>, typename Policy::evaluation_error_type >::type evaluation_error_type; 5202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_rounding_error<mpl::_1>, typename Policy::rounding_error_type >::type rounding_error_type; 5212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_indeterminate_result_error<mpl::_1>, typename Policy::indeterminate_result_error_type >::type indeterminate_result_error_type; 5222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Now work out the precision: 5242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_digits10<mpl::_1>, digits10<> >::type digits10_type; 5262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_digits2<mpl::_1>, typename Policy::precision_type >::type bits_precision_type; 5272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::precision<digits10_type, bits_precision_type>::type precision_type; 5282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Internal promotion: 5302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_promote_float<mpl::_1>, typename Policy::promote_float_type >::type promote_float_type; 5322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_promote_double<mpl::_1>, typename Policy::promote_double_type >::type promote_double_type; 5332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Discrete quantiles: 5352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_discrete_quantile<mpl::_1>, typename Policy::discrete_quantile_type >::type discrete_quantile_type; 5372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Mathematically undefined properties: 5392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_assert_undefined<mpl::_1>, typename Policy::assert_undefined_type >::type assert_undefined_type; 5412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Max iterations: 5432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_max_series_iterations<mpl::_1>, typename Policy::max_series_iterations_type>::type max_series_iterations_type; 5452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::find_arg<arg_list, is_max_root_iterations<mpl::_1>, typename Policy::max_root_iterations_type>::type max_root_iterations_type; 5462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Define a typelist of the policies: 5482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef mpl::vector< 5502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh domain_error_type, 5512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh pole_error_type, 5522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh overflow_error_type, 5532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh underflow_error_type, 5542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh denorm_error_type, 5552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh evaluation_error_type, 5562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh rounding_error_type, 5572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh indeterminate_result_error_type, 5582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh precision_type, 5592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh promote_float_type, 5602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh promote_double_type, 5612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh discrete_quantile_type, 5622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh assert_undefined_type, 5632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh max_series_iterations_type, 5642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh max_root_iterations_type> result_list; 5652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Remove all the policies that are the same as the default: 5672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::remove_if<result_list, detail::is_default_policy<mpl::_> >::type reduced_list; 5692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Pad out the list with defaults: 5712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // 5722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename detail::append_N<reduced_list, default_policy, (14 - ::boost::mpl::size<reduced_list>::value)>::type result_type; 5732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic: 5742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef policy< 5752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::at<result_type, mpl::int_<0> >::type, 5762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::at<result_type, mpl::int_<1> >::type, 5772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::at<result_type, mpl::int_<2> >::type, 5782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::at<result_type, mpl::int_<3> >::type, 5792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::at<result_type, mpl::int_<4> >::type, 5802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::at<result_type, mpl::int_<5> >::type, 5812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::at<result_type, mpl::int_<6> >::type, 5822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::at<result_type, mpl::int_<7> >::type, 5832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::at<result_type, mpl::int_<8> >::type, 5842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::at<result_type, mpl::int_<9> >::type, 5852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::at<result_type, mpl::int_<10> >::type, 5862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::at<result_type, mpl::int_<11> >::type, 5872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::at<result_type, mpl::int_<12> >::type > type; 5882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 5892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 5902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Full specialisation to speed up compilation of the common case: 5912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 5922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <> 5932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct normalise<policy<>, 5942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh promote_float<false>, 5952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh promote_double<false>, 5962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh discrete_quantile<>, 5972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh assert_undefined<>, 5982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy, 5992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy, 6002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy, 6012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy, 6022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy, 6032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy, 6042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy> 6052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 6062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef policy<detail::forwarding_arg1, detail::forwarding_arg2> type; 6072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 6082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <> 6102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct normalise<policy<detail::forwarding_arg1, detail::forwarding_arg2>, 6112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh promote_float<false>, 6122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh promote_double<false>, 6132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh discrete_quantile<>, 6142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh assert_undefined<>, 6152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy, 6162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy, 6172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy, 6182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy, 6192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy, 6202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy, 6212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh default_policy> 6222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 6232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef policy<detail::forwarding_arg1, detail::forwarding_arg2> type; 6242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 6252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline policy<> make_policy() 6272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ return policy<>(); } 6282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A1> 6302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline typename normalise<policy<>, A1>::type make_policy(const A1&) 6312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 6322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename normalise<policy<>, A1>::type result_type; 6332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return result_type(); 6342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 6352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A1, class A2> 6372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline typename normalise<policy<>, A1, A2>::type make_policy(const A1&, const A2&) 6382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 6392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename normalise<policy<>, A1, A2>::type result_type; 6402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return result_type(); 6412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 6422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A1, class A2, class A3> 6442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline typename normalise<policy<>, A1, A2, A3>::type make_policy(const A1&, const A2&, const A3&) 6452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 6462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename normalise<policy<>, A1, A2, A3>::type result_type; 6472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return result_type(); 6482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 6492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A1, class A2, class A3, class A4> 6512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline typename normalise<policy<>, A1, A2, A3, A4>::type make_policy(const A1&, const A2&, const A3&, const A4&) 6522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 6532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename normalise<policy<>, A1, A2, A3, A4>::type result_type; 6542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return result_type(); 6552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 6562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A1, class A2, class A3, class A4, class A5> 6582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline typename normalise<policy<>, A1, A2, A3, A4, A5>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&) 6592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 6602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename normalise<policy<>, A1, A2, A3, A4, A5>::type result_type; 6612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return result_type(); 6622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 6632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A1, class A2, class A3, class A4, class A5, class A6> 6652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&) 6662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 6672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type; 6682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return result_type(); 6692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 6702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A1, class A2, class A3, class A4, class A5, class A6, class A7> 6722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&) 6732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 6742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7>::type result_type; 6752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return result_type(); 6762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 6772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> 6792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&) 6802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 6812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8>::type result_type; 6822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return result_type(); 6832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 6842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> 6862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&, const A9&) 6872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 6882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9>::type result_type; 6892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return result_type(); 6902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 6912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10> 6932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&, const A9&, const A10&) 6942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 6952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>::type result_type; 6962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return result_type(); 6972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 6982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11> 7002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&, const A9&, const A10&, const A11&) 7012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 7022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>::type result_type; 7032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return result_type(); 7042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 7052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 7062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 7072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Traits class to handle internal promotion: 7082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 7092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Real, class Policy> 7102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct evaluation 7112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 7122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef Real type; 7132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 7142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 7152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Policy> 7162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct evaluation<float, Policy> 7172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 7182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::if_<typename Policy::promote_float_type, double, float>::type type; 7192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 7202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 7212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Policy> 7222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct evaluation<double, Policy> 7232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 7242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::if_<typename Policy::promote_double_type, long double, double>::type type; 7252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 7262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 7272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS 7282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 7292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Real> 7302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct basic_digits : public mpl::int_<0>{ }; 7312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <> 7322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct basic_digits<float> : public mpl::int_<FLT_MANT_DIG>{ }; 7332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <> 7342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct basic_digits<double> : public mpl::int_<DBL_MANT_DIG>{ }; 7352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <> 7362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct basic_digits<long double> : public mpl::int_<LDBL_MANT_DIG>{ }; 7372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 7382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Real, class Policy> 7392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct precision 7402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 7412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT( ::std::numeric_limits<Real>::radix == 2); 7422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename Policy::precision_type precision_type; 7432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef basic_digits<Real> digits_t; 7442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::if_< 7452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh mpl::equal_to<digits_t, mpl::int_<0> >, 7462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Possibly unknown precision: 7472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh precision_type, 7482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::if_< 7492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh mpl::or_<mpl::less_equal<digits_t, precision_type>, mpl::less_equal<precision_type, mpl::int_<0> > >, 7502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Default case, full precision for RealType: 7512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh digits2< ::std::numeric_limits<Real>::digits>, 7522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // User customised precision: 7532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh precision_type 7542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh >::type 7552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh >::type type; 7562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 7572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 7582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Policy> 7592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct precision<float, Policy> 7602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 7612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef digits2<FLT_MANT_DIG> type; 7622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 7632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Policy> 7642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct precision<double, Policy> 7652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 7662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef digits2<DBL_MANT_DIG> type; 7672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 7682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Policy> 7692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct precision<long double, Policy> 7702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 7712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef digits2<LDBL_MANT_DIG> type; 7722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 7732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 7742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#else 7752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 7762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Real, class Policy> 7772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct precision 7782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 7792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT((::std::numeric_limits<Real>::radix == 2) || ((::std::numeric_limits<Real>::is_specialized == 0) || (::std::numeric_limits<Real>::digits == 0))); 7802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef __BORLANDC__ 7812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename Policy::precision_type precision_type; 7822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::if_c< 7832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ((::std::numeric_limits<Real>::is_specialized == 0) || (::std::numeric_limits<Real>::digits == 0)), 7842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Possibly unknown precision: 7852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh precision_type, 7862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::if_c< 7872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ((::std::numeric_limits<Real>::digits <= precision_type::value) 7882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh || (Policy::precision_type::value <= 0)), 7892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Default case, full precision for RealType: 7902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh digits2< ::std::numeric_limits<Real>::digits>, 7912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // User customised precision: 7922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh precision_type 7932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh >::type 7942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh >::type type; 7952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#else 7962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename Policy::precision_type precision_type; 7972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef mpl::int_< ::std::numeric_limits<Real>::digits> digits_t; 7982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef mpl::bool_< ::std::numeric_limits<Real>::is_specialized> spec_t; 7992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::if_< 8002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh mpl::or_<mpl::equal_to<spec_t, mpl::false_>, mpl::equal_to<digits_t, mpl::int_<0> > >, 8012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Possibly unknown precision: 8022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh precision_type, 8032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename mpl::if_< 8042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh mpl::or_<mpl::less_equal<digits_t, precision_type>, mpl::less_equal<precision_type, mpl::int_<0> > >, 8052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Default case, full precision for RealType: 8062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh digits2< ::std::numeric_limits<Real>::digits>, 8072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // User customised precision: 8082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh precision_type 8092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh >::type 8102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh >::type type; 8112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 8122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 8132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 8142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 8152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 8162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace detail{ 8172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 8182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T, class Policy> 8192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline int digits_imp(mpl::true_ const&) 8202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 8212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS 8222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized); 8232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#else 8242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_ASSERT(::std::numeric_limits<T>::is_specialized); 8252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 8262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename boost::math::policies::precision<T, Policy>::type p_t; 8272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return p_t::value; 8282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 8292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 8302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T, class Policy> 8312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline int digits_imp(mpl::false_ const&) 8322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 8332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return tools::digits<T>(); 8342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 8352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 8362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} // namespace detail 8372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 8382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T, class Policy> 8392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T)) 8402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 8412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef mpl::bool_< std::numeric_limits<T>::is_specialized > tag_type; 8422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return detail::digits_imp<T, Policy>(tag_type()); 8432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 8442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 8452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Policy> 8462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline unsigned long get_max_series_iterations() 8472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 8482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename Policy::max_series_iterations_type iter_type; 8492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return iter_type::value; 8502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 8512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 8522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Policy> 8532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline unsigned long get_max_root_iterations() 8542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 8552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename Policy::max_root_iterations_type iter_type; 8562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return iter_type::value; 8572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 8582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 8592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace detail{ 8602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 8612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T, class Digits, class Small, class Default> 8622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct series_factor_calc 8632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 8642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static T get() 8652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 8662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return ldexp(T(1.0), 1 - Digits::value); 8672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 8682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 8692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 8702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T, class Digits> 8712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct series_factor_calc<T, Digits, mpl::true_, mpl::true_> 8722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 8732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static T get() 8742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 8752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return boost::math::tools::epsilon<T>(); 8762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 8772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 8782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T, class Digits> 8792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct series_factor_calc<T, Digits, mpl::true_, mpl::false_> 8802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 8812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static T get() 8822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 8832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static const boost::uintmax_t v = static_cast<boost::uintmax_t>(1u) << (Digits::value - 1); 8842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return 1 / static_cast<T>(v); 8852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 8862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 8872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T, class Digits> 8882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct series_factor_calc<T, Digits, mpl::false_, mpl::true_> 8892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 8902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static T get() 8912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 8922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return boost::math::tools::epsilon<T>(); 8932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 8942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 8952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 8962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T, class Policy> 8972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline T get_epsilon_imp(mpl::true_ const&) 8982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 8992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS 9002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized); 9012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::radix == 2); 9022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#else 9032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_ASSERT(::std::numeric_limits<T>::is_specialized); 9042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_ASSERT(::std::numeric_limits<T>::radix == 2); 9052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 9062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename boost::math::policies::precision<T, Policy>::type p_t; 9072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef mpl::bool_<p_t::value <= std::numeric_limits<boost::uintmax_t>::digits> is_small_int; 9082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef mpl::bool_<p_t::value >= std::numeric_limits<T>::digits> is_default_value; 9092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return series_factor_calc<T, p_t, is_small_int, is_default_value>::get(); 9102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 9112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T, class Policy> 9132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline T get_epsilon_imp(mpl::false_ const&) 9142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 9152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return tools::epsilon<T>(); 9162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 9172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} // namespace detail 9192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class T, class Policy> 9212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline T get_epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T)) 9222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 9232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef mpl::bool_< (std::numeric_limits<T>::is_specialized && (std::numeric_limits<T>::radix == 2)) > tag_type; 9242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return detail::get_epsilon_imp<T, Policy>(tag_type()); 9252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 9262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace detail{ 9282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class A1, 9302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A2, 9312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A3, 9322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A4, 9332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A5, 9342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A6, 9352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A7, 9362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A8, 9372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A9, 9382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A10, 9392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class A11> 9402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehchar test_is_policy(const policy<A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11>*); 9412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehdouble test_is_policy(...); 9422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class P> 9442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct is_policy_imp 9452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 9462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = (sizeof(::boost::math::policies::detail::test_is_policy(static_cast<P*>(0))) == 1)); 9472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 9482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 9502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class P> 9522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct is_policy : public mpl::bool_< ::boost::math::policies::detail::is_policy_imp<P>::value> {}; 9532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 9552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Helper traits class for distribution error handling: 9562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 9572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Policy> 9582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct constructor_error_check 9592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 9602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename Policy::domain_error_type domain_error_type; 9612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::if_c< 9622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh (domain_error_type::value == throw_on_error) || (domain_error_type::value == user_error), 9632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh mpl::true_, 9642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh mpl::false_>::type type; 9652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 9662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate <class Policy> 9682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct method_error_check 9692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 9702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename Policy::domain_error_type domain_error_type; 9712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename mpl::if_c< 9722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh (domain_error_type::value == throw_on_error) && (domain_error_type::value != user_error), 9732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh mpl::false_, 9742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh mpl::true_>::type type; 9752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 9762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}}} // namespaces 9782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif // BOOST_MATH_POLICY_HPP 9802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 9822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 983