diff options
Diffstat (limited to 'TAO/tao/Seq_Var_T.cpp')
-rw-r--r-- | TAO/tao/Seq_Var_T.cpp | 144 |
1 files changed, 105 insertions, 39 deletions
diff --git a/TAO/tao/Seq_Var_T.cpp b/TAO/tao/Seq_Var_T.cpp index e8e38e2eddb..04d36e7dafa 100644 --- a/TAO/tao/Seq_Var_T.cpp +++ b/TAO/tao/Seq_Var_T.cpp @@ -1,7 +1,7 @@ // $Id$ -#ifndef TAO_SEQ_VAR_T_CPP -#define TAO_SEQ_VAR_T_CPP +#ifndef TAO_SEQ_VAR_T_C +#define TAO_SEQ_VAR_T_C #include "tao/Seq_Var_T.h" @@ -9,15 +9,26 @@ #include "tao/Seq_Var_T.inl" #endif /* __ACE_INLINE__ */ -#include "ace/OS_Memory.h" -TAO_BEGIN_VERSIONED_NAMESPACE_DECL +ACE_RCSID (tao, + Seq_VarOut_T, + "$Id$") + template<typename T, typename T_elem> TAO_Seq_Var_Base_T<T,T_elem>::TAO_Seq_Var_Base_T ( - const TAO_Seq_Var_Base_T<T,T_elem> & p) - : ptr_ (p.ptr_ ? new T (*p.ptr_) : 0) + const TAO_Seq_Var_Base_T<T,T_elem> & p + ) { + if (p.ptr_) + { + ACE_NEW (this->ptr_, + T (*p.ptr_)); + } + else + { + this->ptr_ = 0; + } } // **************************************************************************** @@ -25,15 +36,34 @@ TAO_Seq_Var_Base_T<T,T_elem>::TAO_Seq_Var_Base_T ( template<typename T, typename T_elem> TAO_FixedSeq_Var_T<T,T_elem> & TAO_FixedSeq_Var_T<T,T_elem>::operator= ( - const TAO_FixedSeq_Var_T<T,T_elem> & p) + const TAO_FixedSeq_Var_T<T,T_elem> & p + ) { - // Strongly exception safe assignment using copy and non-throwing - // swap technique. - TAO_FixedSeq_Var_T<T,T_elem> tmp (p); - - T * old_ptr = this->ptr_; - this->ptr_ = tmp.ptr_; - tmp.ptr_ = old_ptr; + if (this != &p) + { + if (p.ptr_ == 0) + { + delete this->ptr_; + this->ptr_ = 0; + } + else + { + T * deep_copy = 0; + ACE_NEW_RETURN ( + deep_copy, + T (*p.ptr_), + *this + ); + + if (deep_copy != 0) + { + T * tmp = deep_copy; + deep_copy = this->ptr_; + this->ptr_ = tmp; + delete deep_copy; + } + } + } return *this; } @@ -43,13 +73,13 @@ template<typename T, typename T_elem> TAO_FixedSeq_Var_T<T,T_elem> & TAO_FixedSeq_Var_T<T,T_elem>::operator= (const T & p) { - // Strongly exception safe assignment using copy and non-throwing - // swap technique. - TAO_FixedSeq_Var_T<T,T_elem> tmp (p); - - T * old_ptr = this->ptr_; - this->ptr_ = tmp.ptr_; - tmp.ptr_ = old_ptr; + if (this->ptr_ != &p) + { + delete this->ptr_; + ACE_NEW_RETURN (this->ptr_, + T (p), + *this); + } return *this; } @@ -58,15 +88,35 @@ TAO_FixedSeq_Var_T<T,T_elem>::operator= (const T & p) template<typename T, typename T_elem> TAO_VarSeq_Var_T<T,T_elem> & -TAO_VarSeq_Var_T<T,T_elem>::operator= (const TAO_VarSeq_Var_T<T,T_elem> & p) +TAO_VarSeq_Var_T<T,T_elem>::operator= ( + const TAO_VarSeq_Var_T<T,T_elem> & p + ) { - // Strongly exception safe assignment using copy and non-throwing - // swap technique. - TAO_VarSeq_Var_T<T,T_elem> tmp (p); - - T * old_ptr = this->ptr_; - this->ptr_ = tmp.ptr_; - tmp.ptr_ = old_ptr; + if (this != &p) + { + if (p.ptr_ == 0) + { + delete this->ptr_; + this->ptr_ = 0; + } + else + { + T * deep_copy = 0; + ACE_NEW_RETURN ( + deep_copy, + T (*p.ptr_), + *this + ); + + if (deep_copy != 0) + { + T * tmp = deep_copy; + deep_copy = this->ptr_; + this->ptr_ = tmp; + delete deep_copy; + } + } + } return *this; } @@ -79,17 +129,33 @@ TAO_MngSeq_Var_T<T,T_elem>::operator= ( const TAO_MngSeq_Var_T<T,T_elem> & p ) { - // Strongly exception safe assignment using copy and non-throwing - // swap technique. - TAO_MngSeq_Var_T<T,T_elem> tmp (p); - - T * old_ptr = this->ptr_; - this->ptr_ = tmp.ptr_; - tmp.ptr_ = old_ptr; + if (this != &p) + { + if (p.ptr_ == 0) + { + delete this->ptr_; + this->ptr_ = 0; + } + else + { + T * deep_copy = 0; + ACE_NEW_RETURN ( + deep_copy, + T (*p.ptr_), + *this + ); + + if (deep_copy != 0) + { + T * tmp = deep_copy; + deep_copy = this->ptr_; + this->ptr_ = tmp; + delete deep_copy; + } + } + } return *this; } -TAO_END_VERSIONED_NAMESPACE_DECL - -#endif /* TAO_SEQ_VAR_T_CPP */ +#endif /* TAO_SEQ_VAR_T_C */ |