]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
random.h (discrete_distribution<>::param_type:: param_type()): Default construct...
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 13 Oct 2010 16:31:17 +0000 (16:31 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 13 Oct 2010 16:31:17 +0000 (16:31 +0000)
2010-10-13  Paolo Carlini  <paolo.carlini@oracle.com>

* include/bits/random.h (discrete_distribution<>::param_type::
param_type()): Default construct the vectors.
(discrete_distribution<>::param_type::probabilities): Adjust.
(discrete_distribution<>::probabilities): Likewise.
(discrete_distribution<>::max): Likewise.
(piecewise_constant_distribution<>::param_type::
param_type()): Default construct the vectors.
(piecewise_constant_distribution<>::param_type::intervals): Adjust.
(piecewise_constant_distribution<>::param_type::densities): Likewise.
(piecewise_constant_distribution<>::intervals): Likewise.
(piecewise_constant_distribution<>::densities): Likewise.
(piecewise_constant_distribution<>::min): Likewise.
(piecewise_constant_distribution<>::max): Likewise.
(piecewise_linear_distribution<>::param_type::
param_type()): Default construct the vectors.
(piecewise_linear_distribution<>::param_type::intervals): Adjust.
(piecewise_linear_distribution<>::param_type::densities): Likewise.
(piecewise_linear_distribution<>::intervals): Likewise.
(piecewise_linear_distribution<>::densities): Likewise.
(piecewise_linear_distribution<>::min): Likewise.
(piecewise_linear_distribution<>::max): Likewise.
* include/bits/random.tcc (discrete_distribution<>::param_type::
_M_initialize): Deal quickly with raw _M_prob equivalent to
a default constructed param_type, just clear the vector.
(discrete_distribution<>::operator()): Early return 0 for a
default constructed distribution.
(piecewise_constant_distribution<>::param_type::_M_initialize):
Likewise for _M_int and _M_den.
(piecewise_constant_distribution<>::operator()): Early return
for a default constructed distribution.
(piecewise_linear_distribution<>::param_type::_M_initialize):
Likewise.
(piecewise_linear_distribution<>::operator()): Early return
for a default constructed distribution.
* testsuite/26_numerics/random/discrete_distribution/operators/
call-default.cc: New.
* testsuite/26_numerics/random/piecewise_constant_distribution/
operators/call-default.cc: Likewise.

From-SVN: r165427

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/random.h
libstdc++-v3/include/bits/random.tcc
libstdc++-v3/testsuite/26_numerics/random/discrete_distribution/operators/call-default.cc [new file with mode: 0644]
libstdc++-v3/testsuite/26_numerics/random/piecewise_constant_distribution/operators/call-default.cc [new file with mode: 0644]

index 29413e7712551995e0672ee3e35d5499afc24b9b..eadf65b3f66581ad6bbb2368f68e5a3f7b295d4c 100644 (file)
@@ -1,3 +1,44 @@
+2010-10-13  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * include/bits/random.h (discrete_distribution<>::param_type::
+       param_type()): Default construct the vectors.
+       (discrete_distribution<>::param_type::probabilities): Adjust.
+       (discrete_distribution<>::probabilities): Likewise.
+       (discrete_distribution<>::max): Likewise.
+       (piecewise_constant_distribution<>::param_type::
+       param_type()): Default construct the vectors.
+       (piecewise_constant_distribution<>::param_type::intervals): Adjust.
+       (piecewise_constant_distribution<>::param_type::densities): Likewise.
+       (piecewise_constant_distribution<>::intervals): Likewise.
+       (piecewise_constant_distribution<>::densities): Likewise.
+       (piecewise_constant_distribution<>::min): Likewise.
+       (piecewise_constant_distribution<>::max): Likewise.
+       (piecewise_linear_distribution<>::param_type::
+       param_type()): Default construct the vectors.
+       (piecewise_linear_distribution<>::param_type::intervals): Adjust.
+       (piecewise_linear_distribution<>::param_type::densities): Likewise.
+       (piecewise_linear_distribution<>::intervals): Likewise.
+       (piecewise_linear_distribution<>::densities): Likewise.
+       (piecewise_linear_distribution<>::min): Likewise.
+       (piecewise_linear_distribution<>::max): Likewise.
+       * include/bits/random.tcc (discrete_distribution<>::param_type::
+       _M_initialize): Deal quickly with raw _M_prob equivalent to
+       a default constructed param_type, just clear the vector.
+       (discrete_distribution<>::operator()): Early return 0 for a
+       default constructed distribution.
+       (piecewise_constant_distribution<>::param_type::_M_initialize):
+       Likewise for _M_int and _M_den.
+       (piecewise_constant_distribution<>::operator()): Early return
+       for a default constructed distribution.
+       (piecewise_linear_distribution<>::param_type::_M_initialize):
+       Likewise.
+       (piecewise_linear_distribution<>::operator()): Early return
+       for a default constructed distribution.
+       * testsuite/26_numerics/random/discrete_distribution/operators/
+       call-default.cc: New.
+       * testsuite/26_numerics/random/piecewise_constant_distribution/
+       operators/call-default.cc: Likewise.
+
 2010-10-12  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * include/bits/random.h (discrete_distribution<>::param_type):
index 2477d57a9e14a8ce017213db0aec7e9b1ff6b40a..cfb286a3c97c054fa9b4385f19da14237b637ca6 100644 (file)
@@ -4697,7 +4697,7 @@ namespace std
        friend class discrete_distribution<_IntType>;
 
        param_type()
-       : _M_prob(1, 1.0), _M_cp()
+       : _M_prob(), _M_cp()
        { }
 
        template<typename _InputIterator>
@@ -4720,7 +4720,7 @@ namespace std
 
        std::vector<double>
        probabilities() const
-       { return _M_prob; }
+       { return _M_prob.empty() ? std::vector<double>(1, 1.0) : _M_prob; }
 
        friend bool
        operator==(const param_type& __p1, const param_type& __p2)
@@ -4771,7 +4771,10 @@ namespace std
        */
       std::vector<double>
       probabilities() const
-      { return _M_param.probabilities(); }
+      {
+       return _M_param._M_prob.empty()
+         ? std::vector<double>(1, 1.0) : _M_param._M_prob;
+      }
 
       /**
        * @brief Returns the parameter set of the distribution.
@@ -4800,7 +4803,10 @@ namespace std
        */
       result_type
       max() const
-      { return this->_M_param._M_prob.size() - 1; }
+      {
+       return _M_param._M_prob.empty()
+         ? result_type(0) : result_type(_M_param._M_prob.size() - 1);
+      }
 
       /**
        * @brief Generating functions.
@@ -4893,8 +4899,8 @@ namespace std
        friend class piecewise_constant_distribution<_RealType>;
 
        param_type()
-       : _M_int(2), _M_den(1, 1.0), _M_cp()
-       { _M_int[1] = _RealType(1); }
+       : _M_int(), _M_den(), _M_cp()
+       { }
 
        template<typename _InputIteratorB, typename _InputIteratorW>
          param_type(_InputIteratorB __bfirst,
@@ -4914,11 +4920,20 @@ namespace std
 
        std::vector<_RealType>
        intervals() const
-       { return _M_int; }
+       {
+         if (_M_int.empty())
+           {
+             std::vector<_RealType> __tmp(2);
+             __tmp[1] = _RealType(1);
+             return __tmp;
+           }
+         else
+           return _M_int;
+       }
 
        std::vector<double>
        densities() const
-       { return _M_den; }
+       { return _M_den.empty() ? std::vector<double>(1, 1.0) : _M_den; }
 
        friend bool
        operator==(const param_type& __p1, const param_type& __p2)
@@ -4975,14 +4990,26 @@ namespace std
        */
       std::vector<_RealType>
       intervals() const
-      { return _M_param.intervals(); }
+      {
+       if (_M_param._M_int.empty())
+         {
+           std::vector<_RealType> __tmp(2);
+           __tmp[1] = _RealType(1);
+           return __tmp;
+         }
+       else
+         return _M_param._M_int;
+      }
 
       /**
        * @brief Returns a vector of the probability densities.
        */
       std::vector<double>
       densities() const
-      { return _M_param.densities(); }
+      {
+       return _M_param._M_den.empty()
+         ? std::vector<double>(1, 1.0) : _M_param._M_den;
+      }
 
       /**
        * @brief Returns the parameter set of the distribution.
@@ -5004,14 +5031,20 @@ namespace std
        */
       result_type
       min() const
-      { return this->_M_param._M_int.front(); }
+      {
+       return _M_param._M_int.empty()
+         ? result_type(0) : _M_param._M_int.front();
+      }
 
       /**
        * @brief Returns the least upper bound value of the distribution.
        */
       result_type
       max() const
-      { return this->_M_param._M_int.back(); }
+      {
+       return _M_param._M_int.empty()
+         ? result_type(1) : _M_param._M_int.back();
+      }
 
       /**
        * @brief Generating functions.
@@ -5105,8 +5138,8 @@ namespace std
        friend class piecewise_linear_distribution<_RealType>;
 
        param_type()
-       : _M_int(2), _M_den(2, 1.0), _M_cp(), _M_m()
-       { _M_int[1] = _RealType(1); }
+       : _M_int(), _M_den(), _M_cp(), _M_m()
+       { }
 
        template<typename _InputIteratorB, typename _InputIteratorW>
          param_type(_InputIteratorB __bfirst,
@@ -5126,11 +5159,20 @@ namespace std
 
        std::vector<_RealType>
        intervals() const
-       { return _M_int; }
+       {
+         if (_M_int.empty())
+           {
+             std::vector<_RealType> __tmp(2);
+             __tmp[1] = _RealType(1);
+             return __tmp;
+           }
+         else
+           return _M_int;
+       }
 
        std::vector<double>
        densities() const
-       { return _M_den; }
+       { return _M_den.empty() ? std::vector<double>(2, 1.0) : _M_den; }
 
        friend bool
        operator==(const param_type& __p1, const param_type& __p2)
@@ -5189,7 +5231,16 @@ namespace std
        */
       std::vector<_RealType>
       intervals() const
-      { return _M_param.intervals(); }
+      {
+       if (_M_param._M_int.empty())
+         {
+           std::vector<_RealType> __tmp(2);
+           __tmp[1] = _RealType(1);
+           return __tmp;
+         }
+       else
+         return _M_param._M_int;
+      }
 
       /**
        * @brief Return a vector of the probability densities of the
@@ -5197,7 +5248,10 @@ namespace std
        */
       std::vector<double>
       densities() const
-      { return _M_param.densities(); }
+      {
+       return _M_param._M_den.empty()
+         ? std::vector<double>(2, 1.0) : _M_param._M_den;
+      }
 
       /**
        * @brief Returns the parameter set of the distribution.
@@ -5219,14 +5273,20 @@ namespace std
        */
       result_type
       min() const
-      { return this->_M_param._M_int.front(); }
+      {
+       return _M_param._M_int.empty()
+         ? result_type(0) : _M_param._M_int.front();
+      }
 
       /**
        * @brief Returns the least upper bound value of the distribution.
        */
       result_type
       max() const
-      { return this->_M_param._M_int.back(); }
+      {
+       return _M_param._M_int.empty()
+         ? result_type(1) : _M_param._M_int.back();
+      }
 
       /**
        * @brief Generating functions.
index d360b41c9b6cde2bd147420da544df951bf0ddcc..e3faf481423504876e69dfe77014708c18c19f09 100644 (file)
@@ -2217,7 +2217,6 @@ namespace std
       if (_M_prob.size() < 2)
        {
          _M_prob.clear();
-         _M_prob.push_back(1.0);
          return;
        }
 
@@ -2257,6 +2256,9 @@ namespace std
       operator()(_UniformRandomNumberGenerator& __urng,
                 const param_type& __param)
       {
+       if (__param._M_cp.empty())
+         return result_type(0);
+
        __detail::_Adaptor<_UniformRandomNumberGenerator, double>
          __aurng(__urng);
 
@@ -2330,16 +2332,13 @@ namespace std
     piecewise_constant_distribution<_RealType>::param_type::
     _M_initialize()
     {
-      if (_M_int.size() < 2)
+      if (_M_int.size() < 2
+         || (_M_int.size() == 2
+             && _M_int[0] == _RealType(0)
+             && _M_int[1] == _RealType(1)))
        {
          _M_int.clear();
-         _M_int.reserve(2);
-         _M_int.push_back(_RealType(0));
-         _M_int.push_back(_RealType(1));
-
          _M_den.clear();
-         _M_den.push_back(1.0);
-
          return;
        }
 
@@ -2433,6 +2432,9 @@ namespace std
          __aurng(__urng);
 
        const double __p = __aurng();
+       if (__param._M_cp.empty())
+         return __p;
+
        auto __pos = std::lower_bound(__param._M_cp.begin(),
                                      __param._M_cp.end(), __p);
        const size_t __i = __pos - __param._M_cp.begin();
@@ -2519,18 +2521,14 @@ namespace std
     piecewise_linear_distribution<_RealType>::param_type::
     _M_initialize()
     {
-      if (_M_int.size() < 2)
+      if (_M_int.size() < 2
+         || (_M_int.size() == 2
+             && _M_int[0] == _RealType(0)
+             && _M_int[1] == _RealType(1)
+             && _M_den[0] == _M_den[1]))
        {
          _M_int.clear();
-         _M_int.reserve(2);
-         _M_int.push_back(_RealType(0));
-         _M_int.push_back(_RealType(1));
-
          _M_den.clear();
-         _M_den.reserve(2);
-         _M_den.push_back(1.0);
-         _M_den.push_back(1.0);
-
          return;
        }
 
@@ -2623,7 +2621,7 @@ namespace std
          __aurng(__urng);
 
        const double __p = __aurng();
-       if (__param._M_m.empty())
+       if (__param._M_cp.empty())
          return __p;
 
        auto __pos = std::lower_bound(__param._M_cp.begin(),
diff --git a/libstdc++-v3/testsuite/26_numerics/random/discrete_distribution/operators/call-default.cc b/libstdc++-v3/testsuite/26_numerics/random/discrete_distribution/operators/call-default.cc
new file mode 100644 (file)
index 0000000..11e0d68
--- /dev/null
@@ -0,0 +1,41 @@
+// { dg-options "-std=c++0x" }
+// { dg-require-cstdint "" }
+//
+// 2010-10-13  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2010 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// 26.5.8.5.1 Class template discrete_distribution
+//   [rand.dist.samp.discrete]
+
+#include <random>
+
+void
+test01()
+{
+  std::discrete_distribution<> u;
+  std::minstd_rand0 rng;
+
+  u(rng);
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/26_numerics/random/piecewise_constant_distribution/operators/call-default.cc b/libstdc++-v3/testsuite/26_numerics/random/piecewise_constant_distribution/operators/call-default.cc
new file mode 100644 (file)
index 0000000..fe2b962
--- /dev/null
@@ -0,0 +1,41 @@
+// { dg-options "-std=c++0x" }
+// { dg-require-cstdint "" }
+//
+// 2010-10-13  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2010 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// 26.5.8.5.2 Class template piecewise_constant_distribution
+//   [rand.dist.samp.pconst]
+
+#include <random>
+
+void
+test01()
+{
+  std::piecewise_constant_distribution<> u;
+  std::minstd_rand0 rng;
+
+  u(rng);
+}
+
+int main()
+{
+  test01();
+  return 0;
+}