(file) Return to StringRep.h CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

Diff for /pegasus/src/Pegasus/Common/StringRep.h between version 1.1.2.5 and 1.4

version 1.1.2.5, 2005/10/11 15:50:45 version 1.4, 2005/11/29 22:10:24
Line 32 
Line 32 
 #ifndef _Pegasus_StringRep_h #ifndef _Pegasus_StringRep_h
 #define _Pegasus_StringRep_h #define _Pegasus_StringRep_h
  
 #include <Pegasus/Common/Atomic.h>  #include <Pegasus/Common/Config.h>
   #include <Pegasus/Common/AtomicInt.h>
   #include <new>
  
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
  
Line 50 
Line 52 
  
     static StringRep* create(const char* data, size_t size);     static StringRep* create(const char* data, size_t size);
  
     static StringRep* createASCII7(const char* data, size_t size);  
   
     static StringRep* copyOnWrite(StringRep* rep);     static StringRep* copyOnWrite(StringRep* rep);
  
     static Uint32 length(const Uint16* str);     static Uint32 length(const Uint16* str);
Line 70 
Line 70 
     size_t cap;     size_t cap;
  
     // Number of string refering to this StringRep (1, 2, etc).     // Number of string refering to this StringRep (1, 2, etc).
     Atomic refs;      AtomicInt refs;
  
     // The first character in the string. Extra space is allocated off the     // The first character in the string. Extra space is allocated off the
     // end of this structure for additional characters.     // end of this structure for additional characters.
Line 79 
Line 79 
  
 inline void StringRep::free(StringRep* rep) inline void StringRep::free(StringRep* rep)
 { {
     Atomic_destroy(&rep->refs);      rep->refs.~AtomicInt();
     ::operator delete(rep);     ::operator delete(rep);
 } }
  
 inline StringRep::StringRep() : size(0), cap(0)  inline StringRep::StringRep() : size(0), cap(0), refs(2)
 { {
     // Only called on _emptyRep. We set the reference count to two to     // Only called on _emptyRep. We set the reference count to two to
     // keep a String from modifying it (if the reference count were one,     // keep a String from modifying it (if the reference count were one,
     // a string would think it was the sole owner of the StringRep object).     // a string would think it was the sole owner of the StringRep object).
     Atomic_create(&refs, 2);  
     data[0] = 0;     data[0] = 0;
 } }
  
 inline StringRep::~StringRep() inline StringRep::~StringRep()
 { {
     // Only called on _emptyRep.     // Only called on _emptyRep.
     Atomic_destroy(&refs);      refs.~AtomicInt();
 } }
  
 inline void StringRep::ref(const StringRep* rep) inline void StringRep::ref(const StringRep* rep)
 { {
     if (rep != &StringRep::_emptyRep)     if (rep != &StringRep::_emptyRep)
         Atomic_inc(&((StringRep*)rep)->refs);          ((StringRep*)rep)->refs++;
 } }
  
 inline void StringRep::unref(const StringRep* rep) inline void StringRep::unref(const StringRep* rep)
 { {
     if (rep != &StringRep::_emptyRep &&     if (rep != &StringRep::_emptyRep &&
         Atomic_dec_and_test(&((StringRep*)rep)->refs))          ((StringRep*)rep)->refs.decAndTestIfZero())
         StringRep::free((StringRep*)rep);         StringRep::free((StringRep*)rep);
 } }
  


Legend:
Removed from v.1.1.2.5  
changed lines
  Added in v.1.4

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2