2
0
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:
John Maddock
2008-10-20 16:54:24 +00:00
parent df7ad868e7
commit c3367bf1bb
4 changed files with 150 additions and 2 deletions

View File

@@ -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.

View File

@@ -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<>(); }

View File

@@ -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

View File

@@ -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)