]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR libstdc++/37986 (cont)
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 12 Nov 2008 09:59:27 +0000 (09:59 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 12 Nov 2008 09:59:27 +0000 (09:59 +0000)
2008-11-12  Paolo Carlini  <paolo.carlini@oracle.com>

PR libstdc++/37986 (cont)
* include/tr1_impl/random (struct _Adaptor): Use only remove_reference
on _Engine.
(struct _Adaptor<_Engine*, _Distribution>): Add.
* testsuite/tr1/5_numerical_facilities/random/variate_generator/
37986.cc: Extend.

From-SVN: r141784

libstdc++-v3/ChangeLog
libstdc++-v3/include/tr1_impl/random
libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/variate_generator/37986.cc

index 191d27c743c85d7ce0806df8e539381f1b894f75..c089507e56fd8e6bfe51aac3c0e822e10efdc8b7 100644 (file)
@@ -1,3 +1,12 @@
+2008-11-12  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR libstdc++/37986 (cont)
+       * include/tr1_impl/random (struct _Adaptor): Use only remove_reference
+       on _Engine.
+       (struct _Adaptor<_Engine*, _Distribution>): Add.
+       * testsuite/tr1/5_numerical_facilities/random/variate_generator/
+       37986.cc: Extend.
+
 2008-11-11  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR libstdc++/37986
index 9e30eb32795487e8670211b47ec34aab5ebb1929..dd9c57d162b46c1835967d14c2502c23abb0adc6 100644 (file)
@@ -79,11 +79,9 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
     template<typename _Engine, typename _Distribution>
       struct _Adaptor
       { 
-       typedef typename remove_reference<
-         typename remove_pointer<_Engine>::type>::type _BEngine;
-
-       typedef typename _BEngine::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)
@@ -149,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
 
   /**
index 50ca3b96ea32ade24dca4a107d6cc10dbb733ca1..38137f65a00522b3d09f9e14e323213f83e449eb 100644 (file)
@@ -42,4 +42,8 @@ void test01()
     std::tr1::mt19937*,
     std::tr1::uniform_real<double>
     > g3(&mt, dist);
+
+  g1();
+  g2();
+  g3();
 }