]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
random.h (mersenne_twister_engine): Don't inline discard here.
authorUlrich Drepper <drepper@gmail.com>
Mon, 27 Aug 2012 12:08:16 +0000 (12:08 +0000)
committerUlrich Drepper <drepper@gcc.gnu.org>
Mon, 27 Aug 2012 12:08:16 +0000 (12:08 +0000)
* include/bits/random.h (mersenne_twister_engine): Don't inline
discard here.  New member function _M_gen_rand.
* include/bits/random.tcc (mersenne_twister_engine<>::_M_gen_rand):
New function.  Extracted from operator().
(mersenne_twister_engine<>::discard): New implementation which
skips in large steps.
(mersenne_twister_engine<>::operator()): Use _M_gen_rand.

From-SVN: r190711

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/random.h
libstdc++-v3/include/bits/random.tcc

index 057d4357638d5c83d985252b9f7aadaeda3326d1..bc088e8c167a6b2faaabfa9e0f4a0d40b84fef92 100644 (file)
@@ -1,3 +1,13 @@
+012-08-22  Ulrich Drepper  <drepper@gmail.com>
+
+       * include/bits/random.h (mersenne_twister_engine): Don't inline
+       discard here.  New member function _M_gen_rand.
+       * include/bits/random.tcc (mersenne_twister_engine<>::_M_gen_rand):
+       New function.  Extracted from operator().
+       (mersenne_twister_engine<>::discard): New implementation which
+       skips in large steps.
+       (mersenne_twister_engine<>::operator()): Use _M_gen_rand.
+                                                       
 2012-08-26  Marc Glisse  <marc.glisse@inria.fr>
            Paolo Carlini  <paolo.carlini@oracle.com>
 
index b43b5f49c4c468d29007fed20b96e2eeccd3dcab..35aceea85676a0f02882227243f79d15a6f9797a 100644 (file)
@@ -530,11 +530,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        * @brief Discard a sequence of random numbers.
        */
       void
-      discard(unsigned long long __z)
-      {
-       for (; __z != 0ULL; --__z)
-         (*this)();
-      }
+      discard(unsigned long long __z);
 
       result_type
       operator()();
@@ -610,6 +606,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                   __l1, __f1>& __x);
 
     private:
+      void _M_gen_rand();
+
       _UIntType _M_x[state_size];
       size_t    _M_p;
     };
index a3924bea681a2a47a775131abcd0023863a64e17..6f501b1e98261ed0a8be3186756f3f70f4901541 100644 (file)
@@ -387,6 +387,60 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
           _M_x[0] = __detail::_Shift<_UIntType, __w - 1>::__value;
       }
 
+  template<typename _UIntType, size_t __w,
+          size_t __n, size_t __m, size_t __r,
+          _UIntType __a, size_t __u, _UIntType __d, size_t __s,
+          _UIntType __b, size_t __t, _UIntType __c, size_t __l,
+          _UIntType __f>
+    void
+    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
+                           __s, __b, __t, __c, __l, __f>::
+    _M_gen_rand(void)
+    {
+      const _UIntType __upper_mask = (~_UIntType()) << __r;
+      const _UIntType __lower_mask = ~__upper_mask;
+
+      for (size_t __k = 0; __k < (__n - __m); ++__k)
+        {
+         _UIntType __y = ((_M_x[__k] & __upper_mask)
+                          | (_M_x[__k + 1] & __lower_mask));
+         _M_x[__k] = (_M_x[__k + __m] ^ (__y >> 1)
+                      ^ ((__y & 0x01) ? __a : 0));
+        }
+
+      for (size_t __k = (__n - __m); __k < (__n - 1); ++__k)
+       {
+         _UIntType __y = ((_M_x[__k] & __upper_mask)
+                          | (_M_x[__k + 1] & __lower_mask));
+         _M_x[__k] = (_M_x[__k + (__m - __n)] ^ (__y >> 1)
+                      ^ ((__y & 0x01) ? __a : 0));
+       }
+
+      _UIntType __y = ((_M_x[__n - 1] & __upper_mask)
+                      | (_M_x[0] & __lower_mask));
+      _M_x[__n - 1] = (_M_x[__m - 1] ^ (__y >> 1)
+                      ^ ((__y & 0x01) ? __a : 0));
+      _M_p = 0;
+    }
+
+  template<typename _UIntType, size_t __w,
+          size_t __n, size_t __m, size_t __r,
+          _UIntType __a, size_t __u, _UIntType __d, size_t __s,
+          _UIntType __b, size_t __t, _UIntType __c, size_t __l,
+          _UIntType __f>
+    void
+    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
+                           __s, __b, __t, __c, __l, __f>::
+    discard(unsigned long long __z)
+    {
+      while (__z > state_size - _M_p)
+       {
+         __z -= state_size - _M_p;
+         _M_gen_rand();
+       }
+      _M_p += __z;
+    }
+
   template<typename _UIntType, size_t __w,
           size_t __n, size_t __m, size_t __r,
           _UIntType __a, size_t __u, _UIntType __d, size_t __s,
@@ -401,32 +455,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     {
       // Reload the vector - cost is O(n) amortized over n calls.
       if (_M_p >= state_size)
-       {
-         const _UIntType __upper_mask = (~_UIntType()) << __r;
-         const _UIntType __lower_mask = ~__upper_mask;
-
-         for (size_t __k = 0; __k < (__n - __m); ++__k)
-           {
-             _UIntType __y = ((_M_x[__k] & __upper_mask)
-                              | (_M_x[__k + 1] & __lower_mask));
-             _M_x[__k] = (_M_x[__k + __m] ^ (__y >> 1)
-                          ^ ((__y & 0x01) ? __a : 0));
-           }
-
-         for (size_t __k = (__n - __m); __k < (__n - 1); ++__k)
-           {
-             _UIntType __y = ((_M_x[__k] & __upper_mask)
-                              | (_M_x[__k + 1] & __lower_mask));
-             _M_x[__k] = (_M_x[__k + (__m - __n)] ^ (__y >> 1)
-                          ^ ((__y & 0x01) ? __a : 0));
-           }
-
-         _UIntType __y = ((_M_x[__n - 1] & __upper_mask)
-                          | (_M_x[0] & __lower_mask));
-         _M_x[__n - 1] = (_M_x[__m - 1] ^ (__y >> 1)
-                          ^ ((__y & 0x01) ? __a : 0));
-         _M_p = 0;
-       }
+       _M_gen_rand();
 
       // Calculate o(x(i)).
       result_type __z = _M_x[_M_p++];