Make the members of the distributions call the equivalent member of the param_type, instead of duplicating the logic.
Also add FIXME comments about the vector<double> members of the param types, which were changed by LWG 1439 in 2010 but never fixed in libstdc++. libstdc++-v3/ChangeLog: * include/bits/random.h (piecewise_constant_distribution): Simplify member functions and add comments about non-conformance. (piecewise_linear_distribution): Likewise. --- Tested x86_64-linux. Fixing the incorrect types would be an ABI break, so isn't easy. libstdc++-v3/include/bits/random.h | 83 +++++++++--------------------- 1 file changed, 25 insertions(+), 58 deletions(-) diff --git a/libstdc++-v3/include/bits/random.h b/libstdc++-v3/include/bits/random.h index 1f39f0a90be..a90e52704a9 100644 --- a/libstdc++-v3/include/bits/random.h +++ b/libstdc++-v3/include/bits/random.h @@ -5826,15 +5826,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION param_type(const param_type&) = default; param_type& operator=(const param_type&) = default; - std::vector<_RealType> + std::vector<result_type> intervals() const { if (_M_int.empty()) - { - std::vector<_RealType> __tmp(2); - __tmp[1] = _RealType(1); - return __tmp; - } + return std::vector<result_type>{_RealType(0), _RealType(1)}; else return _M_int; } @@ -5857,9 +5853,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION void _M_initialize(); - std::vector<_RealType> _M_int; - std::vector<double> _M_den; - std::vector<double> _M_cp; + std::vector<result_type> _M_int; + std::vector<double> _M_den; // FIXME: should be vector<result_type> + std::vector<double> _M_cp; // FIXME: should be vector<result_type> }; piecewise_constant_distribution() @@ -5901,28 +5897,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /** * @brief Returns a vector of the intervals. */ - std::vector<_RealType> + std::vector<result_type> intervals() const - { - if (_M_param._M_int.empty()) - { - std::vector<_RealType> __tmp(2); - __tmp[1] = _RealType(1); - return __tmp; - } - else - return _M_param._M_int; - } + { return _M_param.intervals(); } /** * @brief Returns a vector of the probability densities. */ std::vector<double> densities() const - { - return _M_param._M_den.empty() - ? std::vector<double>(1, 1.0) : _M_param._M_den; - } + { return _M_param.densities(); } /** * @brief Returns the parameter set of the distribution. @@ -5945,8 +5929,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION result_type min() const { - return _M_param._M_int.empty() - ? result_type(0) : _M_param._M_int.front(); + return _M_param._M_int.empty() ? result_type(0) + : _M_param._M_int.front(); } /** @@ -5955,8 +5939,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION result_type max() const { - return _M_param._M_int.empty() - ? result_type(1) : _M_param._M_int.back(); + return _M_param._M_int.empty() ? result_type(1) + : _M_param._M_int.back(); } /** @@ -6102,19 +6086,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION param_type(size_t __nw, _RealType __xmin, _RealType __xmax, _Func __fw); - // See: http://cpp-next.com/archive/2010/10/implicit-move-must-go/ param_type(const param_type&) = default; param_type& operator=(const param_type&) = default; - std::vector<_RealType> + std::vector<result_type> intervals() const { if (_M_int.empty()) - { - std::vector<_RealType> __tmp(2); - __tmp[1] = _RealType(1); - return __tmp; - } + return std::vector<result_type>{_RealType(0), _RealType(1)}; else return _M_int; } @@ -6137,10 +6116,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION void _M_initialize(); - std::vector<_RealType> _M_int; - std::vector<double> _M_den; - std::vector<double> _M_cp; - std::vector<double> _M_m; + std::vector<result_type> _M_int; + std::vector<double> _M_den; // FIXME: should be vector<result_type> + std::vector<double> _M_cp; // FIXME: should be vector<result_type> + std::vector<double> _M_m; // FIXME: should be vector<result_type> }; piecewise_linear_distribution() @@ -6182,18 +6161,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /** * @brief Return the intervals of the distribution. */ - std::vector<_RealType> + std::vector<result_type> intervals() const - { - if (_M_param._M_int.empty()) - { - std::vector<_RealType> __tmp(2); - __tmp[1] = _RealType(1); - return __tmp; - } - else - return _M_param._M_int; - } + { return _M_param.intervals(); } /** * @brief Return a vector of the probability densities of the @@ -6201,10 +6171,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION */ std::vector<double> densities() const - { - return _M_param._M_den.empty() - ? std::vector<double>(2, 1.0) : _M_param._M_den; - } + { return _M_param.densities(); } /** * @brief Returns the parameter set of the distribution. @@ -6227,8 +6194,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION result_type min() const { - return _M_param._M_int.empty() - ? result_type(0) : _M_param._M_int.front(); + return _M_param._M_int.empty() ? result_type(0) + : _M_param._M_int.front(); } /** @@ -6237,8 +6204,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION result_type max() const { - return _M_param._M_int.empty() - ? result_type(1) : _M_param._M_int.back(); + return _M_param._M_int.empty() ? result_type(1) + : _M_param._M_int.back(); } /** -- 2.47.0