aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/tr1_impl/random
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2008-11-23 19:35:24 +0000
committerRichard Guenther <rguenther@suse.de>2008-11-23 19:35:24 +0000
commitcb198101579d9d77d71e696df04b50137d0bd575 (patch)
treec7a1c48cc12bcc550dec254de48d9ef26c123d8f /libstdc++-v3/include/tr1_impl/random
parent4506ab01ebaada7b1267e52d784cb052cabd3d0b (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/random68
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
/**