Merge pull request #558 from leethomason/clone

Support clone (deep copy) of XMLDocument and XMLNode
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index 5c459a6..772d2ae 100755
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -2006,6 +2006,7 @@
 

 void XMLDocument::MarkInUse(XMLNode* node)

 {

+	TIXMLASSERT(node);

 	TIXMLASSERT(node->_parent == 0);

 

 	for (int i = 0; i < _unlinked.Size(); ++i) {

diff --git a/tinyxml2.h b/tinyxml2.h
index f307059..3465f2f 100755
--- a/tinyxml2.h
+++ b/tinyxml2.h
@@ -265,8 +265,8 @@
     }

 

 	void SwapRemove(int i) {

-        TIXMLASSERT(i >= 0);

-		TIXMLASSERT(i < _size);

+		TIXMLASSERT(i >= 0 && i < _size);

+		TIXMLASSERT(_size > 0);

 		_mem[i] = _mem[_size - 1];

 		--_size;

 	}

diff --git a/xmltest.cpp b/xmltest.cpp
index 18d09ad..550bf75 100644
--- a/xmltest.cpp
+++ b/xmltest.cpp
@@ -292,6 +292,10 @@
 		_CrtMemCheckpoint( &startMemState );

 		// Enable MS Visual C++ debug heap memory leaks dump on exit

 		_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);

+		{

+			int leaksOnStart = _CrtDumpMemoryLeaks();

+			XMLTest( "No leaks on start?", FALSE, leaksOnStart );

+		}

 	#endif

 

 	{

@@ -1934,6 +1938,11 @@
 		_CrtMemState diffMemState;

 		_CrtMemDifference( &diffMemState, &startMemState, &endMemState );

 		_CrtMemDumpStatistics( &diffMemState );

+

+		{

+			int leaksBeforeExit = _CrtDumpMemoryLeaks();

+			XMLTest( "No leaks before exit?", FALSE, leaksBeforeExit );

+		}

 	#endif

 

 	printf ("\nPass %d, Fail %d\n", gPass, gFail);