1562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project/*
2562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectwww.sourceforge.net/projects/tinyxml
3562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source ProjectOriginal file by Yves Berquin.
4562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
5562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source ProjectThis software is provided 'as-is', without any express or implied
6562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectwarranty. In no event will the authors be held liable for any
7562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectdamages arising from the use of this software.
8562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
9562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source ProjectPermission is granted to anyone to use this software for any
10562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectpurpose, including commercial applications, and to alter it and
11562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectredistribute it freely, subject to the following restrictions:
12562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
13562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project1. The origin of this software must not be misrepresented; you must
14562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectnot claim that you wrote the original software. If you use this
15562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectsoftware in a product, an acknowledgment in the product documentation
16562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectwould be appreciated but is not required.
17562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
18562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project2. Altered source versions must be plainly marked as such, and
19562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectmust not be misrepresented as being the original software.
20562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
21562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project3. This notice may not be removed or altered from any source
22562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectdistribution.
23562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project*/
24562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
25562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project/*
26562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project * THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005.
27562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project *
28562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project * - completely rewritten. compact, clean, and fast implementation.
29562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project * - sizeof(TiXmlString) = pointer size (4 bytes on 32-bit systems)
30562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project * - fixed reserve() to work as per specification.
31562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project * - fixed buggy compares operator==(), operator<(), and operator>()
32562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project * - fixed operator+=() to take a const ref argument, following spec.
33562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project * - added "copy" constructor with length, and most compare operators.
34562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project * - added swap(), clear(), size(), capacity(), operator+().
35562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project */
36562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
37562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project#ifndef TIXML_USE_STL
38562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
39562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project#ifndef TIXML_STRING_INCLUDED
40562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project#define TIXML_STRING_INCLUDED
41562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
42562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project#include <assert.h>
43562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project#include <string.h>
44562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
45562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project/*
46562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project   TiXmlString is an emulation of a subset of the std::string template.
47562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project   Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.
48562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project   Only the member functions relevant to the TinyXML project have been implemented.
49562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project   The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase
50562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project   a string and there's no more room, we allocate a buffer twice as big as we need.
51562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project*/
52562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectclass TiXmlString
53562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project{
54562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project  public :
55562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// The size type used
56562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project  	typedef unsigned int size_type;
57562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
58562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// Error value for find primitive
59562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	static const size_type npos; // = -1;
60562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
61562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
62562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// TiXmlString empty constructor
63562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	TiXmlString () : rep_(&nullrep_)
64562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
65562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
66562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
67562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// TiXmlString copy constructor
68562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	TiXmlString (const TiXmlString & copy)
69562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
70562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		init(copy.length());
71562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		memcpy(start(), copy.data(), length());
72562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
73562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
74562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// TiXmlString constructor, based on a string
75562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	TiXmlString (const char * copy)
76562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
77562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		init( static_cast<size_type>( strlen(copy) ));
78562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		memcpy(start(), copy, length());
79562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
80562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
81562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// TiXmlString constructor, based on a string
82562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	TiXmlString (const char * str, size_type len)
83562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
84562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		init(len);
85562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		memcpy(start(), str, len);
86562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
87562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
88562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// TiXmlString destructor
89562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	~TiXmlString ()
90562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
91562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		quit();
92562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
93562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
94562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// = operator
95562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	TiXmlString& operator = (const char * copy)
96562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
97562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		return assign( copy, (size_type)strlen(copy));
98562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
99562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
100562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// = operator
101562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	TiXmlString& operator = (const TiXmlString & copy)
102562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
103562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		return assign(copy.start(), copy.length());
104562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
105562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
106562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
107562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// += operator. Maps to append
108562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	TiXmlString& operator += (const char * suffix)
109562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
110562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		return append(suffix, static_cast<size_type>( strlen(suffix) ));
111562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
112562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
113562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// += operator. Maps to append
114562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	TiXmlString& operator += (char single)
115562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
116562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		return append(&single, 1);
117562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
118562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
119562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// += operator. Maps to append
120562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	TiXmlString& operator += (const TiXmlString & suffix)
121562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
122562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		return append(suffix.data(), suffix.length());
123562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
124562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
125562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
126562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// Convert a TiXmlString into a null-terminated char *
127562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	const char * c_str () const { return rep_->str; }
128562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
129562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// Convert a TiXmlString into a char * (need not be null terminated).
130562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	const char * data () const { return rep_->str; }
131562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
132562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// Return the length of a TiXmlString
133562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	size_type length () const { return rep_->size; }
134562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
135562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// Alias for length()
136562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	size_type size () const { return rep_->size; }
137562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
138562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// Checks if a TiXmlString is empty
139562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	bool empty () const { return rep_->size == 0; }
140562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
141562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// Return capacity of string
142562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	size_type capacity () const { return rep_->capacity; }
143562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
144562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
145562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// single char extraction
146562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	const char& at (size_type index) const
147562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
148562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		assert( index < length() );
149562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		return rep_->str[ index ];
150562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
151562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
152562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// [] operator
153562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	char& operator [] (size_type index) const
154562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
155562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		assert( index < length() );
156562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		return rep_->str[ index ];
157562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
158562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
159562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// find a char in a string. Return TiXmlString::npos if not found
160562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	size_type find (char lookup) const
161562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
162562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		return find(lookup, 0);
163562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
164562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
165562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// find a char in a string from an offset. Return TiXmlString::npos if not found
166562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	size_type find (char tofind, size_type offset) const
167562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
168562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		if (offset >= length()) return npos;
169562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
170562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		for (const char* p = c_str() + offset; *p != '\0'; ++p)
171562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		{
172562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		   if (*p == tofind) return static_cast< size_type >( p - c_str() );
173562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		}
174562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		return npos;
175562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
176562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
177562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	void clear ()
178562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
179562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		//Lee:
180562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		//The original was just too strange, though correct:
181562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		//	TiXmlString().swap(*this);
182562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		//Instead use the quit & re-init:
183562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		quit();
184562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		init(0,0);
185562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
186562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
187562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	/*	Function to reserve a big amount of data when we know we'll need it. Be aware that this
188562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		function DOES NOT clear the content of the TiXmlString if any exists.
189562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	*/
190562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	void reserve (size_type cap);
191562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
192562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	TiXmlString& assign (const char* str, size_type len);
193562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
194562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	TiXmlString& append (const char* str, size_type len);
195562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
196562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	void swap (TiXmlString& other)
197562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
198562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		Rep* r = rep_;
199562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		rep_ = other.rep_;
200562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		other.rep_ = r;
201562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
202562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
203562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project  private:
204562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
205562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	void init(size_type sz) { init(sz, sz); }
206562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; }
207562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	char* start() const { return rep_->str; }
208562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	char* finish() const { return rep_->str + rep_->size; }
209562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
210562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	struct Rep
211562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
212562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		size_type size, capacity;
213562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		char str[1];
214562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	};
215562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
216562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	void init(size_type sz, size_type cap)
217562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
218562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		if (cap)
219562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		{
220562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project			rep_ = static_cast<Rep*>(operator new(sizeof(Rep) + cap));
221562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project			rep_->str[ rep_->size = sz ] = '\0';
222562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project			rep_->capacity = cap;
223562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		}
224562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		else
225562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		{
226562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project			rep_ = &nullrep_;
227562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		}
228562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
229562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
230562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	void quit()
231562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
232562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		if (rep_ != &nullrep_)
233562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		{
234562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project			operator delete(rep_);
235562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		}
236562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
237562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
238562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	Rep * rep_;
239562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	static Rep nullrep_;
240562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
241562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project} ;
242562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
243562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
244562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectinline bool operator == (const TiXmlString & a, const TiXmlString & b)
245562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project{
246562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	return    ( a.length() == b.length() )				// optimization on some platforms
247562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	       && ( strcmp(a.c_str(), b.c_str()) == 0 );	// actual compare
248562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project}
249562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectinline bool operator < (const TiXmlString & a, const TiXmlString & b)
250562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project{
251562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	return strcmp(a.c_str(), b.c_str()) < 0;
252562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project}
253562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
254562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectinline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); }
255562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectinline bool operator >  (const TiXmlString & a, const TiXmlString & b) { return b < a; }
256562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectinline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); }
257562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectinline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); }
258562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
259562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectinline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; }
260562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectinline bool operator == (const char* a, const TiXmlString & b) { return b == a; }
261562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectinline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); }
262562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectinline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); }
263562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
264562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source ProjectTiXmlString operator + (const TiXmlString & a, const TiXmlString & b);
265562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source ProjectTiXmlString operator + (const TiXmlString & a, const char* b);
266562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source ProjectTiXmlString operator + (const char* a, const TiXmlString & b);
267562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
268562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
269562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project/*
270562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project   TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.
271562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project   Only the operators that we need for TinyXML have been developped.
272562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project*/
273562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectclass TiXmlOutStream : public TiXmlString
274562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project{
275562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Projectpublic :
276562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
277562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// TiXmlOutStream << operator.
278562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	TiXmlOutStream & operator << (const TiXmlString & in)
279562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
280562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		*this += in;
281562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		return *this;
282562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
283562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
284562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	// TiXmlOutStream << operator.
285562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	TiXmlOutStream & operator << (const char * in)
286562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	{
287562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		*this += in;
288562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project		return *this;
289562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project	}
290562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
291562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project} ;
292562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project
293562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project#endif	// TIXML_STRING_INCLUDED
294562be06492c3ac43adf153f550abaede6bc18a44The Android Open Source Project#endif	// TIXML_USE_STL
295