From: paolo Date: Tue, 30 Jun 2009 00:43:21 +0000 (+0000) Subject: 2009-06-29 Paolo Carlini X-Git-Tag: upstream/4.9.2~35133 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ccb188ea2aa001cea29a56849437623a1b8385b1;p=platform%2Fupstream%2Flinaro-gcc.git 2009-06-29 Paolo Carlini * include/bits/random.h (__mod(_Tp)): Use defaults. (struct _Mod): Adjust template parameters. (linear_congruential_engine<>::operator()()): Adjust. (typedef _UInt32Type): Remove. (mersenne_twister_engine<>::initialization_multiplier): Fix type. * include/bits/random.tcc (struct _Mod): Adjust template parameters. (linear_congruential_engine<>::seed(result_type)): Adjust __mod calls. (mersenne_twister_engine<>::seed(result_type)): Likewise. (mersenne_twister_engine<>::seed(seed_seq&)): Likewise. (subtract_with_carry_engine<>::seed(result_type)): Likewise. (subtract_with_carry_engine<>::seed(seed_seq&)): Likewise. (seed_seq::seed_seq(std::initializer_list<>)): Likewise. (seed_seq::seed_seq(_InputIterator, _InputIterator)): Likewise. (seed_seq::generate(_RandomAccessIterator, _RandomAccessIterator)): Likewise. * include/bits/random.tcc (mersenne_twister_engine<>::seed(result_type)): Fix i usage in the formula (i mod n). (mersenne_twister_engine<>::seed(seed_seq&)): Use uint_least32_t as array type. (subtract_with_carry_engine<>::seed(seed_seq&)): Likewise; fix array size. (subtract_with_carry_engine<>::seed(result_type)): Fix; also use uint_least32_t. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@149074 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 709b42c..6704b43 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,32 @@ +2009-06-29 Paolo Carlini + + * include/bits/random.h (__mod(_Tp)): Use defaults. + (struct _Mod): Adjust template parameters. + (linear_congruential_engine<>::operator()()): Adjust. + (typedef _UInt32Type): Remove. + (mersenne_twister_engine<>::initialization_multiplier): Fix type. + * include/bits/random.tcc (struct _Mod): Adjust template parameters. + (linear_congruential_engine<>::seed(result_type)): Adjust __mod + calls. + (mersenne_twister_engine<>::seed(result_type)): Likewise. + (mersenne_twister_engine<>::seed(seed_seq&)): Likewise. + (subtract_with_carry_engine<>::seed(result_type)): Likewise. + (subtract_with_carry_engine<>::seed(seed_seq&)): Likewise. + (seed_seq::seed_seq(std::initializer_list<>)): Likewise. + (seed_seq::seed_seq(_InputIterator, _InputIterator)): Likewise. + (seed_seq::generate(_RandomAccessIterator, _RandomAccessIterator)): + Likewise. + + * include/bits/random.tcc + (mersenne_twister_engine<>::seed(result_type)): Fix i usage in the + formula (i mod n). + (mersenne_twister_engine<>::seed(seed_seq&)): Use uint_least32_t + as array type. + (subtract_with_carry_engine<>::seed(seed_seq&)): Likewise; fix array + size. + (subtract_with_carry_engine<>::seed(result_type)): Fix; also use + uint_least32_t. + 2009-06-24 Jonathan Wakely * include/std/future (shared_future): Adjust doxygen comment. diff --git a/libstdc++-v3/include/bits/random.h b/libstdc++-v3/include/bits/random.h index 099c5fa..aa34fcc 100644 --- a/libstdc++-v3/include/bits/random.h +++ b/libstdc++-v3/include/bits/random.h @@ -68,18 +68,15 @@ namespace std struct _Shift<_UIntType, __w, true> { static const _UIntType __value = _UIntType(1) << __w; }; - template + template struct _Mod; // Dispatch based on modulus value to prevent divide-by-zero compile-time // errors when m == 0. - template + template inline _Tp __mod(_Tp __x) - { return _Mod<_Tp, __a, __c, __m, __m == 0>::__calc(__x); } - - typedef __gnu_cxx::__conditional_type<(sizeof(unsigned) == 4), - unsigned, unsigned long>::__type _UInt32Type; + { return _Mod<_Tp, __m, __a, __c, __m == 0>::__calc(__x); } /* * An adaptor class for converting the output of any Generator into @@ -253,7 +250,7 @@ namespace std result_type operator()() { - _M_x = __detail::__mod<_UIntType, __a, __c, __m>(_M_x); + _M_x = __detail::__mod<_UIntType, __m, __a, __c>(_M_x); return _M_x; } @@ -281,8 +278,7 @@ namespace std * @returns __os. */ template + _UIntType1 __m1, typename _CharT, typename _Traits> friend std::basic_ostream<_CharT, _Traits>& operator<<(std::basic_ostream<_CharT, _Traits>&, const std::linear_congruential_engine<_UIntType1, @@ -302,8 +298,7 @@ namespace std * @returns __is. */ template + _UIntType1 __m1, typename _CharT, typename _Traits> friend std::basic_istream<_CharT, _Traits>& operator>>(std::basic_istream<_CharT, _Traits>&, std::linear_congruential_engine<_UIntType1, __a1, @@ -371,6 +366,10 @@ namespace std "mersenne_twister_engine template arguments out of bounds"); static_assert(__c <= (__detail::_Shift<_UIntType, __w>::__value - 1), "mersenne_twister_engine template arguments out of bounds"); + static_assert(__d <= (__detail::_Shift<_UIntType, __w>::__value - 1), + "mersenne_twister_engine template arguments out of bounds"); + static_assert(__f <= (__detail::_Shift<_UIntType, __w>::__value - 1), + "mersenne_twister_engine template arguments out of bounds"); public: /** The type of the generated random value. */ @@ -389,7 +388,7 @@ namespace std static const size_t tempering_t = __t; static const result_type tempering_c = __c; static const size_t tempering_l = __l; - static const size_t initialization_multiplier = __f; + static const result_type initialization_multiplier = __f; static const result_type default_seed = 5489u; // constructors and member function @@ -1351,11 +1350,11 @@ namespace std typedef subtract_with_carry_engine ranlux24_base; - typedef discard_block_engine ranlux24; - typedef subtract_with_carry_engine ranlux48_base; + typedef discard_block_engine ranlux24; + typedef discard_block_engine ranlux48; /** diff --git a/libstdc++-v3/include/bits/random.tcc b/libstdc++-v3/include/bits/random.tcc index 87c4618..c8b6590 100644 --- a/libstdc++-v3/include/bits/random.tcc +++ b/libstdc++-v3/include/bits/random.tcc @@ -45,7 +45,7 @@ namespace std // // Preconditions: a > 0, m > 0. // - template + template struct _Mod { static _Tp @@ -80,8 +80,8 @@ namespace std // Special case for m == 0 -- use unsigned integer overflow as modulo // operator. - template - struct _Mod<_Tp, __a, __c, __m, true> + template + struct _Mod<_Tp, __m, __a, __c, true> { static _Tp __calc(_Tp __x) @@ -98,11 +98,11 @@ namespace std linear_congruential_engine<_UIntType, __a, __c, __m>:: seed(result_type __s) { - if ((__detail::__mod<_UIntType, 1U, 0U, __m>(__c) == 0U) - && (__detail::__mod<_UIntType, 1U, 0U, __m>(__s) == 0U)) - _M_x = __detail::__mod<_UIntType, 1U, 0U, __m>(1U); + if ((__detail::__mod<_UIntType, __m>(__c) == 0) + && (__detail::__mod<_UIntType, __m>(__s) == 0)) + _M_x = 1; else - _M_x = __detail::__mod<_UIntType, 1U, 0U, __m>(__s); + _M_x = __detail::__mod<_UIntType, __m>(__s); } /** @@ -118,8 +118,8 @@ namespace std const _UIntType __k = (__k0 + 31) / 32; _UIntType __arr[__k + 3]; __q.generate(__arr + 0, __arr + __k + 3); - _UIntType __factor = 1U; - _UIntType __sum = 0U; + _UIntType __factor = 1u; + _UIntType __sum = 0u; for (size_t __j = 0; __j < __k; ++__j) { __sum += __arr[__j + 3] * __factor; @@ -179,7 +179,7 @@ namespace std __s, __b, __t, __c, __l, __f>:: seed(result_type __sd) { - _M_x[0] = __detail::__mod<_UIntType, 1, 0, + _M_x[0] = __detail::__mod<_UIntType, __detail::_Shift<_UIntType, __w>::__value>(__sd); for (size_t __i = 1; __i < state_size; ++__i) @@ -187,8 +187,8 @@ namespace std _UIntType __x = _M_x[__i - 1]; __x ^= __x >> (__w - 2); __x *= __f; - __x += __i; - _M_x[__i] = __detail::__mod<_UIntType, 1, 0, + __x += __detail::__mod<_UIntType, __n>(__i); + _M_x[__i] = __detail::__mod<_UIntType, __detail::_Shift<_UIntType, __w>::__value>(__x); } _M_p = state_size; @@ -206,35 +206,35 @@ namespace std { const _UIntType __upper_mask = (~_UIntType()) << __r; const size_t __k = (__w + 31) / 32; - _UIntType __arr[__k * __n]; - __q.generate(__arr + 0, __arr + __k * __n); + uint_least32_t __arr[__n * __k]; + __q.generate(__arr + 0, __arr + __n * __k); bool __zero = true; for (size_t __i = 0; __i < state_size; ++__i) { - _UIntType __factor = 1U; - _UIntType __sum = 0U; + _UIntType __factor = 1u; + _UIntType __sum = 0u; for (size_t __j = 0; __j < __k; ++__j) { - __sum += __arr[__i * __k + __j] * __factor; + __sum += __arr[__k * __i + __j] * __factor; __factor *= __detail::_Shift<_UIntType, 32>::__value; } - _M_x[__i] = __detail::__mod<_UIntType, 1U, 0U, - __detail::_Shift<_UIntType, __w>::__value>(__sum); + _M_x[__i] = __detail::__mod<_UIntType, + __detail::_Shift<_UIntType, __w>::__value>(__sum); if (__zero) { if (__i == 0) { - if ((_M_x[0] & __upper_mask) != 0U) + if ((_M_x[0] & __upper_mask) != 0u) __zero = false; } - else if (_M_x[__i] != 0U) + else if (_M_x[__i] != 0u) __zero = false; } } if (__zero) - _M_x[0] = __detail::_Shift<_UIntType, __w - 1U>::__value; + _M_x[0] = __detail::_Shift<_UIntType, __w - 1>::__value; } template:: seed(result_type __value) { - if (__value == 0) - __value = default_seed; - - std::linear_congruential_engine - __lcg(__value); + std::linear_congruential_engine + __lcg(__value == 0u ? default_seed : __value); - // I hope this is right. The "10000" tests work for the ranluxen. - const size_t __n = (word_size + 31) / 32; + const size_t __n = (__w + 31) / 32; for (size_t __i = 0; __i < long_lag; ++__i) { - _UIntType __sum = 0U; - _UIntType __factor = 1U; + _UIntType __sum = 0u; + _UIntType __factor = 1u; for (size_t __j = 0; __j < __n; ++__j) { - __sum += __detail::__mod<__detail::_UInt32Type, 1, 0, 0> + __sum += __detail::__mod::__value> (__lcg()) * __factor; __factor *= __detail::_Shift<_UIntType, 32>::__value; } - _M_x[__i] = __detail::__mod<_UIntType, 1, 0, + _M_x[__i] = __detail::__mod<_UIntType, __detail::_Shift<_UIntType, __w>::__value>(__sum); } _M_carry = (_M_x[long_lag - 1] == 0) ? 1 : 0; @@ -376,21 +373,20 @@ namespace std subtract_with_carry_engine<_UIntType, __w, __s, __r>:: seed(seed_seq& __q) { - const size_t __n = (word_size + 31) / 32; - _UIntType __arr[long_lag + __n]; - __q.generate(__arr + 0, __arr + long_lag + __n); + const size_t __k = (__w + 31) / 32; + uint_least32_t __arr[__r * __k]; + __q.generate(__arr + 0, __arr + __r * __k); for (size_t __i = 0; __i < long_lag; ++__i) { - _UIntType __sum = 0U; - _UIntType __factor = 1U; - for (size_t __j = 0; __j < __n; ++__j) + _UIntType __sum = 0u; + _UIntType __factor = 1u; + for (size_t __j = 0; __j < __k; ++__j) { - __sum += __detail::__mod<__detail::_UInt32Type, 1, 0, 0> - (__arr[__i * __n + __j]) * __factor; + __sum += __arr[__k * __i + __j] * __factor; __factor *= __detail::_Shift<_UIntType, 32>::__value; } - _M_x[__i] = __detail::__mod<_UIntType, 1, 0, + _M_x[__i] = __detail::__mod<_UIntType, __detail::_Shift<_UIntType, __w>::__value>(__sum); } _M_carry = (_M_x[long_lag - 1] == 0) ? 1 : 0; @@ -2485,7 +2481,7 @@ namespace std seed_seq::seed_seq(std::initializer_list<_IntType> __il) { for (auto __iter = __il.begin(); __iter != __il.end(); ++__iter) - _M_v.push_back(__detail::__mod::__value>(*__iter)); } @@ -2493,7 +2489,7 @@ namespace std seed_seq::seed_seq(_InputIterator __begin, _InputIterator __end) { for (_InputIterator __iter = __begin; __iter != __end; ++__iter) - _M_v.push_back(__detail::__mod::__value>(*__iter)); } @@ -2508,7 +2504,7 @@ namespace std if (__begin == __end) return; - std::fill(__begin, __end, _Type(0x8b8b8b8bU)); + std::fill(__begin, __end, _Type(0x8b8b8b8bu)); const size_t __n = __end - __begin; const size_t __s = _M_v.size(); @@ -2527,8 +2523,8 @@ namespace std ^ __begin[(__k + __p) % __n] ^ __begin[(__k - 1) % __n]); _Type __r1 = __arg ^ (__arg << 27); - __r1 = __detail::__mod<_Type, 1664525U, 0U, - __detail::_Shift<_Type, 32>::__value>(__r1); + __r1 = __detail::__mod<_Type, __detail::_Shift<_Type, 32>::__value, + 1664525u, 0u>(__r1); _Type __r2 = __r1; if (__k == 0) __r2 += __s; @@ -2536,8 +2532,8 @@ namespace std __r2 += __k % __n + _M_v[__k - 1]; else __r2 += __k % __n; - __r2 = __detail::__mod<_Type, 1U, 0U, - __detail::_Shift<_Type, 32>::__value>(__r2); + __r2 = __detail::__mod<_Type, + __detail::_Shift<_Type, 32>::__value>(__r2); __begin[(__k + __p) % __n] += __r1; __begin[(__k + __q) % __n] += __r2; __begin[__k % __n] = __r2; @@ -2549,11 +2545,11 @@ namespace std + __begin[(__k + __p) % __n] + __begin[(__k - 1) % __n]); _Type __r3 = __arg ^ (__arg << 27); - __r3 = __detail::__mod<_Type, 1566083941U, 0U, - __detail::_Shift<_Type, 32>::__value>(__r3); + __r3 = __detail::__mod<_Type, __detail::_Shift<_Type, 32>::__value, + 1566083941u, 0u>(__r3); _Type __r4 = __r3 - __k % __n; - __r4 = __detail::__mod<_Type, 1U, 0U, - __detail::_Shift<_Type, 32>::__value>(__r4); + __r4 = __detail::__mod<_Type, + __detail::_Shift<_Type, 32>::__value>(__r4); __begin[(__k + __p) % __n] ^= __r4; __begin[(__k + __q) % __n] ^= __r3; __begin[__k % __n] = __r4;