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