00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef TIXML_USE_STL
00038
00039 #ifndef TIXML_STRING_INCLUDED
00040 #define TIXML_STRING_INCLUDED
00041
00042 #include <assert.h>
00043 #include <string.h>
00044
00045
00046
00047
00048
00049 #if defined(_MSC_VER) && (_MSC_VER >= 1200 )
00050
00051 #define TIXML_EXPLICIT explicit
00052 #elif defined(__GNUC__) && (__GNUC__ >= 3 )
00053
00054 #define TIXML_EXPLICIT explicit
00055 #else
00056 #define TIXML_EXPLICIT
00057 #endif
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 class TiXmlString
00068 {
00069 public :
00070
00071 typedef size_t size_type;
00072
00073
00074 static const size_type npos;
00075
00076
00077
00078 TiXmlString () : rep_(&nullrep_)
00079 {
00080 }
00081
00082
00083 TiXmlString ( const TiXmlString & copy)
00084 {
00085 init(copy.length());
00086 memcpy(start(), copy.data(), length());
00087 }
00088
00089
00090 TIXML_EXPLICIT TiXmlString ( const char * copy)
00091 {
00092 init( static_cast<size_type>( strlen(copy) ));
00093 memcpy(start(), copy, length());
00094 }
00095
00096
00097 TIXML_EXPLICIT TiXmlString ( const char * str, size_type len)
00098 {
00099 init(len);
00100 memcpy(start(), str, len);
00101 }
00102
00103
00104 ~TiXmlString ()
00105 {
00106 quit();
00107 }
00108
00109
00110 TiXmlString& operator = (const char * copy)
00111 {
00112 return assign( copy, (size_type)strlen(copy));
00113 }
00114
00115
00116 TiXmlString& operator = (const TiXmlString & copy)
00117 {
00118 return assign(copy.start(), copy.length());
00119 }
00120
00121
00122
00123 TiXmlString& operator += (const char * suffix)
00124 {
00125 return append(suffix, static_cast<size_type>( strlen(suffix) ));
00126 }
00127
00128
00129 TiXmlString& operator += (char single)
00130 {
00131 return append(&single, 1);
00132 }
00133
00134
00135 TiXmlString& operator += (const TiXmlString & suffix)
00136 {
00137 return append(suffix.data(), suffix.length());
00138 }
00139
00140
00141
00142 const char * c_str () const { return rep_->str; }
00143
00144
00145 const char * data () const { return rep_->str; }
00146
00147
00148 size_type length () const { return rep_->size; }
00149
00150
00151 size_type size () const { return rep_->size; }
00152
00153
00154 bool empty () const { return rep_->size == 0; }
00155
00156
00157 size_type capacity () const { return rep_->capacity; }
00158
00159
00160
00161 const char& at (size_type index) const
00162 {
00163 assert( index < length() );
00164 return rep_->str[ index ];
00165 }
00166
00167
00168 char& operator [] (size_type index) const
00169 {
00170 assert( index < length() );
00171 return rep_->str[ index ];
00172 }
00173
00174
00175 size_type find (char lookup) const
00176 {
00177 return find(lookup, 0);
00178 }
00179
00180
00181 size_type find (char tofind, size_type offset) const
00182 {
00183 if (offset >= length()) return npos;
00184
00185 for (const char* p = c_str() + offset; *p != '\0'; ++p)
00186 {
00187 if (*p == tofind) return static_cast< size_type >( p - c_str() );
00188 }
00189 return npos;
00190 }
00191
00192 void clear ()
00193 {
00194
00195
00196
00197
00198 quit();
00199 init(0,0);
00200 }
00201
00202
00203
00204
00205 void reserve (size_type cap);
00206
00207 TiXmlString& assign (const char* str, size_type len);
00208
00209 TiXmlString& append (const char* str, size_type len);
00210
00211 void swap (TiXmlString& other)
00212 {
00213 Rep* r = rep_;
00214 rep_ = other.rep_;
00215 other.rep_ = r;
00216 }
00217
00218 private:
00219
00220 void init(size_type sz) { init(sz, sz); }
00221 void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; }
00222 char* start() const { return rep_->str; }
00223 char* finish() const { return rep_->str + rep_->size; }
00224
00225 struct Rep
00226 {
00227 size_type size, capacity;
00228 char str[1];
00229 };
00230
00231 void init(size_type sz, size_type cap)
00232 {
00233 if (cap)
00234 {
00235
00236
00237
00238
00239
00240 const size_type bytesNeeded = sizeof(Rep) + cap;
00241 const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int );
00242 rep_ = reinterpret_cast<Rep*>( new int[ intsNeeded ] );
00243
00244 rep_->str[ rep_->size = sz ] = '\0';
00245 rep_->capacity = cap;
00246 }
00247 else
00248 {
00249 rep_ = &nullrep_;
00250 }
00251 }
00252
00253 void quit()
00254 {
00255 if (rep_ != &nullrep_)
00256 {
00257
00258
00259 delete [] ( reinterpret_cast<int*>( rep_ ) );
00260 }
00261 }
00262
00263 Rep * rep_;
00264 static Rep nullrep_;
00265
00266 } ;
00267
00268
00269 inline bool operator == (const TiXmlString & a, const TiXmlString & b)
00270 {
00271 return ( a.length() == b.length() )
00272 && ( strcmp(a.c_str(), b.c_str()) == 0 );
00273 }
00274 inline bool operator < (const TiXmlString & a, const TiXmlString & b)
00275 {
00276 return strcmp(a.c_str(), b.c_str()) < 0;
00277 }
00278
00279 inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); }
00280 inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; }
00281 inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); }
00282 inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); }
00283
00284 inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; }
00285 inline bool operator == (const char* a, const TiXmlString & b) { return b == a; }
00286 inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); }
00287 inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); }
00288
00289 TiXmlString operator + (const TiXmlString & a, const TiXmlString & b);
00290 TiXmlString operator + (const TiXmlString & a, const char* b);
00291 TiXmlString operator + (const char* a, const TiXmlString & b);
00292
00293
00294
00295
00296
00297
00298 class TiXmlOutStream : public TiXmlString
00299 {
00300 public :
00301
00302
00303 TiXmlOutStream & operator << (const TiXmlString & in)
00304 {
00305 *this += in;
00306 return *this;
00307 }
00308
00309
00310 TiXmlOutStream & operator << (const char * in)
00311 {
00312 *this += in;
00313 return *this;
00314 }
00315
00316 } ;
00317
00318 #endif // TIXML_STRING_INCLUDED
00319 #endif // TIXML_USE_STL