Root/
Source at commit 1319 created 12 years 11 months ago. By meklort, Makefile update | |
---|---|
1 | /*␊ |
2 | www.sourceforge.net/projects/tinyxml␊ |
3 | ␊ |
4 | This software is provided 'as-is', without any express or implied␊ |
5 | warranty. In no event will the authors be held liable for any␊ |
6 | damages arising from the use of this software.␊ |
7 | ␊ |
8 | Permission is granted to anyone to use this software for any␊ |
9 | purpose, including commercial applications, and to alter it and␊ |
10 | redistribute it freely, subject to the following restrictions:␊ |
11 | ␊ |
12 | 1. The origin of this software must not be misrepresented; you must␊ |
13 | not claim that you wrote the original software. If you use this␊ |
14 | software in a product, an acknowledgment in the product documentation␊ |
15 | would be appreciated but is not required.␊ |
16 | ␊ |
17 | 2. Altered source versions must be plainly marked as such, and␊ |
18 | must not be misrepresented as being the original software.␊ |
19 | ␊ |
20 | 3. This notice may not be removed or altered from any source␊ |
21 | distribution.␊ |
22 | */␊ |
23 | ␊ |
24 | ␊ |
25 | #ifndef TIXML_USE_STL␊ |
26 | ␊ |
27 | #ifndef TIXML_STRING_INCLUDED␊ |
28 | #define TIXML_STRING_INCLUDED␊ |
29 | ␊ |
30 | #include <assert.h>␊ |
31 | #include <string.h>␊ |
32 | ␊ |
33 | /*␉The support for explicit isn't that universal, and it isn't really␊ |
34 | ␉required - it is used to check that the TiXmlString class isn't incorrectly␊ |
35 | ␉used. Be nice to old compilers and macro it here:␊ |
36 | */␊ |
37 | #if defined(_MSC_VER) && (_MSC_VER >= 1200 )␊ |
38 | ␉// Microsoft visual studio, version 6 and higher.␊ |
39 | ␉#define TIXML_EXPLICIT explicit␊ |
40 | #elif defined(__GNUC__) && (__GNUC__ >= 3 )␊ |
41 | ␉// GCC version 3 and higher.s␊ |
42 | ␉#define TIXML_EXPLICIT explicit␊ |
43 | #else␊ |
44 | ␉#define TIXML_EXPLICIT␊ |
45 | #endif␊ |
46 | ␊ |
47 | ␊ |
48 | /*␊ |
49 | TiXmlString is an emulation of a subset of the std::string template.␊ |
50 | Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.␊ |
51 | Only the member functions relevant to the TinyXML project have been implemented.␊ |
52 | The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase␊ |
53 | a string and there's no more room, we allocate a buffer twice as big as we need.␊ |
54 | */␊ |
55 | class TiXmlString␊ |
56 | {␊ |
57 | public :␊ |
58 | ␉// The size type used␊ |
59 | ␉typedef size_t size_type;␊ |
60 | ␊ |
61 | ␉// Error value for find primitive␊ |
62 | ␉static const size_type npos; // = -1;␊ |
63 | ␊ |
64 | ␊ |
65 | ␉// TiXmlString empty constructor␊ |
66 | ␉TiXmlString () : rep_(&nullrep_)␊ |
67 | ␉{␊ |
68 | ␉}␊ |
69 | ␊ |
70 | ␉// TiXmlString copy constructor␊ |
71 | ␉TiXmlString ( const TiXmlString & copy) : rep_(0)␊ |
72 | ␉{␊ |
73 | ␉␉init(copy.length());␊ |
74 | ␉␉memcpy(start(), copy.data(), length());␊ |
75 | ␉}␊ |
76 | ␊ |
77 | ␉// TiXmlString constructor, based on a string␊ |
78 | ␉TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0)␊ |
79 | ␉{␊ |
80 | ␉␉init( static_cast<size_type>( strlen(copy) ));␊ |
81 | ␉␉memcpy(start(), copy, length());␊ |
82 | ␉}␊ |
83 | ␊ |
84 | ␉// TiXmlString constructor, based on a string␊ |
85 | ␉TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0)␊ |
86 | ␉{␊ |
87 | ␉␉init(len);␊ |
88 | ␉␉memcpy(start(), str, len);␊ |
89 | ␉}␊ |
90 | ␊ |
91 | ␉// TiXmlString destructor␊ |
92 | ␉~TiXmlString ()␊ |
93 | ␉{␊ |
94 | ␉␉quit();␊ |
95 | ␉}␊ |
96 | ␊ |
97 | ␉TiXmlString& operator = (const char * copy)␊ |
98 | ␉{␊ |
99 | ␉␉return assign( copy, (size_type)strlen(copy));␊ |
100 | ␉}␊ |
101 | ␊ |
102 | ␉TiXmlString& operator = (const TiXmlString & copy)␊ |
103 | ␉{␊ |
104 | ␉␉return assign(copy.start(), copy.length());␊ |
105 | ␉}␊ |
106 | ␊ |
107 | ␊ |
108 | ␉// += operator. Maps to append␊ |
109 | ␉TiXmlString& operator += (const char * suffix)␊ |
110 | ␉{␊ |
111 | ␉␉return append(suffix, static_cast<size_type>( strlen(suffix) ));␊ |
112 | ␉}␊ |
113 | ␊ |
114 | ␉// += operator. Maps to append␊ |
115 | ␉TiXmlString& operator += (char single)␊ |
116 | ␉{␊ |
117 | ␉␉return append(&single, 1);␊ |
118 | ␉}␊ |
119 | ␊ |
120 | ␉// += operator. Maps to append␊ |
121 | ␉TiXmlString& operator += (const TiXmlString & suffix)␊ |
122 | ␉{␊ |
123 | ␉␉return append(suffix.data(), suffix.length());␊ |
124 | ␉}␊ |
125 | ␊ |
126 | ␊ |
127 | ␉// Convert a TiXmlString into a null-terminated char *␊ |
128 | ␉const char * c_str () const { return rep_->str; }␊ |
129 | ␊ |
130 | ␉// Convert a TiXmlString into a char * (need not be null terminated).␊ |
131 | ␉const char * data () const { return rep_->str; }␊ |
132 | ␊ |
133 | ␉// Return the length of a TiXmlString␊ |
134 | ␉size_type length () const { return rep_->size; }␊ |
135 | ␊ |
136 | ␉// Alias for length()␊ |
137 | ␉size_type size () const { return rep_->size; }␊ |
138 | ␊ |
139 | ␉// Checks if a TiXmlString is empty␊ |
140 | ␉bool empty () const { return rep_->size == 0; }␊ |
141 | ␊ |
142 | ␉// Return capacity of string␊ |
143 | ␉size_type capacity () const { return rep_->capacity; }␊ |
144 | ␊ |
145 | ␊ |
146 | ␉// single char extraction␊ |
147 | ␉const char& at (size_type index) const␊ |
148 | ␉{␊ |
149 | ␉␉assert( index < length() );␊ |
150 | ␉␉return rep_->str[ index ];␊ |
151 | ␉}␊ |
152 | ␊ |
153 | ␉// [] operator␊ |
154 | ␉char& operator [] (size_type index) const␊ |
155 | ␉{␊ |
156 | ␉␉assert( index < length() );␊ |
157 | ␉␉return rep_->str[ index ];␊ |
158 | ␉}␊ |
159 | ␊ |
160 | ␉// find a char in a string. Return TiXmlString::npos if not found␊ |
161 | ␉size_type find (char lookup) const␊ |
162 | ␉{␊ |
163 | ␉␉return find(lookup, 0);␊ |
164 | ␉}␊ |
165 | ␊ |
166 | ␉// find a char in a string from an offset. Return TiXmlString::npos if not found␊ |
167 | ␉size_type find (char tofind, size_type offset) const␊ |
168 | ␉{␊ |
169 | ␉␉if (offset >= length()) return npos;␊ |
170 | ␊ |
171 | ␉␉for (const char* p = c_str() + offset; *p != '\0'; ++p)␊ |
172 | ␉␉{␊ |
173 | ␉␉ if (*p == tofind) return static_cast< size_type >( p - c_str() );␊ |
174 | ␉␉}␊ |
175 | ␉␉return npos;␊ |
176 | ␉}␊ |
177 | ␊ |
178 | ␉void clear ()␊ |
179 | ␉{␊ |
180 | ␉␉//Lee:␊ |
181 | ␉␉//The original was just too strange, though correct:␊ |
182 | ␉␉//␉TiXmlString().swap(*this);␊ |
183 | ␉␉//Instead use the quit & re-init:␊ |
184 | ␉␉quit();␊ |
185 | ␉␉init(0,0);␊ |
186 | ␉}␊ |
187 | ␊ |
188 | ␉/*␉Function to reserve a big amount of data when we know we'll need it. Be aware that this␊ |
189 | ␉␉function DOES NOT clear the content of the TiXmlString if any exists.␊ |
190 | ␉*/␊ |
191 | ␉void reserve (size_type cap);␊ |
192 | ␊ |
193 | ␉TiXmlString& assign (const char* str, size_type len);␊ |
194 | ␊ |
195 | ␉TiXmlString& append (const char* str, size_type len);␊ |
196 | ␊ |
197 | ␉void swap (TiXmlString& other)␊ |
198 | ␉{␊ |
199 | ␉␉Rep* r = rep_;␊ |
200 | ␉␉rep_ = other.rep_;␊ |
201 | ␉␉other.rep_ = r;␊ |
202 | ␉}␊ |
203 | ␊ |
204 | private:␊ |
205 | ␊ |
206 | ␉void init(size_type sz) { init(sz, sz); }␊ |
207 | ␉void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; }␊ |
208 | ␉char* start() const { return rep_->str; }␊ |
209 | ␉char* finish() const { return rep_->str + rep_->size; }␊ |
210 | ␊ |
211 | ␉struct Rep␊ |
212 | ␉{␊ |
213 | ␉␉size_type size, capacity;␊ |
214 | ␉␉char str[1];␊ |
215 | ␉};␊ |
216 | ␊ |
217 | ␉void init(size_type sz, size_type cap)␊ |
218 | ␉{␊ |
219 | ␉␉if (cap)␊ |
220 | ␉␉{␊ |
221 | ␉␉␉// Lee: the original form:␊ |
222 | ␉␉␉//␉rep_ = static_cast<Rep*>(operator new(sizeof(Rep) + cap));␊ |
223 | ␉␉␉// doesn't work in some cases of new being overloaded. Switching␊ |
224 | ␉␉␉// to the normal allocation, although use an 'int' for systems␊ |
225 | ␉␉␉// that are overly picky about structure alignment.␊ |
226 | ␉␉␉const size_type bytesNeeded = sizeof(Rep) + cap;␊ |
227 | ␉␉␉const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int ); ␊ |
228 | ␉␉␉rep_ = reinterpret_cast<Rep*>( new int[ intsNeeded ] );␊ |
229 | ␊ |
230 | ␉␉␉rep_->str[ rep_->size = sz ] = '\0';␊ |
231 | ␉␉␉rep_->capacity = cap;␊ |
232 | ␉␉}␊ |
233 | ␉␉else␊ |
234 | ␉␉{␊ |
235 | ␉␉␉rep_ = &nullrep_;␊ |
236 | ␉␉}␊ |
237 | ␉}␊ |
238 | ␊ |
239 | ␉void quit()␊ |
240 | ␉{␊ |
241 | ␉␉if (rep_ != &nullrep_)␊ |
242 | ␉␉{␊ |
243 | ␉␉␉// The rep_ is really an array of ints. (see the allocator, above).␊ |
244 | ␉␉␉// Cast it back before delete, so the compiler won't incorrectly call destructors.␊ |
245 | ␉␉␉delete [] ( reinterpret_cast<int*>( rep_ ) );␊ |
246 | ␉␉}␊ |
247 | ␉}␊ |
248 | ␊ |
249 | ␉Rep * rep_;␊ |
250 | ␉static Rep nullrep_;␊ |
251 | ␊ |
252 | } ;␊ |
253 | ␊ |
254 | ␊ |
255 | inline bool operator == (const TiXmlString & a, const TiXmlString & b)␊ |
256 | {␊ |
257 | ␉return ( a.length() == b.length() )␉␉␉␉// optimization on some platforms␊ |
258 | ␉ && ( strcmp(a.c_str(), b.c_str()) == 0 );␉// actual compare␊ |
259 | }␊ |
260 | inline bool operator < (const TiXmlString & a, const TiXmlString & b)␊ |
261 | {␊ |
262 | ␉return strcmp(a.c_str(), b.c_str()) < 0;␊ |
263 | }␊ |
264 | ␊ |
265 | inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); }␊ |
266 | inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; }␊ |
267 | inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); }␊ |
268 | inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); }␊ |
269 | ␊ |
270 | inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; }␊ |
271 | inline bool operator == (const char* a, const TiXmlString & b) { return b == a; }␊ |
272 | inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); }␊ |
273 | inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); }␊ |
274 | ␊ |
275 | TiXmlString operator + (const TiXmlString & a, const TiXmlString & b);␊ |
276 | TiXmlString operator + (const TiXmlString & a, const char* b);␊ |
277 | TiXmlString operator + (const char* a, const TiXmlString & b);␊ |
278 | ␊ |
279 | ␊ |
280 | /*␊ |
281 | TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.␊ |
282 | Only the operators that we need for TinyXML have been developped.␊ |
283 | */␊ |
284 | class TiXmlOutStream : public TiXmlString␊ |
285 | {␊ |
286 | public :␊ |
287 | ␊ |
288 | ␉// TiXmlOutStream << operator.␊ |
289 | ␉TiXmlOutStream & operator << (const TiXmlString & in)␊ |
290 | ␉{␊ |
291 | ␉␉*this += in;␊ |
292 | ␉␉return *this;␊ |
293 | ␉}␊ |
294 | ␊ |
295 | ␉// TiXmlOutStream << operator.␊ |
296 | ␉TiXmlOutStream & operator << (const char * in)␊ |
297 | ␉{␊ |
298 | ␉␉*this += in;␊ |
299 | ␉␉return *this;␊ |
300 | ␉}␊ |
301 | ␊ |
302 | } ;␊ |
303 | ␊ |
304 | #endif␉// TIXML_STRING_INCLUDED␊ |
305 | #endif␉// TIXML_USE_STL␊ |
306 |