PSDL_String.cpp

Go to the documentation of this file.
00001 // PSDL_String.cpp,v 1.5 2004/04/24 03:52:23 ossama Exp
00002 
00003 #include "PSDL_String.h"
00004 
00005 #include "ace/Malloc_Base.h"
00006 #include "ace/SString.h"
00007 
00008 ACE_RCSID (PSS, PSDL_String, "$Id")
00009 
00010 // Constructor
00011 TAO_PSDL_String::TAO_PSDL_String ()
00012   : allocator_ (0),
00013     buffer_ (0),
00014     length_ (0)
00015 {
00016 }
00017 
00018 // Constructor
00019 TAO_PSDL_String::TAO_PSDL_String (ACE_Allocator * persistent_allocator)
00020   : allocator_ (persistent_allocator),
00021     buffer_ (0),
00022     length_ (0)
00023 {
00024 }
00025 
00026 // Destructor.
00027 TAO_PSDL_String::~TAO_PSDL_String (void)
00028 {
00029   if (this->buffer_ != 0)
00030     this->allocator_->free ((void *) this->buffer_);
00031 }
00032 
00033 // Copy constructor.
00034 TAO_PSDL_String::TAO_PSDL_String (const TAO_PSDL_String & rhs)
00035 {
00036   *this = rhs;
00037 }
00038 
00039 // Assignment operator.
00040 void
00041 TAO_PSDL_String::operator= (const TAO_PSDL_String & rhs)
00042 {
00043   if (this == &rhs)  // Prevent self assignment
00044     return;
00045 
00046   // Free the existing buffer before assigning a new
00047   // allocator and buffer.
00048   if (this->buffer_ != 0)
00049     this->allocator_->free ((void *) this->buffer_);
00050 
00051   this->allocator_ = rhs.allocator_;
00052   void * buf = this->allocator_->malloc (rhs.length_);
00053   this->buffer_ = (const char *) buf;
00054   if (this->buffer_)
00055     {
00056       // Deep copy the buffer.
00057       ACE_OS::memcpy ( (void *) this->buffer_,
00058                        rhs.buffer_,
00059                        rhs.length_);
00060 
00061       this->length_ = rhs.length_;
00062     }
00063   else
00064     this->length_ = 0;
00065 }
00066 
00067 void
00068 TAO_PSDL_String::operator= (const ACE_CString & rhs)
00069 {
00070   // Free the existing buffer before assigning octet
00071   // sequence.
00072   if (this->buffer_ != 0)
00073     this->allocator_->free ((void *) this->buffer_);
00074 
00075   const CORBA::ULong len = rhs.length ();
00076 
00077   void * buf = this->allocator_->malloc (len);
00078 
00079   this->buffer_ = (const char *) buf;
00080 
00081   if (this->buffer_)
00082     {
00083       const char * dest = this->buffer_;
00084       const char * src = rhs.rep ();
00085 
00086       // Deep copy the buffer.
00087       ACE_OS::memcpy ((void *)dest,
00088                       src,
00089                       len);
00090 
00091       this->length_ = len;
00092     }
00093   else
00094     this->length_ = 0;
00095 }
00096 
00097 bool
00098 TAO_PSDL_String::operator== (const TAO_PSDL_String &rhs) const
00099 {
00100   return (ACE_OS::strcmp (buffer_, rhs.buffer_) == 0);
00101 }
00102 
00103 bool
00104 TAO_PSDL_String::operator!= (const TAO_PSDL_String &rhs) const
00105 {
00106   return (ACE_OS::strcmp (buffer_, rhs.buffer_) != 0);
00107 }
00108 
00109 u_long
00110 TAO_PSDL_String::hash (void) const
00111 {
00112   return ACE::hash_pjw (this->buffer_);
00113 }
00114 
00115 // Conversion operators (cast)
00116 // (caller owns storage of return values)
00117 TAO_PSDL_String::operator ACE_CString *() const
00118 {
00119   ACE_CString *str = 0;
00120 
00121   char * dest = str->rep ();
00122   const char * src = this->buffer_;
00123 
00124   ACE_OS::memcpy (dest, src, this->length_);
00125 
00126   return str;
00127 }
00128 
00129 TAO_PSDL_String::operator ACE_CString *()
00130 {
00131   ACE_CString *str = 0;
00132 
00133   char * dest = str->rep ();
00134   const char * src = this->buffer_;
00135   ACE_OS::memcpy (dest, src, this->length_);
00136 
00137   return str;
00138 }

Generated on Thu Nov 9 14:07:05 2006 for TAO_PSS by doxygen 1.3.6