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