diff options
Diffstat (limited to 'TAO/tao/Managed_Types.i')
-rw-r--r-- | TAO/tao/Managed_Types.i | 61 |
1 files changed, 48 insertions, 13 deletions
diff --git a/TAO/tao/Managed_Types.i b/TAO/tao/Managed_Types.i index 73f66c7cdf6..aa03deb7c56 100644 --- a/TAO/tao/Managed_Types.i +++ b/TAO/tao/Managed_Types.i @@ -1,4 +1,5 @@ -/* -*- C++ -*- */ +// -*- C++ -*- +// // $Id$ // ============================================================================ @@ -16,6 +17,8 @@ // **************************************************************** +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + // default CTOR initializes to empty string ACE_INLINE TAO_String_Manager::TAO_String_Manager (void) @@ -30,6 +33,12 @@ TAO_String_Manager::TAO_String_Manager (const TAO_String_Manager &rhs) { } +ACE_INLINE +TAO_String_Manager::TAO_String_Manager (const char *s) + : ptr_ (CORBA::string_dup (s)) +{ +} + // destructor ACE_INLINE TAO_String_Manager::~TAO_String_Manager (void) @@ -41,11 +50,14 @@ TAO_String_Manager::~TAO_String_Manager (void) ACE_INLINE TAO_String_Manager& TAO_String_Manager::operator= (const TAO_String_Manager &rhs) { - if (this == &rhs) - return *this; + // Strongly exception safe by means of copy and non-throwing swap + // technique. + TAO_String_Manager tmp (rhs); + + char * old_ptr = this->ptr_; + this->ptr_ = tmp.ptr_; + tmp.ptr_ = old_ptr; - CORBA::string_free (this->ptr_); - this->ptr_ = CORBA::string_dup (rhs.ptr_); return *this; } @@ -53,8 +65,14 @@ TAO_String_Manager::operator= (const TAO_String_Manager &rhs) ACE_INLINE TAO_String_Manager & TAO_String_Manager::operator= (const char * p) { - CORBA::string_free (this->ptr_); - this->ptr_ = CORBA::string_dup (p); + // Strongly exception safe by means of copy and non-throwing swap + // technique. + TAO_String_Manager tmp (p); + + char * old_ptr = this->ptr_; + this->ptr_ = tmp.ptr_; + tmp.ptr_ = old_ptr; + return *this; } @@ -208,6 +226,12 @@ TAO_WString_Manager::TAO_WString_Manager (const TAO_WString_Manager &rhs) { } +ACE_INLINE +TAO_WString_Manager::TAO_WString_Manager (const CORBA::WChar *ws) + : ptr_ (CORBA::wstring_dup (ws)) +{ +} + // destructor ACE_INLINE TAO_WString_Manager::~TAO_WString_Manager (void) @@ -219,11 +243,14 @@ TAO_WString_Manager::~TAO_WString_Manager (void) ACE_INLINE TAO_WString_Manager& TAO_WString_Manager::operator= (const TAO_WString_Manager &rhs) { - if (this == &rhs) - return *this; + // Strongly exception safe by means of copy and non-throwing swap + // technique. + TAO_WString_Manager tmp (rhs); + + CORBA::WChar * old_ptr = this->ptr_; + this->ptr_ = tmp.ptr_; + tmp.ptr_ = old_ptr; - CORBA::wstring_free (this->ptr_); - this->ptr_ = CORBA::wstring_dup (rhs.ptr_); return *this; } @@ -231,8 +258,14 @@ TAO_WString_Manager::operator= (const TAO_WString_Manager &rhs) ACE_INLINE TAO_WString_Manager & TAO_WString_Manager::operator= (const CORBA::WChar * p) { - CORBA::wstring_free (this->ptr_); - this->ptr_ = CORBA::wstring_dup (p); + // Strongly exception safe by means of copy and non-throwing swap + // technique. + TAO_WString_Manager tmp (p); + + CORBA::WChar * old_ptr = this->ptr_; + this->ptr_ = tmp.ptr_; + tmp.ptr_ = old_ptr; + return *this; } @@ -370,3 +403,5 @@ TAO_SeqElem_WString_Manager::_retn (void) *this->ptr_ = 0; return temp; } + +TAO_END_VERSIONED_NAMESPACE_DECL |