From 74737f97ba86199fb2be4ae91a2d0f3743c9a5e5 Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Sun, 8 Nov 2009 14:23:40 +0000 Subject: XPath: Node set copy now preserves sorted flag (for performance and consistency), removed redundant m_using_storage internal flag git-svn-id: http://pugixml.googlecode.com/svn/trunk@222 99668b35-9821-0410-8761-19e4c4f06640 --- src/pugixml.hpp | 2 -- src/pugixpath.cpp | 20 +++++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/pugixml.hpp b/src/pugixml.hpp index 3ed6229..3f23e01 100644 --- a/src/pugixml.hpp +++ b/src/pugixml.hpp @@ -1947,8 +1947,6 @@ namespace pugi xpath_node* m_end; xpath_node* m_eos; - bool m_using_storage; - typedef xpath_node* iterator; iterator mut_begin(); diff --git a/src/pugixpath.cpp b/src/pugixpath.cpp index f2e0e56..27a11d7 100644 --- a/src/pugixpath.cpp +++ b/src/pugixpath.cpp @@ -657,36 +657,37 @@ namespace pugi } #endif - xpath_node_set::xpath_node_set(): m_type(type_unsorted), m_begin(&m_storage), m_end(&m_storage), m_eos(&m_storage + 1), m_using_storage(true) + xpath_node_set::xpath_node_set(): m_type(type_unsorted), m_begin(&m_storage), m_end(&m_storage), m_eos(&m_storage + 1) { } xpath_node_set::~xpath_node_set() { - if (!m_using_storage) delete[] m_begin; + if (m_begin != &m_storage) delete[] m_begin; } - xpath_node_set::xpath_node_set(const xpath_node_set& ns): m_type(type_unsorted), m_begin(&m_storage), m_end(&m_storage), m_eos(&m_storage + 1), m_using_storage(true) + xpath_node_set::xpath_node_set(const xpath_node_set& ns): m_type(type_unsorted), m_begin(&m_storage), m_end(&m_storage), m_eos(&m_storage + 1) { *this = ns; } xpath_node_set& xpath_node_set::operator=(const xpath_node_set& ns) { - if (!m_using_storage) delete[] m_begin; + if (&ns == this) return *this; + + if (m_begin != &m_storage) delete[] m_begin; m_begin = m_end = m_eos = 0; + m_type = ns.m_type; if (ns.size() == 1) { m_storage = *ns.m_begin; m_begin = &m_storage; m_end = m_eos = &m_storage + 1; - m_using_storage = true; } else { - m_using_storage = false; append(ns.begin(), ns.end()); } @@ -764,9 +765,7 @@ namespace pugi xpath_node* storage = new xpath_node[capacity]; std::copy(m_begin, m_end, storage); - if (!m_using_storage) delete[] m_begin; - - m_using_storage = false; + if (m_begin != &m_storage) delete[] m_begin; m_begin = storage; m_end = storage + size; @@ -2375,6 +2374,9 @@ namespace pugi xpath_node_set ls = m_left->eval_node_set(c); xpath_node_set rs = m_right->eval_node_set(c); + // we can optimize merging two sorted sets, but this is a very rare operation, so don't bother + ls.m_type = xpath_node_set::type_unsorted; + ls.append(rs.begin(), rs.end()); ls.remove_duplicates(); -- cgit v1.2.3