From 410fce929b899a1c228e71f9decfd23918390a48 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Sat, 10 Jun 2006 03:39:38 +0000 Subject: [PATCH] random (random_device::random_device(const std::string& = "/dev/urandom")): Open in binary mode. 2006-06-09 Paolo Carlini * include/tr1/random (random_device::random_device(const std::string& = "/dev/urandom")): Open in binary mode. * include/tr1/random (random_device::random_device(const std::string& = "rand")): Use mersenne_twister. (random_device::_M_strtoul): New. (random_device::operator()()): Update. * include/tr1/random: Minor stylistic changes, consistently qualify with std::. From-SVN: r114539 --- libstdc++-v3/ChangeLog | 13 ++++ libstdc++-v3/include/tr1/random | 112 ++++++++++++++++++-------------- 2 files changed, 75 insertions(+), 50 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index a2b158edb8f7..69b390267ac9 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,16 @@ +2006-06-09 Paolo Carlini + + * include/tr1/random (random_device::random_device(const + std::string& = "/dev/urandom")): Open in binary mode. + + * include/tr1/random (random_device::random_device(const + std::string& = "rand")): Use mersenne_twister. + (random_device::_M_strtoul): New. + (random_device::operator()()): Update. + + * include/tr1/random: Minor stylistic changes, consistently + qualify with std::. + 2006-06-09 Paolo Carlini * acinclude.m4 ([GLIBCXX_CHECK_RANDOM_TR1]): New, check for diff --git a/libstdc++-v3/include/tr1/random b/libstdc++-v3/include/tr1/random index 4a797c116290..4ecaccaf58a4 100644 --- a/libstdc++-v3/include/tr1/random +++ b/libstdc++-v3/include/tr1/random @@ -44,7 +44,6 @@ #include #include #include -#include #include namespace std @@ -560,8 +559,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * an error state. */ template - friend basic_ostream<_CharT, _Traits>& - operator<<(basic_ostream<_CharT, _Traits>& __os, + friend std::basic_ostream<_CharT, _Traits>& + operator<<(std::basic_ostream<_CharT, _Traits>& __os, const mersenne_twister& __x) { std::copy(__x._M_x, __x._M_x + state_size, @@ -580,8 +579,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * an error state. */ template - friend basic_istream<_CharT, _Traits>& - operator>>(basic_istream<_CharT, _Traits>& __is, + friend std::basic_istream<_CharT, _Traits>& + operator>>(std::basic_istream<_CharT, _Traits>& __is, mersenne_twister& __x) { for (int __i = 0; __i < state_size; ++__i) @@ -769,8 +768,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * an error state. */ template - friend basic_ostream<_CharT, _Traits>& - operator<<(basic_ostream<_CharT, _Traits>& __os, + friend std::basic_ostream<_CharT, _Traits>& + operator<<(std::basic_ostream<_CharT, _Traits>& __os, const subtract_with_carry& __x) { std::copy(__x._M_x, __x._M_x + long_lag, @@ -789,8 +788,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * an error state. */ template - friend basic_istream<_CharT, _Traits>& - operator>>(basic_istream<_CharT, _Traits>& __is, + friend std::basic_istream<_CharT, _Traits>& + operator>>(std::basic_istream<_CharT, _Traits>& __is, subtract_with_carry& __x) { for (int __i = 0; __i < long_lag; ++__i) @@ -961,8 +960,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * an error state. */ template - friend basic_ostream<_CharT, _Traits>& - operator<<(basic_ostream<_CharT, _Traits>& __os, + friend std::basic_ostream<_CharT, _Traits>& + operator<<(std::basic_ostream<_CharT, _Traits>& __os, const discard_block& __x) { return __os << __x._M_b << " " << __x._M_n; } @@ -977,8 +976,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * an error state. */ template - friend basic_istream<_CharT, _Traits>& - operator>>(basic_istream<_CharT, _Traits>& __is, + friend std::basic_istream<_CharT, _Traits>& + operator>>(std::basic_istream<_CharT, _Traits>& __is, discard_block& __x) { return __is >> __x._M_b >> __x._M_n; } @@ -1129,8 +1128,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * an error state. */ template - friend basic_ostream<_CharT, _Traits>& - operator<<(basic_ostream<_CharT, _Traits>& __os, + friend std::basic_ostream<_CharT, _Traits>& + operator<<(std::basic_ostream<_CharT, _Traits>& __os, const xor_combine& __x) { return __os << __x.base1() << " " << __x.base1(); } @@ -1145,8 +1144,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * an error state. */ template - friend basic_istream<_CharT, _Traits>& - operator>>(basic_istream<_CharT, _Traits>& __is, + friend std::basic_istream<_CharT, _Traits>& + operator>>(std::basic_istream<_CharT, _Traits>& __is, xor_combine& __x) { return __is >> __x._M_b1 >> __x._M_b2; } @@ -1165,15 +1164,17 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) public: // types typedef unsigned int result_type; - + // constructors, destructors and member functions #ifdef _GLIBCXX_USE_RANDOM_TR1 + explicit random_device(const std::string& __token = "/dev/urandom") { if ((__token != "/dev/urandom" && __token != "/dev/random") - || !_M_filebuf.open(__token.c_str(), std::ios_base::in)) + || !_M_filebuf.open(__token.c_str(), + std::ios_base::in | std::ios_base::binary)) std::__throw_runtime_error(__N("random_device::" "random_device(const std::string&)")); } @@ -1182,21 +1183,30 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) { _M_filebuf.close(); } #else + explicit random_device(const std::string& __token = "rand") + : _M_mt(_M_strtoul(__token)) { } + + private: + static unsigned long + _M_strtoul(const std::string& __str) { - if (__token != "rand") + unsigned long __ret = 5489UL; + if (__str != "rand") { - std::stringstream __ss(__token); - unsigned int __seed; - __ss >> __seed; - if (__ss.fail()) - std::__throw_runtime_error(__N("random_device::random_device" + const char* __nptr = __str.c_str(); + char* __endptr; + __ret = std::strtoul(__nptr, &__endptr, 0); + if (*__nptr == '\0' || *__endptr != '\0') + std::__throw_runtime_error(__N("random_device::_M_strtoul" "(const std::string&)")); - else - std::srand(__seed); } + return __ret; } + + public: + #endif result_type @@ -1219,7 +1229,7 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) _M_filebuf.sgetn(reinterpret_cast(&__ret), sizeof(result_type)); return __ret; #else - return max() * (std::rand() / double(RAND_MAX)); + return _M_mt(); #endif } @@ -1229,7 +1239,9 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) #ifdef _GLIBCXX_USE_RANDOM_TR1 std::filebuf _M_filebuf; -#endif +#else + mt19937 _M_mt; +#endif }; /* @} */ // group tr1_random_generators @@ -1325,8 +1337,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * an error state. */ template - friend basic_ostream<_CharT, _Traits>& - operator<<(basic_ostream<_CharT, _Traits>& __os, + friend std::basic_ostream<_CharT, _Traits>& + operator<<(std::basic_ostream<_CharT, _Traits>& __os, const uniform_int& __x) { return __os << __x._M_min << " " << __x._M_max; } @@ -1340,8 +1352,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * @returns The input stream with @p __u extracted or in an error state. */ template - friend basic_istream<_CharT, _Traits>& - operator>>(basic_istream<_CharT, _Traits>& __is, uniform_int& __u) + friend std::basic_istream<_CharT, _Traits>& + operator>>(std::basic_istream<_CharT, _Traits>& __is, uniform_int& __u) { return __is >> __u._M_min >> __u._M_max; } private: @@ -1428,8 +1440,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * an error state. */ template - friend basic_ostream<_CharT, _Traits>& - operator<<(basic_ostream<_CharT, _Traits>& __os, + friend std::basic_ostream<_CharT, _Traits>& + operator<<(std::basic_ostream<_CharT, _Traits>& __os, const bernoulli_distribution& __x) { return __os << __x.p(); } @@ -1443,8 +1455,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * @returns The input stream with @p __u extracted or in an error state. */ template - friend basic_istream<_CharT, _Traits>& - operator>>(basic_istream<_CharT, _Traits>& __is, + friend std::basic_istream<_CharT, _Traits>& + operator>>(std::basic_istream<_CharT, _Traits>& __is, bernoulli_distribution& __u) { return __is >> __u._M_p; } @@ -1518,8 +1530,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * an error state. */ template - friend basic_ostream<_CharT, _Traits>& - operator<<(basic_ostream<_CharT, _Traits>& __os, + friend std::basic_ostream<_CharT, _Traits>& + operator<<(std::basic_ostream<_CharT, _Traits>& __os, const geometric_distribution& __x) { return __os << __x.p(); } @@ -1533,8 +1545,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * @returns The input stream with @p __u extracted or in an error state. */ template - friend basic_istream<_CharT, _Traits>& - operator>>(basic_istream<_CharT, _Traits>& __is, + friend std::basic_istream<_CharT, _Traits>& + operator>>(std::basic_istream<_CharT, _Traits>& __is, geometric_distribution& __u) { __is >> __u._M_p; @@ -1605,8 +1617,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * an error state. */ template - friend basic_ostream<_CharT, _Traits>& - operator<<(basic_ostream<_CharT, _Traits>& __os, + friend std::basic_ostream<_CharT, _Traits>& + operator<<(std::basic_ostream<_CharT, _Traits>& __os, const uniform_real& __x) { return __os << __x.min() << " " << __x.max(); } @@ -1620,9 +1632,9 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * @returns The input stream with @p __u extracted or in an error state. */ template - friend basic_istream<_CharT, _Traits>& - operator>>(basic_istream<_CharT, _Traits>& __is, - uniform_real& __u) + friend std::basic_istream<_CharT, _Traits>& + operator>>(std::basic_istream<_CharT, _Traits>& __is, + uniform_real& __u) { return __is >> __u._M_min >> __u._M_max; } protected: @@ -1694,8 +1706,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * an error state. */ template - friend basic_ostream<_CharT, _Traits>& - operator<<(basic_ostream<_CharT, _Traits>& __os, + friend std::basic_ostream<_CharT, _Traits>& + operator<<(std::basic_ostream<_CharT, _Traits>& __os, const exponential_distribution& __x) { return __os << __x.lambda(); } @@ -1709,8 +1721,8 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * @returns The input stream with @p __u extracted or in an error state. */ template - friend basic_istream<_CharT, _Traits>& - operator>>(basic_istream<_CharT, _Traits>& __is, + friend std::basic_istream<_CharT, _Traits>& + operator>>(std::basic_istream<_CharT, _Traits>& __is, exponential_distribution& __u) { return __is >> __u._M_lambda; }