From 01a938cb11eff5a87ad6fe8298545fbbedfa831b Mon Sep 17 00:00:00 2001 From: James Folberth Date: Sat, 12 Feb 2022 12:09:40 -0700 Subject: [PATCH] Add class template argument deduction guides for distributions (#756) * Demonstrate deduction guides for normal_distribution. * Add missing test case. * add class template argument deduction guides for distributions templated on real type - issue #754 * Remove no-arg tests in test_dist_deduction_guides.cpp - issue #754 GCC-8 and clang 6-8 were unhappy with the no-arg cases, which use the default template arg, not the deduction guide, anyway. * remove unused deduction guide for fisher_f - issue #754 Co-authored-by: jzmaddock --- include/boost/math/distributions/arcsine.hpp | 6 + .../boost/math/distributions/bernoulli.hpp | 5 + include/boost/math/distributions/beta.hpp | 7 + include/boost/math/distributions/binomial.hpp | 7 + include/boost/math/distributions/cauchy.hpp | 7 + .../boost/math/distributions/chi_squared.hpp | 5 + .../boost/math/distributions/exponential.hpp | 5 + .../math/distributions/extreme_value.hpp | 7 + include/boost/math/distributions/fisher_f.hpp | 5 + include/boost/math/distributions/gamma.hpp | 7 + .../boost/math/distributions/geometric.hpp | 5 + .../distributions/inverse_chi_squared.hpp | 7 + .../math/distributions/inverse_gamma.hpp | 7 + .../math/distributions/inverse_gaussian.hpp | 7 + .../math/distributions/kolmogorov_smirnov.hpp | 5 + include/boost/math/distributions/laplace.hpp | 7 + include/boost/math/distributions/logistic.hpp | 9 +- .../boost/math/distributions/lognormal.hpp | 7 + .../math/distributions/negative_binomial.hpp | 5 + .../math/distributions/non_central_beta.hpp | 5 + .../distributions/non_central_chi_squared.hpp | 5 + .../math/distributions/non_central_f.hpp | 5 + .../math/distributions/non_central_t.hpp | 5 + include/boost/math/distributions/normal.hpp | 14 ++ include/boost/math/distributions/pareto.hpp | 8 + include/boost/math/distributions/poisson.hpp | 5 + include/boost/math/distributions/rayleigh.hpp | 5 + .../boost/math/distributions/skew_normal.hpp | 9 ++ .../boost/math/distributions/students_t.hpp | 5 + .../boost/math/distributions/triangular.hpp | 9 ++ include/boost/math/distributions/uniform.hpp | 7 + include/boost/math/distributions/weibull.hpp | 7 + test/Jamfile.v2 | 2 + test/test_dist_deduction_guides.cpp | 144 ++++++++++++++++++ 34 files changed, 354 insertions(+), 1 deletion(-) create mode 100644 test/test_dist_deduction_guides.cpp diff --git a/include/boost/math/distributions/arcsine.hpp b/include/boost/math/distributions/arcsine.hpp index 952453f270..5cb2c05f9b 100644 --- a/include/boost/math/distributions/arcsine.hpp +++ b/include/boost/math/distributions/arcsine.hpp @@ -194,6 +194,12 @@ namespace boost // Convenient typedef to construct double version. typedef arcsine_distribution arcsine; + #ifdef __cpp_deduction_guides + template + arcsine_distribution(RealType)->arcsine_distribution::type>; + template + arcsine_distribution(RealType, RealType)->arcsine_distribution::type>; + #endif template inline const std::pair range(const arcsine_distribution& dist) diff --git a/include/boost/math/distributions/bernoulli.hpp b/include/boost/math/distributions/bernoulli.hpp index bf56173ac8..78b6d4f126 100644 --- a/include/boost/math/distributions/bernoulli.hpp +++ b/include/boost/math/distributions/bernoulli.hpp @@ -126,6 +126,11 @@ namespace boost typedef bernoulli_distribution bernoulli; + #ifdef __cpp_deduction_guides + template + bernoulli_distribution(RealType)->bernoulli_distribution::type>; + #endif + template inline const std::pair range(const bernoulli_distribution& /* dist */) { // Range of permissible values for random variable k = {0, 1}. diff --git a/include/boost/math/distributions/beta.hpp b/include/boost/math/distributions/beta.hpp index 511e3b8236..b313500bee 100644 --- a/include/boost/math/distributions/beta.hpp +++ b/include/boost/math/distributions/beta.hpp @@ -272,6 +272,13 @@ namespace boost RealType m_beta; }; // template class beta_distribution + #ifdef __cpp_deduction_guides + template + beta_distribution(RealType)->beta_distribution::type>; + template + beta_distribution(RealType, RealType)->beta_distribution::type>; + #endif + template inline const std::pair range(const beta_distribution& /* dist */) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/binomial.hpp b/include/boost/math/distributions/binomial.hpp index 47c97b17ee..b54292aebd 100644 --- a/include/boost/math/distributions/binomial.hpp +++ b/include/boost/math/distributions/binomial.hpp @@ -414,6 +414,13 @@ namespace boost // IS now included since no longer a name clash with function binomial. //typedef binomial_distribution binomial; // Reserved name of type double. + #ifdef __cpp_deduction_guides + template + binomial_distribution(RealType)->binomial_distribution::type>; + template + binomial_distribution(RealType,RealType)->binomial_distribution::type>; + #endif + template const std::pair range(const binomial_distribution& dist) { // Range of permissible values for random variable k. diff --git a/include/boost/math/distributions/cauchy.hpp b/include/boost/math/distributions/cauchy.hpp index ddab35b37f..8588686c8f 100644 --- a/include/boost/math/distributions/cauchy.hpp +++ b/include/boost/math/distributions/cauchy.hpp @@ -176,6 +176,13 @@ class cauchy_distribution typedef cauchy_distribution cauchy; +#ifdef __cpp_deduction_guides +template +cauchy_distribution(RealType)->cauchy_distribution::type>; +template +cauchy_distribution(RealType,RealType)->cauchy_distribution::type>; +#endif + template inline const std::pair range(const cauchy_distribution&) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/chi_squared.hpp b/include/boost/math/distributions/chi_squared.hpp index 8c7b0e07a6..e97bee7ce7 100644 --- a/include/boost/math/distributions/chi_squared.hpp +++ b/include/boost/math/distributions/chi_squared.hpp @@ -55,6 +55,11 @@ class chi_squared_distribution typedef chi_squared_distribution chi_squared; +#ifdef __cpp_deduction_guides +template +chi_squared_distribution(RealType)->chi_squared_distribution::type>; +#endif + #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:4127) diff --git a/include/boost/math/distributions/exponential.hpp b/include/boost/math/distributions/exponential.hpp index 0c37768283..ba7eae927f 100644 --- a/include/boost/math/distributions/exponential.hpp +++ b/include/boost/math/distributions/exponential.hpp @@ -78,6 +78,11 @@ class exponential_distribution typedef exponential_distribution exponential; +#ifdef __cpp_deduction_guides +template +exponential_distribution(RealType)->exponential_distribution::type>; +#endif + template inline const std::pair range(const exponential_distribution& /*dist*/) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/extreme_value.hpp b/include/boost/math/distributions/extreme_value.hpp index 397ca51a42..d503b31bc9 100644 --- a/include/boost/math/distributions/extreme_value.hpp +++ b/include/boost/math/distributions/extreme_value.hpp @@ -73,6 +73,13 @@ class extreme_value_distribution typedef extreme_value_distribution extreme_value; +#ifdef __cpp_deduction_guides +template +extreme_value_distribution(RealType)->extreme_value_distribution::type>; +template +extreme_value_distribution(RealType,RealType)->extreme_value_distribution::type>; +#endif + template inline const std::pair range(const extreme_value_distribution& /*dist*/) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/fisher_f.hpp b/include/boost/math/distributions/fisher_f.hpp index 6a7b9d8391..cec79eccd6 100644 --- a/include/boost/math/distributions/fisher_f.hpp +++ b/include/boost/math/distributions/fisher_f.hpp @@ -54,6 +54,11 @@ class fisher_f_distribution typedef fisher_f_distribution fisher_f; +#ifdef __cpp_deduction_guides +template +fisher_f_distribution(RealType,RealType)->fisher_f_distribution::type>; +#endif + template inline const std::pair range(const fisher_f_distribution& /*dist*/) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/gamma.hpp b/include/boost/math/distributions/gamma.hpp index f5b265ad5a..8a3414d312 100644 --- a/include/boost/math/distributions/gamma.hpp +++ b/include/boost/math/distributions/gamma.hpp @@ -100,6 +100,13 @@ class gamma_distribution // NO typedef because of clash with name of gamma function. +#ifdef __cpp_deduction_guides +template +gamma_distribution(RealType)->gamma_distribution::type>; +template +gamma_distribution(RealType,RealType)->gamma_distribution::type>; +#endif + template inline const std::pair range(const gamma_distribution& /* dist */) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/geometric.hpp b/include/boost/math/distributions/geometric.hpp index cb59c1b9f4..9a9f0ea073 100644 --- a/include/boost/math/distributions/geometric.hpp +++ b/include/boost/math/distributions/geometric.hpp @@ -236,6 +236,11 @@ namespace boost typedef geometric_distribution geometric; // Reserved name of type double. + #ifdef __cpp_deduction_guides + template + geometric_distribution(RealType)->geometric_distribution::type>; + #endif + template inline const std::pair range(const geometric_distribution& /* dist */) { // Range of permissible values for random variable k. diff --git a/include/boost/math/distributions/inverse_chi_squared.hpp b/include/boost/math/distributions/inverse_chi_squared.hpp index c1e54905da..19dd0371e8 100644 --- a/include/boost/math/distributions/inverse_chi_squared.hpp +++ b/include/boost/math/distributions/inverse_chi_squared.hpp @@ -97,6 +97,13 @@ class inverse_chi_squared_distribution typedef inverse_chi_squared_distribution inverse_chi_squared; +#ifdef __cpp_deduction_guides +template +inverse_chi_squared_distribution(RealType)->inverse_chi_squared_distribution::type>; +template +inverse_chi_squared_distribution(RealType,RealType)->inverse_chi_squared_distribution::type>; +#endif + template inline const std::pair range(const inverse_chi_squared_distribution& /*dist*/) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/inverse_gamma.hpp b/include/boost/math/distributions/inverse_gamma.hpp index fa5d357ac7..9266bc22f6 100644 --- a/include/boost/math/distributions/inverse_gamma.hpp +++ b/include/boost/math/distributions/inverse_gamma.hpp @@ -122,6 +122,13 @@ typedef inverse_gamma_distribution inverse_gamma; // but there is a typedef for gamma // typedef boost::math::gamma_distribution gamma; +#ifdef __cpp_deduction_guides +template +inverse_gamma_distribution(RealType)->inverse_gamma_distribution::type>; +template +inverse_gamma_distribution(RealType,RealType)->inverse_gamma_distribution::type>; +#endif + // Allow random variable x to be zero, treated as a special case (unlike some definitions). template diff --git a/include/boost/math/distributions/inverse_gaussian.hpp b/include/boost/math/distributions/inverse_gaussian.hpp index e614ad9815..757630a40d 100644 --- a/include/boost/math/distributions/inverse_gaussian.hpp +++ b/include/boost/math/distributions/inverse_gaussian.hpp @@ -115,6 +115,13 @@ class inverse_gaussian_distribution typedef inverse_gaussian_distribution inverse_gaussian; +#ifdef __cpp_deduction_guides +template +inverse_gaussian_distribution(RealType)->inverse_gaussian_distribution::type>; +template +inverse_gaussian_distribution(RealType,RealType)->inverse_gaussian_distribution::type>; +#endif + template inline const std::pair range(const inverse_gaussian_distribution& /*dist*/) { // Range of permissible values for random variable x, zero to max. diff --git a/include/boost/math/distributions/kolmogorov_smirnov.hpp b/include/boost/math/distributions/kolmogorov_smirnov.hpp index f71c1fe465..fd6a2350f3 100644 --- a/include/boost/math/distributions/kolmogorov_smirnov.hpp +++ b/include/boost/math/distributions/kolmogorov_smirnov.hpp @@ -213,6 +213,11 @@ template > typedef kolmogorov_smirnov_distribution kolmogorov_k; // Convenience typedef for double version. +#ifdef __cpp_deduction_guides +template +kolmogorov_smirnov_distribution(RealType)->kolmogorov_smirnov_distribution::type>; +#endif + namespace detail { template struct kolmogorov_smirnov_quantile_functor diff --git a/include/boost/math/distributions/laplace.hpp b/include/boost/math/distributions/laplace.hpp index 2033244d61..9b268f3f33 100644 --- a/include/boost/math/distributions/laplace.hpp +++ b/include/boost/math/distributions/laplace.hpp @@ -80,6 +80,13 @@ class laplace_distribution // Convenient type synonym for double. typedef laplace_distribution laplace; +#ifdef __cpp_deduction_guides +template +laplace_distribution(RealType)->laplace_distribution::type>; +template +laplace_distribution(RealType,RealType)->laplace_distribution::type>; +#endif + // // Non-member functions. template diff --git a/include/boost/math/distributions/logistic.hpp b/include/boost/math/distributions/logistic.hpp index 73711aa079..3c7d1289d1 100644 --- a/include/boost/math/distributions/logistic.hpp +++ b/include/boost/math/distributions/logistic.hpp @@ -51,7 +51,14 @@ namespace boost { namespace math { typedef logistic_distribution logistic; - + + #ifdef __cpp_deduction_guides + template + logistic_distribution(RealType)->logistic_distribution::type>; + template + logistic_distribution(RealType,RealType)->logistic_distribution::type>; + #endif + template inline const std::pair range(const logistic_distribution& /* dist */) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/lognormal.hpp b/include/boost/math/distributions/lognormal.hpp index 172fdaa539..3c8f576e56 100644 --- a/include/boost/math/distributions/lognormal.hpp +++ b/include/boost/math/distributions/lognormal.hpp @@ -75,6 +75,13 @@ class lognormal_distribution typedef lognormal_distribution lognormal; +#ifdef __cpp_deduction_guides +template +lognormal_distribution(RealType)->lognormal_distribution::type>; +template +lognormal_distribution(RealType,RealType)->lognormal_distribution::type>; +#endif + template inline const std::pair range(const lognormal_distribution& /*dist*/) { // Range of permissible values for random variable x is >0 to +infinity. diff --git a/include/boost/math/distributions/negative_binomial.hpp b/include/boost/math/distributions/negative_binomial.hpp index 5bfa1e3094..34412bf4ba 100644 --- a/include/boost/math/distributions/negative_binomial.hpp +++ b/include/boost/math/distributions/negative_binomial.hpp @@ -251,6 +251,11 @@ namespace boost typedef negative_binomial_distribution negative_binomial; // Reserved name of type double. + #ifdef __cpp_deduction_guides + template + negative_binomial_distribution(RealType,RealType)->negative_binomial_distribution::type>; + #endif + template inline const std::pair range(const negative_binomial_distribution& /* dist */) { // Range of permissible values for random variable k. diff --git a/include/boost/math/distributions/non_central_beta.hpp b/include/boost/math/distributions/non_central_beta.hpp index 35f05f3bd1..56ac9ead39 100644 --- a/include/boost/math/distributions/non_central_beta.hpp +++ b/include/boost/math/distributions/non_central_beta.hpp @@ -707,6 +707,11 @@ namespace boost typedef non_central_beta_distribution non_central_beta; // Reserved name of type double. + #ifdef __cpp_deduction_guides + template + non_central_beta_distribution(RealType,RealType,RealType)->non_central_beta_distribution::type>; + #endif + // Non-member functions to give properties of the distribution. template diff --git a/include/boost/math/distributions/non_central_chi_squared.hpp b/include/boost/math/distributions/non_central_chi_squared.hpp index d44d6fff42..b848851cef 100644 --- a/include/boost/math/distributions/non_central_chi_squared.hpp +++ b/include/boost/math/distributions/non_central_chi_squared.hpp @@ -783,6 +783,11 @@ namespace boost typedef non_central_chi_squared_distribution non_central_chi_squared; // Reserved name of type double. + #ifdef __cpp_deduction_guides + template + non_central_chi_squared_distribution(RealType,RealType)->non_central_chi_squared_distribution::type>; + #endif + // Non-member functions to give properties of the distribution. template diff --git a/include/boost/math/distributions/non_central_f.hpp b/include/boost/math/distributions/non_central_f.hpp index 780dbff9a7..bb122029b8 100644 --- a/include/boost/math/distributions/non_central_f.hpp +++ b/include/boost/math/distributions/non_central_f.hpp @@ -63,6 +63,11 @@ namespace boost typedef non_central_f_distribution non_central_f; // Reserved name of type double. + #ifdef __cpp_deduction_guides + template + non_central_f_distribution(RealType,RealType,RealType)->non_central_f_distribution::type>; + #endif + // Non-member functions to give properties of the distribution. template diff --git a/include/boost/math/distributions/non_central_t.hpp b/include/boost/math/distributions/non_central_t.hpp index 5c74c5e6c3..bdd0f7e383 100644 --- a/include/boost/math/distributions/non_central_t.hpp +++ b/include/boost/math/distributions/non_central_t.hpp @@ -838,6 +838,11 @@ namespace boost typedef non_central_t_distribution non_central_t; // Reserved name of type double. + #ifdef __cpp_deduction_guides + template + non_central_t_distribution(RealType,RealType)->non_central_t_distribution::type>; + #endif + // Non-member functions to give properties of the distribution. template diff --git a/include/boost/math/distributions/normal.hpp b/include/boost/math/distributions/normal.hpp index b9697ebb08..73ada53b6f 100644 --- a/include/boost/math/distributions/normal.hpp +++ b/include/boost/math/distributions/normal.hpp @@ -71,6 +71,20 @@ class normal_distribution typedef normal_distribution normal; +// +// Deduction guides, note we don't check the +// value of __cpp_deduction_guides, just assume +// they work as advertised, even if this is pre-final C++17. +// +#ifdef __cpp_deduction_guides + +template +normal_distribution(RealType, RealType)->normal_distribution::type>; +template +normal_distribution(RealType)->normal_distribution::type>; + +#endif + #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:4127) diff --git a/include/boost/math/distributions/pareto.hpp b/include/boost/math/distributions/pareto.hpp index 971a824b90..45d43587f0 100644 --- a/include/boost/math/distributions/pareto.hpp +++ b/include/boost/math/distributions/pareto.hpp @@ -160,6 +160,14 @@ namespace boost typedef pareto_distribution pareto; // Convenience to allow pareto(2., 3.); + #ifdef __cpp_deduction_guides + template + pareto_distribution(RealType)->pareto_distribution::type>; + template + pareto_distribution(RealType,RealType)->pareto_distribution::type>; + #endif + + template inline const std::pair range(const pareto_distribution& /*dist*/) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/poisson.hpp b/include/boost/math/distributions/poisson.hpp index b2a1651ef0..533c31a80d 100644 --- a/include/boost/math/distributions/poisson.hpp +++ b/include/boost/math/distributions/poisson.hpp @@ -167,6 +167,11 @@ namespace boost typedef poisson_distribution poisson; // Reserved name of type double. + #ifdef __cpp_deduction_guides + template + poisson_distribution(RealType)->poisson_distribution::type>; + #endif + // Non-member functions to give properties of the distribution. template diff --git a/include/boost/math/distributions/rayleigh.hpp b/include/boost/math/distributions/rayleigh.hpp index 682f005052..cbe934471f 100644 --- a/include/boost/math/distributions/rayleigh.hpp +++ b/include/boost/math/distributions/rayleigh.hpp @@ -77,6 +77,11 @@ class rayleigh_distribution typedef rayleigh_distribution rayleigh; +#ifdef __cpp_deduction_guides +template +rayleigh_distribution(RealType)->rayleigh_distribution::type>; +#endif + template inline const std::pair range(const rayleigh_distribution& /*dist*/) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/skew_normal.hpp b/include/boost/math/distributions/skew_normal.hpp index 62853f62c3..8da751b0be 100644 --- a/include/boost/math/distributions/skew_normal.hpp +++ b/include/boost/math/distributions/skew_normal.hpp @@ -96,6 +96,15 @@ namespace boost{ namespace math{ typedef skew_normal_distribution skew_normal; + #ifdef __cpp_deduction_guides + template + skew_normal_distribution(RealType)->skew_normal_distribution::type>; + template + skew_normal_distribution(RealType,RealType)->skew_normal_distribution::type>; + template + skew_normal_distribution(RealType,RealType,RealType)->skew_normal_distribution::type>; + #endif + template inline const std::pair range(const skew_normal_distribution& /*dist*/) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/students_t.hpp b/include/boost/math/distributions/students_t.hpp index 961530a70c..321c4751b5 100644 --- a/include/boost/math/distributions/students_t.hpp +++ b/include/boost/math/distributions/students_t.hpp @@ -62,6 +62,11 @@ class students_t_distribution typedef students_t_distribution students_t; // Convenience typedef for double version. +#ifdef __cpp_deduction_guides +template +students_t_distribution(RealType)->students_t_distribution::type>; +#endif + template inline const std::pair range(const students_t_distribution& /*dist*/) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/triangular.hpp b/include/boost/math/distributions/triangular.hpp index 6f11984a6f..950d78147f 100644 --- a/include/boost/math/distributions/triangular.hpp +++ b/include/boost/math/distributions/triangular.hpp @@ -184,6 +184,15 @@ namespace boost{ namespace math typedef triangular_distribution triangular; + #ifdef __cpp_deduction_guides + template + triangular_distribution(RealType)->triangular_distribution::type>; + template + triangular_distribution(RealType,RealType)->triangular_distribution::type>; + template + triangular_distribution(RealType,RealType,RealType)->triangular_distribution::type>; + #endif + template inline const std::pair range(const triangular_distribution& /* dist */) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/uniform.hpp b/include/boost/math/distributions/uniform.hpp index 0b04c8ac14..97f7b4ceda 100644 --- a/include/boost/math/distributions/uniform.hpp +++ b/include/boost/math/distributions/uniform.hpp @@ -140,6 +140,13 @@ namespace boost{ namespace math typedef uniform_distribution uniform; + #ifdef __cpp_deduction_guides + template + uniform_distribution(RealType)->uniform_distribution::type>; + template + uniform_distribution(RealType,RealType)->uniform_distribution::type>; + #endif + template inline const std::pair range(const uniform_distribution& /* dist */) { // Range of permissible values for random variable x. diff --git a/include/boost/math/distributions/weibull.hpp b/include/boost/math/distributions/weibull.hpp index 6da7224d90..76246e4ff2 100644 --- a/include/boost/math/distributions/weibull.hpp +++ b/include/boost/math/distributions/weibull.hpp @@ -99,6 +99,13 @@ class weibull_distribution typedef weibull_distribution weibull; +#ifdef __cpp_deduction_guides +template +weibull_distribution(RealType)->weibull_distribution::type>; +template +weibull_distribution(RealType,RealType)->weibull_distribution::type>; +#endif + template inline const std::pair range(const weibull_distribution& /*dist*/) { // Range of permissible values for random variable x. diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 6d5667a295..7f057edbcb 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -877,6 +877,8 @@ test-suite distribution_tests : [ run test_signed_zero.cpp ../../test/build//boost_unit_test_framework ] [ run complex_test.cpp ../../test/build//boost_unit_test_framework ] + [ compile test_dist_deduction_guides.cpp : [ requires cpp_deduction_guides cpp_variadic_templates ] ] + ; test-suite mp : diff --git a/test/test_dist_deduction_guides.cpp b/test/test_dist_deduction_guides.cpp new file mode 100644 index 0000000000..b814ee1503 --- /dev/null +++ b/test/test_dist_deduction_guides.cpp @@ -0,0 +1,144 @@ +// (C) Copyright John Maddock 2022. +// (C) Copyright James Folberth 2022. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// Issue 754 +// Check that the class template argument deduction guides properly promote +// integral ctor args to a real floating point type. + +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +//#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Instantiate a DistType object with the parameter pack given by Types. +// Then verify that the `RealType` template parameter of DistType (stored in +// in value_type) is promoted correctly according to the deduction guides. +template class DistType, class PromType = double, class... Types> +void test_deduction_guide(Types... types) +{ + DistType d(types...); + static_assert(std::is_same::value); +} + +int main() +{ + using namespace boost::math; + + test_deduction_guide(0); + test_deduction_guide(0, 1); + + test_deduction_guide(0); + + test_deduction_guide(1); + test_deduction_guide(1, 1); + + test_deduction_guide(1); + test_deduction_guide(1, 0); + + test_deduction_guide(0); + test_deduction_guide(0, 1); + + test_deduction_guide(2); + + test_deduction_guide(1); + + test_deduction_guide(0); + test_deduction_guide(0, 1); + + test_deduction_guide(1, 2); + + test_deduction_guide(1); + test_deduction_guide(1, 1); + + test_deduction_guide(1); + + test_deduction_guide(1); + test_deduction_guide(1, 1); + + test_deduction_guide(1); + test_deduction_guide(1, 1); + + test_deduction_guide(1); + test_deduction_guide(1, 1); + + test_deduction_guide(1); + + test_deduction_guide(0); + test_deduction_guide(0, 1); + + test_deduction_guide(0); + test_deduction_guide(0, 1); + + test_deduction_guide(0); + test_deduction_guide(0, 1); + + test_deduction_guide(1, 1); + + test_deduction_guide(1, 1, 1); + + test_deduction_guide(1, 1); + + test_deduction_guide(1, 1, 1); + + test_deduction_guide(1, 1); + + test_deduction_guide(2); + test_deduction_guide(2, 3); + + test_deduction_guide(2); + test_deduction_guide(2, 3); + + test_deduction_guide(1); + + test_deduction_guide(1); + + test_deduction_guide(0); + test_deduction_guide(0, 1); + test_deduction_guide(0, 1, 0); + + test_deduction_guide(2); + + test_deduction_guide(-1); + test_deduction_guide(-1, 0); + test_deduction_guide(-1, 0, 1); + + test_deduction_guide(0); + test_deduction_guide(0, 1); + + test_deduction_guide(1); + test_deduction_guide(1, 1); +}