summaryrefslogtreecommitdiff
path: root/TAO/tao/Seq_Var_T.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/Seq_Var_T.cpp')
-rw-r--r--TAO/tao/Seq_Var_T.cpp144
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 */