diff --git a/src/include/units/random.h b/src/include/units/random.h index e9bc4221..6df67952 100644 --- a/src/include/units/random.h +++ b/src/include/units/random.h @@ -24,6 +24,7 @@ #include #include +#include #include namespace units { @@ -72,6 +73,7 @@ namespace detail { } // namespace detail template + requires std::integral struct uniform_int_distribution : public std::uniform_int_distribution { using rep = Q::rep; @@ -91,6 +93,7 @@ struct uniform_int_distribution : public std::uniform_int_distribution + requires std::floating_point struct uniform_real_distribution : public std::uniform_real_distribution { using rep = Q::rep; @@ -110,6 +113,7 @@ struct uniform_real_distribution : public std::uniform_real_distribution + requires std::integral struct binomial_distribution : public std::binomial_distribution { using rep = Q::rep; @@ -128,6 +132,7 @@ struct binomial_distribution : public std::binomial_distribution + requires std::integral struct negative_binomial_distribution : public std::negative_binomial_distribution { using rep = Q::rep; @@ -146,6 +151,7 @@ struct negative_binomial_distribution : public std::negative_binomial_distributi }; template + requires std::integral struct geometric_distribution : public std::geometric_distribution { using rep = Q::rep; @@ -162,6 +168,7 @@ struct geometric_distribution : public std::geometric_distribution + requires std::integral struct poisson_distribution : public std::poisson_distribution { using rep = Q::rep; @@ -178,13 +185,14 @@ struct poisson_distribution : public std::poisson_distribution }; template + requires std::floating_point struct exponential_distribution : public std::exponential_distribution { using rep = Q::rep; using base = std::exponential_distribution; explicit exponential_distribution() : base() {} - explicit exponential_distribution(rep lambda) : base(lambda) {} + explicit exponential_distribution(const rep& lambda) : base(lambda) {} template Q operator()(Generator& g) { return Q(base::operator()(g)); } @@ -194,13 +202,14 @@ struct exponential_distribution : public std::exponential_distribution + requires std::floating_point struct gamma_distribution : public std::gamma_distribution { using rep = Q::rep; using base = std::gamma_distribution; explicit gamma_distribution() : base() {} - gamma_distribution(rep alpha, rep beta) : base(alpha, beta) {} + gamma_distribution(const rep& alpha, const rep& beta) : base(alpha, beta) {} template Q operator()(Generator& g) { return Q(base::operator()(g)); } @@ -210,13 +219,14 @@ struct gamma_distribution : public std::gamma_distribution }; template + requires std::floating_point struct weibull_distribution : public std::weibull_distribution { using rep = Q::rep; using base = std::weibull_distribution; explicit weibull_distribution() : base() {} - weibull_distribution(rep a, rep b) : base(a, b) {} + weibull_distribution(const rep& a, const rep& b) : base(a, b) {} template Q operator()(Generator& g) { return Q(base::operator()(g)); } @@ -226,13 +236,14 @@ struct weibull_distribution : public std::weibull_distribution }; template + requires std::floating_point struct extreme_value_distribution : public std::extreme_value_distribution { using rep = Q::rep; using base = std::extreme_value_distribution; explicit extreme_value_distribution() : base() {} - extreme_value_distribution(const Q& a, rep b) : base(a.count(), b) {} + extreme_value_distribution(const Q& a, const rep& b) : base(a.count(), b) {} template Q operator()(Generator& g) { return Q(base::operator()(g)); } @@ -244,6 +255,7 @@ struct extreme_value_distribution : public std::extreme_value_distribution + requires std::floating_point struct normal_distribution : public std::normal_distribution { using rep = Q::rep; @@ -263,6 +275,7 @@ struct normal_distribution : public std::normal_distribution }; template + requires std::floating_point struct lognormal_distribution : public std::lognormal_distribution { using rep = Q::rep; @@ -282,13 +295,14 @@ struct lognormal_distribution : public std::lognormal_distribution + requires std::floating_point struct chi_squared_distribution : public std::chi_squared_distribution { using rep = Q::rep; using base = std::chi_squared_distribution; explicit chi_squared_distribution() : base() {} - explicit chi_squared_distribution(rep n) : base(n) {} + explicit chi_squared_distribution(const rep& n) : base(n) {} template Q operator()(Generator& g) { return Q(base::operator()(g)); } @@ -298,6 +312,7 @@ struct chi_squared_distribution : public std::chi_squared_distribution + requires std::floating_point struct cauchy_distribution : public std::cauchy_distribution { using rep = Q::rep; @@ -317,13 +332,14 @@ struct cauchy_distribution : public std::cauchy_distribution }; template + requires std::floating_point struct fisher_f_distribution : public std::fisher_f_distribution { using rep = Q::rep; using base = std::fisher_f_distribution; explicit fisher_f_distribution() : base() {} - fisher_f_distribution(rep m, rep n) : base(m, n) {} + fisher_f_distribution(const rep& m, const rep& n) : base(m, n) {} template Q operator()(Generator& g) { return Q(base::operator()(g)); } @@ -333,13 +349,14 @@ struct fisher_f_distribution : public std::fisher_f_distribution + requires std::floating_point struct student_t_distribution : public std::student_t_distribution { using rep = Q::rep; using base = std::student_t_distribution; explicit student_t_distribution() : base() {} - explicit student_t_distribution(rep n) : base(n) {} + explicit student_t_distribution(const rep& n) : base(n) {} template Q operator()(Generator& g) { return Q(base::operator()(g)); } @@ -349,6 +366,7 @@ struct student_t_distribution : public std::student_t_distribution + requires std::integral struct discrete_distribution : public std::discrete_distribution { using rep = Q::rep; @@ -373,6 +391,7 @@ struct discrete_distribution : public std::discrete_distribution + requires std::floating_point class piecewise_constant_distribution : public std::piecewise_constant_distribution { using rep = Q::rep; @@ -417,6 +436,7 @@ public: }; template + requires std::floating_point class piecewise_linear_distribution : public std::piecewise_linear_distribution { using rep = Q::rep;