policy.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 870 行 · 第 1/3 页

HPP
870
字号
struct is_default_policy_imp{   BOOST_STATIC_CONSTANT(bool, value = sizeof(test_is_default_arg(static_cast<T*>(0))) == 1);};template <class T> struct is_valid_policy : public mpl::bool_<    ::boost::math::policies::detail::is_valid_policy_imp<T>::value>{};template <class T> struct is_default_policy : public mpl::bool_<    ::boost::math::policies::detail::is_default_policy_imp<T>::value>{   template <class U>   struct apply   {      typedef is_default_policy<U> type;   };};template <class Seq, class T, int N>struct append_N{   typedef typename mpl::push_back<Seq, T>::type new_seq;   typedef typename append_N<new_seq, T, N-1>::type type;};template <class Seq, class T>struct append_N<Seq, T, 0>{   typedef Seq type;};//// Traits class to work out what template parameters our default// policy<> class will have when modified for forwarding://template <bool f, bool d>struct default_args{   typedef promote_float<false> arg1;   typedef promote_double<false> arg2;};template <>struct default_args<false, false>{   typedef default_policy arg1;   typedef default_policy arg2;};template <>struct default_args<true, false>{   typedef promote_float<false> arg1;   typedef default_policy arg2;};template <>struct default_args<false, true>{   typedef promote_double<false> arg1;   typedef default_policy arg2;};typedef default_args<BOOST_MATH_PROMOTE_FLOAT_POLICY, BOOST_MATH_PROMOTE_DOUBLE_POLICY>::arg1 forwarding_arg1;typedef default_args<BOOST_MATH_PROMOTE_FLOAT_POLICY, BOOST_MATH_PROMOTE_DOUBLE_POLICY>::arg2 forwarding_arg2;} // detail//// Now define the policy type with enough arguments to handle all// the policies://template <class A1 = default_policy,           class A2 = default_policy,           class A3 = default_policy,          class A4 = default_policy,          class A5 = default_policy,          class A6 = default_policy,          class A7 = default_policy,          class A8 = default_policy,          class A9 = default_policy,          class A10 = default_policy,          class A11 = default_policy,          class A12 = default_policy,          class A13 = default_policy>struct policy{private:   //   // Validate all our arguments:   //   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A1>::value);   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A2>::value);   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A3>::value);   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A4>::value);   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A5>::value);   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A6>::value);   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A7>::value);   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A8>::value);   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A9>::value);   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A10>::value);   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A11>::value);   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A12>::value);   BOOST_STATIC_ASSERT(::boost::math::policies::detail::is_valid_policy<A13>::value);   //   // Typelist of the arguments:   //   typedef mpl::list<A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13> arg_list;public:   typedef typename detail::find_arg<arg_list, is_domain_error<mpl::_1>, domain_error<> >::type domain_error_type;   typedef typename detail::find_arg<arg_list, is_pole_error<mpl::_1>, pole_error<> >::type pole_error_type;   typedef typename detail::find_arg<arg_list, is_overflow_error<mpl::_1>, overflow_error<> >::type overflow_error_type;   typedef typename detail::find_arg<arg_list, is_underflow_error<mpl::_1>, underflow_error<> >::type underflow_error_type;   typedef typename detail::find_arg<arg_list, is_denorm_error<mpl::_1>, denorm_error<> >::type denorm_error_type;   typedef typename detail::find_arg<arg_list, is_evaluation_error<mpl::_1>, evaluation_error<> >::type evaluation_error_type;   typedef typename detail::find_arg<arg_list, is_rounding_error<mpl::_1>, rounding_error<> >::type rounding_error_type;   typedef typename detail::find_arg<arg_list, is_indeterminate_result_error<mpl::_1>, indeterminate_result_error<> >::type indeterminate_result_error_type;private:   //   // Now work out the precision:   //   typedef typename detail::find_arg<arg_list, is_digits10<mpl::_1>, digits10<> >::type digits10_type;   typedef typename detail::find_arg<arg_list, is_digits2<mpl::_1>, digits2<> >::type bits_precision_type;public:   typedef typename detail::precision<digits10_type, bits_precision_type>::type precision_type;   //   // Internal promotion:   //   typedef typename detail::find_arg<arg_list, is_promote_float<mpl::_1>, promote_float<> >::type promote_float_type;   typedef typename detail::find_arg<arg_list, is_promote_double<mpl::_1>, promote_double<> >::type promote_double_type;   //   // Discrete quantiles:   //   typedef typename detail::find_arg<arg_list, is_discrete_quantile<mpl::_1>, discrete_quantile<> >::type discrete_quantile_type;   //   // Mathematically undefined properties:   //   typedef typename detail::find_arg<arg_list, is_assert_undefined<mpl::_1>, discrete_quantile<> >::type assert_undefined_type;   //   // Max iterations:   //   typedef typename detail::find_arg<arg_list, is_max_series_iterations<mpl::_1>, max_series_iterations<> >::type max_series_iterations_type;   typedef typename detail::find_arg<arg_list, is_max_root_iterations<mpl::_1>, max_root_iterations<> >::type max_root_iterations_type;};//// These full specializations are defined to reduce the amount of// template instantiations that have to take place when using the default// policies, they have quite a large impact on compile times://template <>struct policy<default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy, default_policy>{public:   typedef domain_error<> domain_error_type;   typedef pole_error<> pole_error_type;   typedef overflow_error<> overflow_error_type;   typedef underflow_error<> underflow_error_type;   typedef denorm_error<> denorm_error_type;   typedef evaluation_error<> evaluation_error_type;   typedef rounding_error<> rounding_error_type;   typedef indeterminate_result_error<> indeterminate_result_error_type;#if BOOST_MATH_DIGITS10_POLICY == 0   typedef digits2<> precision_type;#else   typedef detail::precision<digits10<>, digits2<> >::type precision_type;#endif   typedef promote_float<> promote_float_type;   typedef promote_double<> promote_double_type;   typedef discrete_quantile<> discrete_quantile_type;   typedef assert_undefined<> assert_undefined_type;   typedef max_series_iterations<> max_series_iterations_type;   typedef max_root_iterations<> max_root_iterations_type;};template <>struct 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>{public:   typedef domain_error<> domain_error_type;   typedef pole_error<> pole_error_type;   typedef overflow_error<> overflow_error_type;   typedef underflow_error<> underflow_error_type;   typedef denorm_error<> denorm_error_type;   typedef evaluation_error<> evaluation_error_type;   typedef rounding_error<> rounding_error_type;   typedef indeterminate_result_error<> indeterminate_result_error_type;#if BOOST_MATH_DIGITS10_POLICY == 0   typedef digits2<> precision_type;#else   typedef detail::precision<digits10<>, digits2<> >::type precision_type;#endif   typedef promote_float<false> promote_float_type;   typedef promote_double<false> promote_double_type;   typedef discrete_quantile<> discrete_quantile_type;   typedef assert_undefined<> assert_undefined_type;   typedef max_series_iterations<> max_series_iterations_type;   typedef max_root_iterations<> max_root_iterations_type;};template <class Policy,           class A1 = default_policy,           class A2 = default_policy,           class A3 = default_policy,          class A4 = default_policy,          class A5 = default_policy,          class A6 = default_policy,          class A7 = default_policy,          class A8 = default_policy,          class A9 = default_policy,          class A10 = default_policy,          class A11 = default_policy,          class A12 = default_policy,          class A13 = default_policy>struct normalise{private:   typedef mpl::list<A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13> arg_list;   typedef typename detail::find_arg<arg_list, is_domain_error<mpl::_1>, typename Policy::domain_error_type >::type domain_error_type;   typedef typename detail::find_arg<arg_list, is_pole_error<mpl::_1>, typename Policy::pole_error_type >::type pole_error_type;   typedef typename detail::find_arg<arg_list, is_overflow_error<mpl::_1>, typename Policy::overflow_error_type >::type overflow_error_type;   typedef typename detail::find_arg<arg_list, is_underflow_error<mpl::_1>, typename Policy::underflow_error_type >::type underflow_error_type;   typedef typename detail::find_arg<arg_list, is_denorm_error<mpl::_1>, typename Policy::denorm_error_type >::type denorm_error_type;   typedef typename detail::find_arg<arg_list, is_evaluation_error<mpl::_1>, typename Policy::evaluation_error_type >::type evaluation_error_type;   typedef typename detail::find_arg<arg_list, is_rounding_error<mpl::_1>, typename Policy::rounding_error_type >::type rounding_error_type;   typedef typename detail::find_arg<arg_list, is_indeterminate_result_error<mpl::_1>, typename Policy::indeterminate_result_error_type >::type indeterminate_result_error_type;   //   // Now work out the precision:   //   typedef typename detail::find_arg<arg_list, is_digits10<mpl::_1>, digits10<> >::type digits10_type;   typedef typename detail::find_arg<arg_list, is_digits2<mpl::_1>, typename Policy::precision_type >::type bits_precision_type;   typedef typename detail::precision<digits10_type, bits_precision_type>::type precision_type;   //   // Internal promotion:   //   typedef typename detail::find_arg<arg_list, is_promote_float<mpl::_1>, typename Policy::promote_float_type >::type promote_float_type;   typedef typename detail::find_arg<arg_list, is_promote_double<mpl::_1>, typename Policy::promote_double_type >::type promote_double_type;   //   // Discrete quantiles:   //   typedef typename detail::find_arg<arg_list, is_discrete_quantile<mpl::_1>, typename Policy::discrete_quantile_type >::type discrete_quantile_type;   //   // Mathematically undefined properties:   //   typedef typename detail::find_arg<arg_list, is_assert_undefined<mpl::_1>, discrete_quantile<> >::type assert_undefined_type;   //   // Max iterations:   //   typedef typename detail::find_arg<arg_list, is_max_series_iterations<mpl::_1>, max_series_iterations<> >::type max_series_iterations_type;   typedef typename detail::find_arg<arg_list, is_max_root_iterations<mpl::_1>, max_root_iterations<> >::type max_root_iterations_type;   //   // Define a typelist of the policies:   //   typedef mpl::vector<      domain_error_type,      pole_error_type,      overflow_error_type,      underflow_error_type,      denorm_error_type,      evaluation_error_type,      rounding_error_type,      indeterminate_result_error_type,      precision_type,      promote_float_type,      promote_double_type,      discrete_quantile_type,      assert_undefined_type,      max_series_iterations_type,      max_root_iterations_type> result_list;   //   // Remove all the policies that are the same as the default:   //   typedef typename mpl::remove_if<result_list, detail::is_default_policy<mpl::_> >::type reduced_list;   //   // Pad out the list with defaults:   //   typedef typename detail::append_N<reduced_list, default_policy, (14 - ::boost::mpl::size<reduced_list>::value)>::type result_type;public:   typedef policy<      typename mpl::at<result_type, mpl::int_<0> >::type,      typename mpl::at<result_type, mpl::int_<1> >::type,      typename mpl::at<result_type, mpl::int_<2> >::type,      typename mpl::at<result_type, mpl::int_<3> >::type,      typename mpl::at<result_type, mpl::int_<4> >::type,      typename mpl::at<result_type, mpl::int_<5> >::type,      typename mpl::at<result_type, mpl::int_<6> >::type,      typename mpl::at<result_type, mpl::int_<7> >::type,      typename mpl::at<result_type, mpl::int_<8> >::type,

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?