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

Merge pull request #500 from Dmitry-Me/reuseAttributeCreation

Reuse attribute creation code
Lee Thomason 9 лет назад
Родитель
Сommit
5bbb6fb052
2 измененных файлов с 14 добавлено и 8 удалено
  1. 13 8
      tinyxml2.cpp
  2. 1 0
      tinyxml2.h

+ 13 - 8
tinyxml2.cpp

@@ -1714,9 +1714,8 @@ XMLAttribute* XMLElement::FindOrCreateAttribute( const char* name )
         }
         }
     }
     }
     if ( !attrib ) {
     if ( !attrib ) {
-        TIXMLASSERT( sizeof( XMLAttribute ) == _document->_attributePool.ItemSize() );
-        attrib = new (_document->_attributePool.Alloc() ) XMLAttribute();
-        attrib->_memPool = &_document->_attributePool;
+        attrib = CreateAttribute();
+        TIXMLASSERT( attrib );
         if ( last ) {
         if ( last ) {
             last->_next = attrib;
             last->_next = attrib;
         }
         }
@@ -1724,7 +1723,6 @@ XMLAttribute* XMLElement::FindOrCreateAttribute( const char* name )
             _rootAttribute = attrib;
             _rootAttribute = attrib;
         }
         }
         attrib->SetName( name );
         attrib->SetName( name );
-        attrib->_memPool->SetTracked(); // always created and linked.
     }
     }
     return attrib;
     return attrib;
 }
 }
@@ -1764,10 +1762,8 @@ char* XMLElement::ParseAttributes( char* p )
 
 
         // attribute.
         // attribute.
         if (XMLUtil::IsNameStartChar( *p ) ) {
         if (XMLUtil::IsNameStartChar( *p ) ) {
-            TIXMLASSERT( sizeof( XMLAttribute ) == _document->_attributePool.ItemSize() );
-            XMLAttribute* attrib = new (_document->_attributePool.Alloc() ) XMLAttribute();
-            attrib->_memPool = &_document->_attributePool;
-			attrib->_memPool->SetTracked();
+            XMLAttribute* attrib = CreateAttribute();
+            TIXMLASSERT( attrib );
 
 
             p = attrib->ParseDeep( p, _document->ProcessEntities() );
             p = attrib->ParseDeep( p, _document->ProcessEntities() );
             if ( !p || Attribute( attrib->Name() ) ) {
             if ( !p || Attribute( attrib->Name() ) ) {
@@ -1816,6 +1812,15 @@ void XMLElement::DeleteAttribute( XMLAttribute* attribute )
     pool->Free( attribute );
     pool->Free( attribute );
 }
 }
 
 
+XMLAttribute* XMLElement::CreateAttribute()
+{
+    TIXMLASSERT( sizeof( XMLAttribute ) == _document->_attributePool.ItemSize() );
+    XMLAttribute* attrib = new (_document->_attributePool.Alloc() ) XMLAttribute();
+    attrib->_memPool = &_document->_attributePool;
+    attrib->_memPool->SetTracked();
+    return attrib;
+}
+
 //
 //
 //	<ele></ele>
 //	<ele></ele>
 //	<ele>foo<b>bar</b></ele>
 //	<ele>foo<b>bar</b></ele>

+ 1 - 0
tinyxml2.h

@@ -1563,6 +1563,7 @@ private:
     //void LinkAttribute( XMLAttribute* attrib );
     //void LinkAttribute( XMLAttribute* attrib );
     char* ParseAttributes( char* p );
     char* ParseAttributes( char* p );
     static void DeleteAttribute( XMLAttribute* attribute );
     static void DeleteAttribute( XMLAttribute* attribute );
+    XMLAttribute* CreateAttribute();
 
 
     enum { BUF_SIZE = 200 };
     enum { BUF_SIZE = 200 };
     int _closingType;
     int _closingType;