#define BOOST_PARAMETER_MAX_ARITY 15 #include #include #include // // Define macros for our default policies, if they're not defined already: // #ifndef BOOST_MATH_DOMAIN_ERROR_POLICY #define BOOST_MATH_DOMAIN_ERROR_POLICY throw_on_error #endif #ifndef BOOST_MATH_POLE_ERROR_POLICY #define BOOST_MATH_POLE_ERROR_POLICY throw_on_error #endif #ifndef BOOST_MATH_OVERFLOW_ERROR_POLICY #define BOOST_MATH_OVERFLOW_ERROR_POLICY throw_on_error #endif #ifndef BOOST_MATH_EVALUATION_ERROR_POLICY #define BOOST_MATH_EVALUATION_ERROR_POLICY throw_on_error #endif #ifndef BOOST_MATH_UNDERFLOW_ERROR_POLICY #define BOOST_MATH_UNDERFLOW_ERROR_POLICY ignor_error #endif #ifndef BOOST_MATH_DENORM_ERROR_POLICY #define BOOST_MATH_DENORM_ERROR_POLICY ignor_error #endif #ifndef BOOST_MATH_DIGITS10_POLICY #define BOOST_MATH_DIGITS10_POLICY -1 #endif #ifndef BOOST_MATH_PROMOTE_FLOAT_POLICY #define BOOST_MATH_PROMOTE_FLOAT_POLICY true #endif #ifndef BOOST_MATH_PROMOTE_DOUBLE_POLICY #define BOOST_MATH_PROMOTE_DOUBLE_POLICY true #endif #ifndef BOOST_MATH_DISCRETE_QUANTILE_POLICY #define BOOST_MATH_DISCRETE_QUANTILE_POLICY integer_outside #endif struct any_convertable { template any_convertable(const T&); }; #define BOOST_MATH_META_INT(type, name)\ template struct name : public boost::mpl::int_{};\ namespace detail{\ template struct is_##name##_imp\ {\ template static char test(const name&);\ static double test(any_convertable);\ BOOST_STATIC_CONSTANT(bool, value = sizeof(test(T())) == 1);\ };\ }\ template struct is_##name : public boost::mpl::bool_< ::detail::is_##name##_imp::value>{}; #define BOOST_MATH_META_BOOL(name)\ template struct name : public boost::mpl::bool_{};\ namespace detail{\ template struct is_##name##_imp\ {\ template static char test(const name&);\ static double test(any_convertable);\ BOOST_STATIC_CONSTANT(bool, value = sizeof(test(T())) == 1);\ };\ }\ template struct is_##name : public boost::mpl::bool_< ::detail::is_##name##_imp::value>{}; // // Begin by defining policy types for error handling: // enum error_policy_type { throw_on_error = 0, errno_on_error = 1, ignor_error = 2, user_error = 3 }; BOOST_MATH_META_INT(error_policy_type, domain_error) BOOST_MATH_META_INT(error_policy_type, pole_error) BOOST_MATH_META_INT(error_policy_type, overflow_error) BOOST_MATH_META_INT(error_policy_type, underflow_error) BOOST_MATH_META_INT(error_policy_type, denorm_error) BOOST_MATH_META_INT(error_policy_type, evaluation_error) // // Policy types for internal promotion: // BOOST_MATH_META_BOOL(promote_float); BOOST_MATH_META_BOOL(promote_double); // // Policy types for discrete quantiles: // enum discrete_quantile_policy_type { real, integer_outside, integer_inside, integer_below, integer_above }; BOOST_MATH_META_INT(discrete_quantile_policy_type, discrete_quantile); // // Precision: // BOOST_MATH_META_INT(int, digits10); BOOST_MATH_META_INT(int, digits2); // // Define the names for each possible policy: // #define BOOST_MATH_PARAMETER(name)\ BOOST_PARAMETER_TEMPLATE_KEYWORD(name##_name)\ BOOST_PARAMETER_NAME(name##_name) // // Error handlers: // BOOST_MATH_PARAMETER(domain_error) BOOST_MATH_PARAMETER(pole_error) BOOST_MATH_PARAMETER(overflow_error) BOOST_MATH_PARAMETER(underflow_error) BOOST_MATH_PARAMETER(denorm_error) BOOST_MATH_PARAMETER(evaluation_error) // // Precision: // BOOST_MATH_PARAMETER(digits10) BOOST_MATH_PARAMETER(digits2) // // Internal promotion: // BOOST_MATH_PARAMETER(promote_float) BOOST_MATH_PARAMETER(promote_double) // // Discrete quantile handling: // BOOST_MATH_PARAMETER(discrete_quantile) namespace detail{ // // Trait to work out bits precision from digits10 and digits2: // template struct precision { // // Now work out the precision: // typedef digits2<((Digits10::value + 1) * 1000L) / 301L> digits2_type; public: #ifdef __BORLANDC__ typedef typename boost::mpl::if_c< (Digits2::value > ::detail::precision::digits2_type::value), Digits2, digits2_type>::type type; #else typedef typename boost::mpl::if_c< (Digits2::value > digits2_type::value), Digits2, digits2_type>::type type; #endif }; } // // Define template signature complete with error checking of types: // using boost::mpl::_; typedef boost::parameter::parameters< boost::parameter::optional, is_domain_error > , boost::parameter::optional, is_pole_error > , boost::parameter::optional, is_overflow_error > , boost::parameter::optional, is_underflow_error > , boost::parameter::optional, is_denorm_error > , boost::parameter::optional, is_evaluation_error > , boost::parameter::optional, is_digits10 > , boost::parameter::optional, is_digits2 > , boost::parameter::optional, is_promote_float > , boost::parameter::optional, is_promote_double > , boost::parameter::optional, is_discrete_quantile > > policy_signature; // // Now define the policy type with enough arguments to handle all // the policies: // template struct policy { typedef policy_signature::bind bound_type; typedef typename bound_type::type args; // This next line is the one that causes the problem: typedef typename boost::parameter::binding< args, tag::domain_error_name, domain_error >::type domain_error_type; typedef typename boost::parameter::binding< args, tag::pole_error_name, pole_error >::type pole_error_type; typedef typename boost::parameter::binding< args, tag::overflow_error_name, overflow_error >::type overflow_error_type; typedef typename boost::parameter::binding< args, tag::underflow_error_name, underflow_error >::type underflow_error_type; typedef typename boost::parameter::binding< args, tag::denorm_error_name, denorm_error >::type denorm_error_type; typedef typename boost::parameter::binding< args, tag::evaluation_error_name, evaluation_error >::type evaluation_error_type; private: // // Now work out the precision: // typedef typename boost::parameter::binding< args, tag::digits10_name, digits10 >::type digits10_type; typedef typename boost::parameter::binding< args, tag::digits2_name, digits2<-1> >::type bits_precision_type; public: typedef typename detail::precision::type precision_type; // // Internal promotion: // typedef typename boost::parameter::binding< args, tag::promote_float_name, boost::mpl::bool_ >::type float_promote_type; typedef typename boost::parameter::binding< args, tag::promote_double_name, boost::mpl::bool_ >::type double_promote_type; // // Discrete quantiles: // typedef typename boost::parameter::binding< args, tag::discrete_quantile_name, discrete_quantile >::type discrete_quantile_type; }; // Instantiate a policy object: policy< domain_error, pole_error, overflow_error, underflow_error, denorm_error, evaluation_error > throw_policy;