Added invalidate_document_order, now detaching deleted nodes and setting name/value to 0 after deleting (less bugs/debugging confusion)

git-svn-id: http://pugixml.googlecode.com/svn/trunk@110 99668b35-9821-0410-8761-19e4c4f06640
This commit is contained in:
arseny.kapoulkine 2009-01-19 11:21:49 +00:00
parent bf160df125
commit 0949bd80b6
2 changed files with 1997 additions and 1974 deletions

View File

@ -140,8 +140,19 @@ namespace pugi
void destroy() void destroy()
{ {
if (!name_insitu) delete[] name; parent = 0;
if (!value_insitu) delete[] value;
if (!name_insitu)
{
delete[] name;
name = 0;
}
if (!value_insitu)
{
delete[] value;
value = 0;
}
for (xml_attribute_struct* attr = first_attribute; attr; attr = attr->next_attribute) for (xml_attribute_struct* attr = first_attribute; attr; attr = attr->next_attribute)
attr->destroy(); attr->destroy();
@ -2584,7 +2595,7 @@ namespace pugi
return empty() ? 0 : _root->document_order; return empty() ? 0 : _root->document_order;
} }
void xml_node::precompute_document_order_impl() void xml_node::precompute_document_order_impl(unsigned int mask)
{ {
if (type() != node_document) return; if (type() != node_document) return;
@ -2593,10 +2604,10 @@ namespace pugi
for (;;) for (;;)
{ {
cur._root->document_order = current++; cur._root->document_order = mask & current++;
for (xml_attribute a = cur.first_attribute(); a; a = a.next_attribute()) for (xml_attribute a = cur.first_attribute(); a; a = a.next_attribute())
a._attr->document_order = current++; a._attr->document_order = mask & current++;
if (cur.first_child()) if (cur.first_child())
cur = cur.first_child(); cur = cur.first_child();
@ -2976,9 +2987,14 @@ namespace pugi
void xml_document::precompute_document_order() void xml_document::precompute_document_order()
{ {
precompute_document_order_impl(); precompute_document_order_impl(~0u);
} }
void xml_document::invalidate_document_order()
{
precompute_document_order_impl(0);
}
#ifndef PUGIXML_NO_STL #ifndef PUGIXML_NO_STL
std::string as_utf8(const wchar_t* str) std::string as_utf8(const wchar_t* str)
{ {

View File

@ -621,7 +621,7 @@ namespace pugi
explicit xml_node(xml_node_struct* p); explicit xml_node(xml_node_struct* p);
/// \internal Precompute document order (valid only for document node) /// \internal Precompute document order (valid only for document node)
void precompute_document_order_impl(); void precompute_document_order_impl(unsigned int mask);
/// \internal Get allocator /// \internal Get allocator
xml_allocator& get_allocator() const; xml_allocator& get_allocator() const;
@ -1600,6 +1600,13 @@ namespace pugi
* Sometimes this makes evaluation of XPath queries faster. * Sometimes this makes evaluation of XPath queries faster.
*/ */
void precompute_document_order(); void precompute_document_order();
/**
* Invalidate document order for the whole tree
* If you precomputed document order for the tree and inserted new nodes/attributes after that,
* XPath queries will sometimes give incorrect results.
*/
void invalidate_document_order();
}; };
#ifndef PUGIXML_NO_XPATH #ifndef PUGIXML_NO_XPATH