mirror of
https://github.com/boostorg/math.git
synced 2026-01-19 04:22:09 +00:00
Added some specializations of the policy classes to reduce compile times.
Updated history. [SVN r49405]
This commit is contained in:
@@ -1,5 +1,10 @@
|
||||
[template history[]
|
||||
|
||||
[h4 Boost-1.38.0]
|
||||
|
||||
* Added support for MPFR as a bignum type.
|
||||
* Added some full specializations of the policy classes to reduce compile times.
|
||||
|
||||
[h4 Boost-1.37.0]
|
||||
|
||||
* Improved accuracy and testing of the inverse hypergeometric functions.
|
||||
|
||||
@@ -603,6 +603,23 @@ struct normalise<policy<>,
|
||||
typedef policy<detail::forwarding_arg1, detail::forwarding_arg2> type;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct normalise<policy<detail::forwarding_arg1, detail::forwarding_arg2>,
|
||||
promote_float<false>,
|
||||
promote_double<false>,
|
||||
discrete_quantile<>,
|
||||
assert_undefined<>,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy>
|
||||
{
|
||||
typedef policy<detail::forwarding_arg1, detail::forwarding_arg2> type;
|
||||
};
|
||||
|
||||
inline policy<> make_policy()
|
||||
{ return policy<>(); }
|
||||
|
||||
|
||||
@@ -69,6 +69,12 @@ namespace boost
|
||||
{ // If T is integral type, then promote to double.
|
||||
typedef typename mpl::if_<is_integral<T>, double, T>::type type;
|
||||
};
|
||||
// These full specialisations reduce mpl::if_ usage and speed up
|
||||
// compilation:
|
||||
template <> struct promote_arg<float> { typedef float type; };
|
||||
template <> struct promote_arg<double>{ typedef double type; };
|
||||
template <> struct promote_arg<long double> { typedef long double type; };
|
||||
template <> struct promote_arg<int> { typedef double type; };
|
||||
|
||||
template <class T1, class T2>
|
||||
struct promote_args_2
|
||||
@@ -89,6 +95,24 @@ namespace boost
|
||||
// else one or the other is a user-defined type:
|
||||
typename mpl::if_< ::boost::is_convertible<T1P, T2P>, T2P, T1P>::type>::type type;
|
||||
}; // promote_arg2
|
||||
// These full specialisations reduce mpl::if_ usage and speed up
|
||||
// compilation:
|
||||
template <> struct promote_args_2<float, float> { typedef float type; };
|
||||
template <> struct promote_args_2<double, double>{ typedef double type; };
|
||||
template <> struct promote_args_2<long double, long double> { typedef long double type; };
|
||||
template <> struct promote_args_2<int, int> { typedef double type; };
|
||||
template <> struct promote_args_2<int, float> { typedef double type; };
|
||||
template <> struct promote_args_2<float, int> { typedef double type; };
|
||||
template <> struct promote_args_2<int, double> { typedef double type; };
|
||||
template <> struct promote_args_2<double, int> { typedef double type; };
|
||||
template <> struct promote_args_2<int, long double> { typedef long double type; };
|
||||
template <> struct promote_args_2<long double, int> { typedef long double type; };
|
||||
template <> struct promote_args_2<float, double> { typedef double type; };
|
||||
template <> struct promote_args_2<double, float> { typedef double type; };
|
||||
template <> struct promote_args_2<float, long double> { typedef long double type; };
|
||||
template <> struct promote_args_2<long double, float> { typedef long double type; };
|
||||
template <> struct promote_args_2<double, long double> { typedef long double type; };
|
||||
template <> struct promote_args_2<long double, double> { typedef long double type; };
|
||||
|
||||
template <class T1, class T2=float, class T3=float, class T4=float, class T5=float, class T6=float>
|
||||
struct promote_args
|
||||
|
||||
@@ -6,6 +6,108 @@
|
||||
#include <boost/math/policies/policy.hpp>
|
||||
#include <boost/math/special_functions/math_fwd.hpp>
|
||||
|
||||
namespace boost{ namespace math{ namespace policies{
|
||||
|
||||
template <>
|
||||
struct policy<
|
||||
domain_error<errno_on_error>,
|
||||
pole_error<errno_on_error>,
|
||||
overflow_error<errno_on_error>,
|
||||
evaluation_error<errno_on_error>,
|
||||
rounding_error<errno_on_error>,
|
||||
default_policy, default_policy, default_policy, default_policy, default_policy, default_policy>
|
||||
{
|
||||
public:
|
||||
typedef domain_error<errno_on_error> domain_error_type;
|
||||
typedef pole_error<errno_on_error> pole_error_type;
|
||||
typedef overflow_error<errno_on_error> overflow_error_type;
|
||||
typedef underflow_error<errno_on_error> underflow_error_type;
|
||||
typedef denorm_error<errno_on_error> denorm_error_type;
|
||||
typedef evaluation_error<errno_on_error> evaluation_error_type;
|
||||
typedef rounding_error<errno_on_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<
|
||||
domain_error<errno_on_error>,
|
||||
pole_error<errno_on_error>,
|
||||
overflow_error<errno_on_error>,
|
||||
evaluation_error<errno_on_error>,
|
||||
rounding_error<errno_on_error>,
|
||||
detail::forwarding_arg1,
|
||||
detail::forwarding_arg2,
|
||||
default_policy, default_policy, default_policy, default_policy, default_policy, default_policy>
|
||||
{
|
||||
public:
|
||||
typedef domain_error<errno_on_error> domain_error_type;
|
||||
typedef pole_error<errno_on_error> pole_error_type;
|
||||
typedef overflow_error<errno_on_error> overflow_error_type;
|
||||
typedef underflow_error<errno_on_error> underflow_error_type;
|
||||
typedef denorm_error<errno_on_error> denorm_error_type;
|
||||
typedef evaluation_error<errno_on_error> evaluation_error_type;
|
||||
typedef rounding_error<errno_on_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 <>
|
||||
struct normalise<policy<domain_error<errno_on_error>, pole_error<errno_on_error>, overflow_error<errno_on_error>, evaluation_error<errno_on_error>, rounding_error<errno_on_error> >,
|
||||
promote_float<false>,
|
||||
promote_double<false>,
|
||||
discrete_quantile<>,
|
||||
assert_undefined<>,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy>
|
||||
{
|
||||
typedef policy<domain_error<errno_on_error>, pole_error<errno_on_error>, overflow_error<errno_on_error>, evaluation_error<errno_on_error>, rounding_error<errno_on_error>, detail::forwarding_arg1, detail::forwarding_arg2> type;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct normalise<policy<domain_error<errno_on_error>, pole_error<errno_on_error>, overflow_error<errno_on_error>, evaluation_error<errno_on_error>, rounding_error<errno_on_error>, detail::forwarding_arg1, detail::forwarding_arg2 >,
|
||||
promote_float<false>,
|
||||
promote_double<false>,
|
||||
discrete_quantile<>,
|
||||
assert_undefined<>,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy,
|
||||
default_policy>
|
||||
{
|
||||
typedef policy<domain_error<errno_on_error>, pole_error<errno_on_error>, overflow_error<errno_on_error>, evaluation_error<errno_on_error>, rounding_error<errno_on_error>, detail::forwarding_arg1, detail::forwarding_arg2> type;
|
||||
};
|
||||
|
||||
}}} // namespaces
|
||||
|
||||
namespace c_policies{
|
||||
|
||||
using boost::math::policies::policy;
|
||||
@@ -20,8 +122,8 @@ typedef policy<
|
||||
domain_error<errno_on_error>,
|
||||
pole_error<errno_on_error>,
|
||||
overflow_error<errno_on_error>,
|
||||
rounding_error<errno_on_error>,
|
||||
evaluation_error<errno_on_error>
|
||||
evaluation_error<errno_on_error>,
|
||||
rounding_error<errno_on_error>
|
||||
> c_policy;
|
||||
|
||||
BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS(c_policy)
|
||||
|
||||
Reference in New Issue
Block a user