From 3c143ad882aa3929cebc5e6d7d67a08769f8e3b2 Mon Sep 17 00:00:00 2001 From: Howard Hinnant <hhinnant@apple.com> Date: Wed, 13 Oct 2010 14:37:09 +0000 Subject: [PATCH] Patch by Marshall Clow to make the assignment operators of piecewise_constant_distribution and piecewise_linear_distribution exception safe. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@116404 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/random | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/include/random b/include/random index 5a74f639..6bbde221 100644 --- a/include/random +++ b/include/random @@ -5938,6 +5938,7 @@ public: template<class _UnaryOperation> param_type(size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw); + param_type & operator=(const param_type& __rhs); _LIBCPP_INLINE_VISIBILITY vector<result_type> intervals() const {return __b_;} @@ -6047,6 +6048,23 @@ public: piecewise_constant_distribution<_RT>& __x); }; +template<class _RealType> +typename piecewise_constant_distribution<_RealType>::param_type & +piecewise_constant_distribution<_RealType>::param_type::operator= + (const param_type& __rhs) +{ +// These can throw + __b_.reserve (__rhs.__b_.size ()); + __densities_.reserve(__rhs.__densities_.size()); + __areas_.reserve (__rhs.__areas_.size()); + +// These can not throw + __b_ = __rhs.__b_; + __densities_ = __rhs.__densities_; + __areas_ = __rhs.__areas_; + return *this; +} + template<class _RealType> void piecewise_constant_distribution<_RealType>::param_type::__init() @@ -6239,7 +6257,8 @@ public: template<class _UnaryOperation> param_type(size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw); - + param_type & operator=(const param_type& __rhs); + _LIBCPP_INLINE_VISIBILITY vector<result_type> intervals() const {return __b_;} _LIBCPP_INLINE_VISIBILITY @@ -6348,6 +6367,24 @@ public: piecewise_linear_distribution<_RT>& __x); }; +template<class _RealType> +typename piecewise_linear_distribution<_RealType>::param_type & +piecewise_linear_distribution<_RealType>::param_type::operator= + (const param_type& __rhs) +{ +// These can throw + __b_.reserve (__rhs.__b_.size ()); + __densities_.reserve(__rhs.__densities_.size()); + __areas_.reserve (__rhs.__areas_.size()); + +// These can not throw + __b_ = __rhs.__b_; + __densities_ = __rhs.__densities_; + __areas_ = __rhs.__areas_; + return *this; +} + + template<class _RealType> void piecewise_linear_distribution<_RealType>::param_type::__init()