(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.1 and 1.5

version 1.1.2.1, 2005/10/08 02:01:46 version 1.5, 2006/01/30 16:17:08
Line 1 
Line 1 
 //%2005////////////////////////////////////////////////////////////////////////  //%2006////////////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
Line 8 
Line 8 
 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 // EMC Corporation; VERITAS Software Corporation; The Open Group. // EMC Corporation; VERITAS Software Corporation; The Open Group.
   // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
   // EMC Corporation; Symantec Corporation; The Open Group.
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to // of this software and associated documentation files (the "Software"), to
Line 32 
Line 34 
 #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 54 
  
     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* copy_on_write(StringRep* rep);  
  
     static Uint32 length(const Uint16* str);     static Uint32 length(const Uint16* str);
  
Line 60 
Line 62 
  
     static void unref(const StringRep* rep);     static void unref(const StringRep* rep);
  
     static StringRep _empty_rep;      static StringRep _emptyRep;
  
       // Number of characters in this string, excluding the null terminator.
     size_t size;     size_t size;
   
       // Number of characters this representation has room for. This is
       // greater or equal to size.
     size_t cap;     size_t cap;
     Atomic refs;  
       // Number of string refering to this StringRep (1, 2, etc).
       AtomicInt refs;
   
       // The first character in the string. Extra space is allocated off the
       // end of this structure for additional characters.
     Uint16 data[1];     Uint16 data[1];
 }; };
  
 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 _empty_rep.      // Only called on _emptyRep. We set the reference count to two to
     Atomic_create(&refs, 99);      // 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).
     data[0] = 0;     data[0] = 0;
 } }
  
 inline StringRep::~StringRep() inline StringRep::~StringRep()
 { {
     // Only called on _empty_rep.      // 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::_empty_rep)      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::_empty_rep &&      if (rep != &StringRep::_emptyRep &&
         Atomic_dec_and_test(&((StringRep*)rep)->refs))          ((StringRep*)rep)->refs.decAndTestIfZero())
         StringRep::free((StringRep*)rep);         StringRep::free((StringRep*)rep);
 } }
  
 PEGASUS_COMMON_LINKAGE void String_throw_out_of_bounds();  PEGASUS_COMMON_LINKAGE void StringThrowOutOfBounds();
   
   PEGASUS_COMMON_LINKAGE void StringAppendCharAux(StringRep*& _rep);
  
 #ifdef PEGASUS_STRING_NO_THROW  PEGASUS_COMMON_LINKAGE Boolean StringEqualNoCase(
 # define _check_bounds(ARG1, ARG2) /* empty */      const String& s1, const String& s2);
 #else  
 inline void _check_bounds(size_t index, size_t size)  PEGASUS_COMMON_LINKAGE Uint32 StringFindAux(
       const StringRep* _rep, const Char16* s, Uint32 n);
   
   inline void _checkBounds(size_t index, size_t size)
 { {
   #ifndef PEGASUS_STRING_NO_THROW
     if (index > size)     if (index > size)
         String_throw_out_of_bounds();          StringThrowOutOfBounds();
 }  
 #endif #endif
   }
  
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END
  


Legend:
Removed from v.1.1.2.1  
changed lines
  Added in v.1.5

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2