From 202d1d5f54c5cb27b90358ac754acbea5697e40a Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Sat, 3 Nov 2007 23:27:55 +0000 Subject: [PATCH] random (variate_generator<>::min, [...]): Return non-trivial values when _Engine_result_type is a floating point type and... 2007-11-03 Paolo Carlini Kai-Uwe Bux * include/tr1_impl/random (variate_generator<>::min, max, operator()()): Return non-trivial values when _Engine_result_type is a floating point type and result_type is an integer type. Co-Authored-By: Kai-Uwe Bux From-SVN: r129875 --- libstdc++-v3/ChangeLog | 7 ++++ libstdc++-v3/include/tr1_impl/random | 65 +++++++++++++++++++----------------- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b477561..9687899 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2007-11-03 Paolo Carlini + Kai-Uwe Bux + + * include/tr1_impl/random (variate_generator<>::min, max, + operator()()): Return non-trivial values when _Engine_result_type + is a floating point type and result_type is an integer type. + 2007-11-02 Paolo Carlini * include/bits/stl_algo.h (minmax, minmax_element): Add. diff --git a/libstdc++-v3/include/tr1_impl/random b/libstdc++-v3/include/tr1_impl/random index 4ce7d8b..02ad85a 100644 --- a/libstdc++-v3/include/tr1_impl/random +++ b/libstdc++-v3/include/tr1_impl/random @@ -89,11 +89,11 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 result_type min() const { - result_type __return_value = 0; + result_type __return_value; if (is_integral<_Engine_result_type>::value && is_integral::value) __return_value = _M_g.min(); - else if (!is_integral::value) + else __return_value = result_type(0); return __return_value; } @@ -101,48 +101,51 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 result_type max() const { - result_type __return_value = 0; + result_type __return_value; if (is_integral<_Engine_result_type>::value && is_integral::value) __return_value = _M_g.max(); else if (!is_integral::value) __return_value = result_type(1); + else + __return_value = std::numeric_limits::max() - 1; return __return_value; } + /* + * Converts a value generated by the adapted random number generator + * into a value in the input domain for the dependent random number + * distribution. + * + * Because the type traits are compile time constants only the + * appropriate clause of the if statements will actually be emitted + * by the compiler. + */ result_type - operator()(); + operator()() + { + result_type __return_value; + if (is_integral<_Engine_result_type>::value + && is_integral::value) + __return_value = _M_g(); + else if (!is_integral<_Engine_result_type>::value + && !is_integral::value) + __return_value = result_type(_M_g() - _M_g.min()) + / result_type(_M_g.max() - _M_g.min()); + else if (is_integral<_Engine_result_type>::value + && !is_integral::value) + __return_value = result_type(_M_g() - _M_g.min()) + / result_type(_M_g.max() - _M_g.min() + result_type(1)); + else + __return_value = (((_M_g() - _M_g.min()) + / (_M_g.max() - _M_g.min())) + * std::numeric_limits::max()); + return __return_value; + } private: _Engine _M_g; }; - - /* - * Converts a value generated by the adapted random number generator into a - * value in the input domain for the dependent random number distribution. - * - * Because the type traits are compile time constants only the appropriate - * clause of the if statements will actually be emitted by the compiler. - */ - template - typename _Adaptor<_Engine, _Distribution>::result_type - _Adaptor<_Engine, _Distribution>:: - operator()() - { - result_type __return_value = 0; - if (is_integral<_Engine_result_type>::value - && is_integral::value) - __return_value = _M_g(); - else if (is_integral<_Engine_result_type>::value - && !is_integral::value) - __return_value = result_type(_M_g() - _M_g.min()) - / result_type(_M_g.max() - _M_g.min() + result_type(1)); - else if (!is_integral<_Engine_result_type>::value - && !is_integral::value) - __return_value = result_type(_M_g() - _M_g.min()) - / result_type(_M_g.max() - _M_g.min()); - return __return_value; - } } // namespace __detail /** -- 2.7.4