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
This commit is contained in:
parent
48bbb9f4dd
commit
74737f97ba
@ -1947,8 +1947,6 @@ namespace pugi
|
|||||||
xpath_node* m_end;
|
xpath_node* m_end;
|
||||||
xpath_node* m_eos;
|
xpath_node* m_eos;
|
||||||
|
|
||||||
bool m_using_storage;
|
|
||||||
|
|
||||||
typedef xpath_node* iterator;
|
typedef xpath_node* iterator;
|
||||||
|
|
||||||
iterator mut_begin();
|
iterator mut_begin();
|
||||||
|
|||||||
@ -657,36 +657,37 @@ namespace pugi
|
|||||||
}
|
}
|
||||||
#endif
|
#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()
|
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;
|
*this = ns;
|
||||||
}
|
}
|
||||||
|
|
||||||
xpath_node_set& xpath_node_set::operator=(const xpath_node_set& 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_begin = m_end = m_eos = 0;
|
||||||
|
m_type = ns.m_type;
|
||||||
|
|
||||||
if (ns.size() == 1)
|
if (ns.size() == 1)
|
||||||
{
|
{
|
||||||
m_storage = *ns.m_begin;
|
m_storage = *ns.m_begin;
|
||||||
m_begin = &m_storage;
|
m_begin = &m_storage;
|
||||||
m_end = m_eos = &m_storage + 1;
|
m_end = m_eos = &m_storage + 1;
|
||||||
m_using_storage = true;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_using_storage = false;
|
|
||||||
append(ns.begin(), ns.end());
|
append(ns.begin(), ns.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -764,9 +765,7 @@ namespace pugi
|
|||||||
xpath_node* storage = new xpath_node[capacity];
|
xpath_node* storage = new xpath_node[capacity];
|
||||||
std::copy(m_begin, m_end, storage);
|
std::copy(m_begin, m_end, storage);
|
||||||
|
|
||||||
if (!m_using_storage) delete[] m_begin;
|
if (m_begin != &m_storage) delete[] m_begin;
|
||||||
|
|
||||||
m_using_storage = false;
|
|
||||||
|
|
||||||
m_begin = storage;
|
m_begin = storage;
|
||||||
m_end = storage + size;
|
m_end = storage + size;
|
||||||
@ -2375,6 +2374,9 @@ namespace pugi
|
|||||||
xpath_node_set ls = m_left->eval_node_set(c);
|
xpath_node_set ls = m_left->eval_node_set(c);
|
||||||
xpath_node_set rs = m_right->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.append(rs.begin(), rs.end());
|
||||||
|
|
||||||
ls.remove_duplicates();
|
ls.remove_duplicates();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user