]> gcc.gnu.org Git - gcc.git/commitdiff
random (variate_generator<>::min, [...]): Return non-trivial values when _Engine_resu...
authorPaolo Carlini <pcarlini@suse.de>
Sat, 3 Nov 2007 23:27:55 +0000 (23:27 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Sat, 3 Nov 2007 23:27:55 +0000 (23:27 +0000)
2007-11-03  Paolo Carlini  <pcarlini@suse.de>
    Kai-Uwe Bux  <bux@kubux.net>

* 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 <bux@kubux.net>
From-SVN: r129875

libstdc++-v3/ChangeLog
libstdc++-v3/include/tr1_impl/random

index b477561ca69d26c844ce376866b8c1b322f9f482..968789991fc46784441c1448e4dcdced28c0255c 100644 (file)
@@ -1,3 +1,10 @@
+2007-11-03  Paolo Carlini  <pcarlini@suse.de>
+           Kai-Uwe Bux  <bux@kubux.net>
+
+       * 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  <pcarlini@suse.de>
 
        * include/bits/stl_algo.h (minmax, minmax_element): Add.
index 4ce7d8b4c47bc375c3a39e2684dfb062e6e1fcff..02ad85af7e35bfd7e3ee7a0796016fddd33794c4 100644 (file)
@@ -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<result_type>::value)
            __return_value = _M_g.min();
-         else if (!is_integral<result_type>::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<result_type>::value)
            __return_value = _M_g.max();
          else if (!is_integral<result_type>::value)
            __return_value = result_type(1);
+         else
+           __return_value = std::numeric_limits<result_type>::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<result_type>::value)
+           __return_value = _M_g();
+         else if (!is_integral<_Engine_result_type>::value
+                  && !is_integral<result_type>::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<result_type>::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<result_type>::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 _Engine, typename _Distribution>
-      typename _Adaptor<_Engine, _Distribution>::result_type
-      _Adaptor<_Engine, _Distribution>::
-      operator()()
-      {
-       result_type __return_value = 0;
-       if (is_integral<_Engine_result_type>::value
-           && is_integral<result_type>::value)
-         __return_value = _M_g();
-       else if (is_integral<_Engine_result_type>::value
-                && !is_integral<result_type>::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<result_type>::value)
-         __return_value = result_type(_M_g() - _M_g.min())
-           / result_type(_M_g.max() - _M_g.min());
-       return __return_value;
-      }
   } // namespace __detail
 
   /**
This page took 0.071223 seconds and 5 git commands to generate.