Просмотр исходного кода

integrated attributes into the placement new

Lee Thomason 14 лет назад
Родитель
Сommit
43f59307cc
3 измененных файлов с 25 добавлено и 28 удалено
  1. 9 13
      tinyxml2.cpp
  2. 3 2
      tinyxml2.h
  3. 13 13
      xmltest.cpp

+ 9 - 13
tinyxml2.cpp

@@ -17,6 +17,9 @@ static const char CR = CARRIAGE_RETURN;
 static const char SINGLE_QUOTE			= '\'';
 static const char DOUBLE_QUOTE			= '\"';
 
+#define DELETE_NODE( node ) { MemPool* pool = node->memPool; node->~XMLNode(); pool->Free( node ); }
+#define DELETE_ATTRIBUTE( attrib ) { MemPool* pool = attrib->memPool; attrib->~XMLAttribute(); pool->Free( attrib ); }
+
 struct Entity {
 	const char* pattern;
 	int length;
@@ -260,12 +263,7 @@ void XMLNode::ClearChildren()
 		XMLNode* node = firstChild;
 		Unlink( node );
 		
-		//delete node;
-		// placement new!
-		MemPool* pool = node->memPool;
-		node->~XMLNode();
-		pool->Free( node );
-		// fixme: memory never free'd. 
+		DELETE_NODE( node );
 	}
 	firstChild = lastChild = 0;
 }
@@ -347,10 +345,7 @@ char* XMLNode::ParseDeep( char* p )
 			p = node->ParseDeep( p );
 			// FIXME: is it the correct closing element?
 			if ( node->IsClosingElement() ) {
-				//delete node;
-				MemPool* pool = node->memPool;
-				node->~XMLNode();	// fixme linked list memory not free
-				pool->Free( node );
+				DELETE_NODE( node );
 				return p;
 			}
 			this->InsertEndChild( node );
@@ -444,7 +439,7 @@ XMLElement::~XMLElement()
 	XMLAttribute* attribute = rootAttribute;
 	while( attribute ) {
 		XMLAttribute* next = attribute->next;
-		delete attribute;
+		DELETE_ATTRIBUTE( attribute );
 		attribute = next;
 	}
 }
@@ -465,11 +460,12 @@ char* XMLElement::ParseAttributes( char* p, bool* closedElement )
 
 		// attribute.
 		if ( XMLBase::IsAlpha( *p ) ) {
-			XMLAttribute* attrib = new XMLAttribute( this );
+			XMLAttribute* attrib = new (document->attributePool.Alloc() ) XMLAttribute( this );
+			attrib->memPool = &document->attributePool;
 
 			p = attrib->ParseDeep( p );
 			if ( !p ) {
-				delete attrib;
+				DELETE_ATTRIBUTE( attrib );
 				document->SetError( XMLDocument::ERROR_PARSING_ATTRIBUTE, start, p );
 				return 0;
 			}

+ 3 - 2
tinyxml2.h

@@ -206,8 +206,8 @@ public:
 		root = chunk;
 	}
 	void Trace( const char* name ) {
-		printf( "Mempool %s watermark=%d current=%d size=%d nAlloc=%d blocks=%d\n",
-				 name, maxAllocs, currentAllocs, SIZE, nAllocs, blockPtrs.Size() );
+		printf( "Mempool %s watermark=%d [%dk] current=%d size=%d nAlloc=%d blocks=%d\n",
+				 name, maxAllocs, maxAllocs*SIZE/1024, currentAllocs, SIZE, nAllocs, blockPtrs.Size() );
 	}
 
 private:
@@ -419,6 +419,7 @@ private:
 	StrPair name;
 	StrPair value;
 	XMLAttribute* next;
+	MemPool* memPool;
 };
 
 

+ 13 - 13
xmltest.cpp

@@ -28,19 +28,19 @@ int main( int argc, const char* argv )
 	}
 #endif
 	{
-		static const char* test[] = {	//"<element />",
-									    //"<element></element>",
-										//"<element><subelement/></element>",
-									    //"<element><subelement></subelement></element>",
-									   // "<element><subelement><subsub/></subelement></element>",
-									    //"<!--comment beside elements--><element><subelement></subelement></element>",
-									    //"<!--comment beside elements, this time with spaces-->  \n <element>  <subelement> \n </subelement> </element>",
-									    //"<element attrib1='foo' attrib2=\"bar\" ></element>",
-									    //"<element attrib1='foo' attrib2=\"bar\" ><subelement attrib3='yeehaa' /></element>",
-										//"<element>Text inside element.</element>",
-										//"<element><b></b></element>",
-										//"<element>Text inside and <b>bolded</b> in the element.</element>",
-										//"<outer><element>Text inside and <b>bolded</b> in the element.</element></outer>",
+		static const char* test[] = {	"<element />",
+									    "<element></element>",
+										"<element><subelement/></element>",
+									    "<element><subelement></subelement></element>",
+									    "<element><subelement><subsub/></subelement></element>",
+									    "<!--comment beside elements--><element><subelement></subelement></element>",
+									    "<!--comment beside elements, this time with spaces-->  \n <element>  <subelement> \n </subelement> </element>",
+									    "<element attrib1='foo' attrib2=\"bar\" ></element>",
+									    "<element attrib1='foo' attrib2=\"bar\" ><subelement attrib3='yeehaa' /></element>",
+										"<element>Text inside element.</element>",
+										"<element><b></b></element>",
+										"<element>Text inside and <b>bolded</b> in the element.</element>",
+										"<outer><element>Text inside and <b>bolded</b> in the element.</element></outer>",
 										"<element>This &amp; That.</element>",
 										"<element attrib='This&lt;That' />",
 										0