diff options
author | Richard Guenther <rguenther@suse.de> | 2008-11-23 19:35:24 +0000 |
---|---|---|
committer | Richard Guenther <rguenther@suse.de> | 2008-11-23 19:35:24 +0000 |
commit | cb198101579d9d77d71e696df04b50137d0bd575 (patch) | |
tree | c7a1c48cc12bcc550dec254de48d9ef26c123d8f /libstdc++-v3/include/tr1_impl/random | |
parent | 4506ab01ebaada7b1267e52d784cb052cabd3d0b (diff) |
2008-11-23 Richard Guenther <rguenther@suse.de>
Merge from trunk r142135.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/alias-improvements@142140 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/tr1_impl/random')
-rw-r--r-- | libstdc++-v3/include/tr1_impl/random | 68 |
1 files changed, 66 insertions, 2 deletions
diff --git a/libstdc++-v3/include/tr1_impl/random b/libstdc++-v3/include/tr1_impl/random index b45368d7532..dd9c57d162b 100644 --- a/libstdc++-v3/include/tr1_impl/random +++ b/libstdc++-v3/include/tr1_impl/random @@ -79,8 +79,9 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 template<typename _Engine, typename _Distribution> struct _Adaptor { - typedef typename _Engine::result_type _Engine_result_type; - typedef typename _Distribution::input_type result_type; + typedef typename remove_reference<_Engine>::type _BEngine; + typedef typename _BEngine::result_type _Engine_result_type; + typedef typename _Distribution::input_type result_type; public: _Adaptor(const _Engine& __g) @@ -146,6 +147,69 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 private: _Engine _M_g; }; + + // Specialization for _Engine*. + template<typename _Engine, typename _Distribution> + struct _Adaptor<_Engine*, _Distribution> + { + typedef typename _Engine::result_type _Engine_result_type; + typedef typename _Distribution::input_type result_type; + + public: + _Adaptor(_Engine* __g) + : _M_g(__g) { } + + result_type + min() const + { + result_type __return_value; + if (is_integral<_Engine_result_type>::value + && is_integral<result_type>::value) + __return_value = _M_g->min(); + else + __return_value = result_type(0); + return __return_value; + } + + result_type + max() const + { + 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; + } + + result_type + 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; + }; } // namespace __detail /** |