130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunwww.sourceforge.net/projects/tinyxml
330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunThis software is provided 'as-is', without any express or implied
530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunwarranty. In no event will the authors be held liable for any
630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurundamages arising from the use of this software.
730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunPermission is granted to anyone to use this software for any
930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpurpose, including commercial applications, and to alter it and
1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunredistribute it freely, subject to the following restrictions:
1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun1. The origin of this software must not be misrepresented; you must
1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnot claim that you wrote the original software. If you use this
1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunsoftware in a product, an acknowledgment in the product documentation
1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunwould be appreciated but is not required.
1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun2. Altered source versions must be plainly marked as such, and
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunmust not be misrepresented as being the original software.
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun3. This notice may not be removed or altered from any source
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurundistribution.
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef TIXML_USE_STL
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef TIXML_STRING_INCLUDED
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define TIXML_STRING_INCLUDED
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <assert.h>
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <string.h>
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*	The support for explicit isn't that universal, and it isn't really
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	required - it is used to check that the TiXmlString class isn't incorrectly
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	used. Be nice to old compilers and macro it here:
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined(_MSC_VER) && (_MSC_VER >= 1200 )
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Microsoft visual studio, version 6 and higher.
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#define TIXML_EXPLICIT explicit
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#elif defined(__GNUC__) && (__GNUC__ >= 3 )
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// GCC version 3 and higher.s
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#define TIXML_EXPLICIT explicit
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	#define TIXML_EXPLICIT
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun   TiXmlString is an emulation of a subset of the std::string template.
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun   Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun   Only the member functions relevant to the TinyXML project have been implemented.
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun   The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun   a string and there's no more room, we allocate a buffer twice as big as we need.
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlString
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  public :
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// The size type used
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  	typedef size_t size_type;
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Error value for find primitive
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static const size_type npos; // = -1;
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// TiXmlString empty constructor
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlString () : rep_(&nullrep_)
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// TiXmlString copy constructor
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlString ( const TiXmlString & copy) : rep_(0)
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		init(copy.length());
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		memcpy(start(), copy.data(), length());
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// TiXmlString constructor, based on a string
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0)
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		init( static_cast<size_type>( strlen(copy) ));
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		memcpy(start(), copy, length());
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// TiXmlString constructor, based on a string
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0)
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		init(len);
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		memcpy(start(), str, len);
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// TiXmlString destructor
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	~TiXmlString ()
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		quit();
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlString& operator = (const char * copy)
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return assign( copy, (size_type)strlen(copy));
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlString& operator = (const TiXmlString & copy)
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return assign(copy.start(), copy.length());
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// += operator. Maps to append
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlString& operator += (const char * suffix)
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return append(suffix, static_cast<size_type>( strlen(suffix) ));
11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// += operator. Maps to append
11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlString& operator += (char single)
11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return append(&single, 1);
11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// += operator. Maps to append
12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlString& operator += (const TiXmlString & suffix)
12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return append(suffix.data(), suffix.length());
12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Convert a TiXmlString into a null-terminated char *
12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char * c_str () const { return rep_->str; }
12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Convert a TiXmlString into a char * (need not be null terminated).
13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char * data () const { return rep_->str; }
13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Return the length of a TiXmlString
13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	size_type length () const { return rep_->size; }
13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Alias for length()
13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	size_type size () const { return rep_->size; }
13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Checks if a TiXmlString is empty
14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	bool empty () const { return rep_->size == 0; }
14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// Return capacity of string
14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	size_type capacity () const { return rep_->capacity; }
14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// single char extraction
14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	const char& at (size_type index) const
14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		assert( index < length() );
15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return rep_->str[ index ];
15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// [] operator
15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	char& operator [] (size_type index) const
15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		assert( index < length() );
15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return rep_->str[ index ];
15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// find a char in a string. Return TiXmlString::npos if not found
16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	size_type find (char lookup) const
16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return find(lookup, 0);
16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// find a char in a string from an offset. Return TiXmlString::npos if not found
16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	size_type find (char tofind, size_type offset) const
16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if (offset >= length()) return npos;
17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		for (const char* p = c_str() + offset; *p != '\0'; ++p)
17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		   if (*p == tofind) return static_cast< size_type >( p - c_str() );
17430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
17530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return npos;
17630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
17730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
17830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void clear ()
17930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
18030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		//Lee:
18130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		//The original was just too strange, though correct:
18230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		//	TiXmlString().swap(*this);
18330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		//Instead use the quit & re-init:
18430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		quit();
18530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		init(0,0);
18630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
18730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
18830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	/*	Function to reserve a big amount of data when we know we'll need it. Be aware that this
18930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		function DOES NOT clear the content of the TiXmlString if any exists.
19030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	*/
19130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void reserve (size_type cap);
19230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
19330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlString& assign (const char* str, size_type len);
19430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
19530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlString& append (const char* str, size_type len);
19630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
19730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void swap (TiXmlString& other)
19830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
19930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		Rep* r = rep_;
20030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		rep_ = other.rep_;
20130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		other.rep_ = r;
20230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
20330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
20430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  private:
20530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
20630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void init(size_type sz) { init(sz, sz); }
20730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; }
20830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	char* start() const { return rep_->str; }
20930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	char* finish() const { return rep_->str + rep_->size; }
21030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
21130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	struct Rep
21230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
21330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		size_type size, capacity;
21430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		char str[1];
21530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	};
21630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
21730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void init(size_type sz, size_type cap)
21830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
21930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if (cap)
22030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
22130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// Lee: the original form:
22230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			//	rep_ = static_cast<Rep*>(operator new(sizeof(Rep) + cap));
22330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// doesn't work in some cases of new being overloaded. Switching
22430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// to the normal allocation, although use an 'int' for systems
22530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// that are overly picky about structure alignment.
22630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			const size_type bytesNeeded = sizeof(Rep) + cap;
22730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int );
22830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			rep_ = reinterpret_cast<Rep*>( new int[ intsNeeded ] );
22930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
23030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			rep_->str[ rep_->size = sz ] = '\0';
23130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			rep_->capacity = cap;
23230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
23330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		else
23430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
23530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			rep_ = &nullrep_;
23630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
23730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
23830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
23930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	void quit()
24030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
24130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		if (rep_ != &nullrep_)
24230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		{
24330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// The rep_ is really an array of ints. (see the allocator, above).
24430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			// Cast it back before delete, so the compiler won't incorrectly call destructors.
24530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun			delete [] ( reinterpret_cast<int*>( rep_ ) );
24630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		}
24730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
24830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
24930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	Rep * rep_;
25030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	static Rep nullrep_;
25130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
25230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} ;
25330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
25430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
25530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline bool operator == (const TiXmlString & a, const TiXmlString & b)
25630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
25730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return    ( a.length() == b.length() )				// optimization on some platforms
25830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	       && ( strcmp(a.c_str(), b.c_str()) == 0 );	// actual compare
25930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
26030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline bool operator < (const TiXmlString & a, const TiXmlString & b)
26130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
26230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	return strcmp(a.c_str(), b.c_str()) < 0;
26330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
26430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
26530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); }
26630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline bool operator >  (const TiXmlString & a, const TiXmlString & b) { return b < a; }
26730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); }
26830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); }
26930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
27030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; }
27130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline bool operator == (const char* a, const TiXmlString & b) { return b == a; }
27230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); }
27330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); }
27430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
27530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlString operator + (const TiXmlString & a, const TiXmlString & b);
27630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlString operator + (const TiXmlString & a, const char* b);
27730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunTiXmlString operator + (const char* a, const TiXmlString & b);
27830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
27930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
28030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
28130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun   TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.
28230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun   Only the operators that we need for TinyXML have been developped.
28330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun*/
28430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass TiXmlOutStream : public TiXmlString
28530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun{
28630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunpublic :
28730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
28830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// TiXmlOutStream << operator.
28930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlOutStream & operator << (const TiXmlString & in)
29030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
29130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		*this += in;
29230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return *this;
29330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
29430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
29530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	// TiXmlOutStream << operator.
29630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	TiXmlOutStream & operator << (const char * in)
29730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	{
29830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		*this += in;
29930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun		return *this;
30030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun	}
30130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
30230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} ;
30330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
30430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif	// TIXML_STRING_INCLUDED
30530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif	// TIXML_USE_STL
306