summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/pugixml.hpp4
-rw-r--r--src/pugixpath.cpp66
2 files changed, 42 insertions, 28 deletions
diff --git a/src/pugixml.hpp b/src/pugixml.hpp
index 40c3b98..91a3190 100644
--- a/src/pugixml.hpp
+++ b/src/pugixml.hpp
@@ -2212,6 +2212,8 @@ namespace pugi
void remove_duplicates();
+ void swap(xpath_node_set& ns);
+
public:
/**
* Default constructor
@@ -2238,7 +2240,7 @@ namespace pugi
* \return self
*/
xpath_node_set& operator=(const xpath_node_set& ns);
-
+
/**
* Get collection type
*
diff --git a/src/pugixpath.cpp b/src/pugixpath.cpp
index 1bb2d70..4040eb9 100644
--- a/src/pugixpath.cpp
+++ b/src/pugixpath.cpp
@@ -194,12 +194,6 @@ namespace
return duplicate_string(string, impl::strlen(string));
}
- void _swap(xpath_string& o)
- {
- pstd::swap(_buffer, o._buffer);
- pstd::swap(_uses_heap, o._uses_heap);
- }
-
public:
xpath_string(): _buffer(PUGIXML_TEXT("")), _uses_heap(false)
{
@@ -247,11 +241,17 @@ namespace
xpath_string& operator=(const xpath_string& o)
{
xpath_string temp(o);
- _swap(temp);
+ swap(temp);
return *this;
}
+ void swap(xpath_string& o)
+ {
+ pstd::swap(_buffer, o._buffer);
+ pstd::swap(_uses_heap, o._uses_heap);
+ }
+
void append(const xpath_string& o)
{
// skip empty sources
@@ -280,7 +280,7 @@ namespace
result[length] = 0;
// finalize
- xpath_string(result, true)._swap(*this);
+ xpath_string(result, true).swap(*this);
}
}
@@ -1106,36 +1106,43 @@ namespace pugi
xpath_node_set::~xpath_node_set()
{
- if (_begin != &_storage) delete[] _begin;
+ if (_begin != &_storage) get_memory_deallocation_function()(_begin);
}
- xpath_node_set::xpath_node_set(const xpath_node_set& ns): _type(type_unsorted), _begin(&_storage), _end(&_storage), _eos(&_storage + 1)
+ xpath_node_set::xpath_node_set(const xpath_node_set& ns): _type(ns._type), _begin(&_storage), _end(&_storage), _eos(&_storage + 1)
{
- *this = ns;
- }
-
- xpath_node_set& xpath_node_set::operator=(const xpath_node_set& ns)
- {
- if (&ns == this) return *this;
-
- if (_begin != &_storage) delete[] _begin;
-
- _begin = _end = _eos = 0;
- _type = ns._type;
-
if (ns.size() == 1)
{
_storage = *ns._begin;
- _begin = &_storage;
- _end = _eos = &_storage + 1;
+ _end = _eos;
}
else
{
append(ns.begin(), ns.end());
}
+ }
+
+ xpath_node_set& xpath_node_set::operator=(const xpath_node_set& ns)
+ {
+ if (this == &ns) return *this;
+
+ // clear & append
+ _type = ns._type;
+ _end = _begin;
+
+ append(ns.begin(), ns.end());
return *this;
- }
+ }
+
+ void xpath_node_set::swap(xpath_node_set& ns)
+ {
+ pstd::swap(_type, ns._type);
+ pstd::swap(_storage, ns._storage);
+ pstd::swap(_begin, ns._begin);
+ pstd::swap(_end, ns._end);
+ pstd::swap(_eos, ns._eos);
+ }
xpath_node_set::type_t xpath_node_set::type() const
{
@@ -1207,10 +1214,13 @@ namespace pugi
while (capacity < size + count) capacity += capacity / 2;
- xpath_node* storage = new xpath_node[capacity];
+ xpath_node* storage = static_cast<xpath_node*>(get_memory_allocation_function()(capacity * sizeof(xpath_node)));
+ if (!storage) return; // $$ out of memory
+
pstd::copy(_begin, _end, storage);
+ // memcpy(storage, _begin, size * sizeof(xpath_node));
- if (_begin != &_storage) delete[] _begin;
+ if (_begin != &_storage) get_memory_deallocation_function()(_begin);
_begin = storage;
_end = storage + size;
@@ -1218,6 +1228,7 @@ namespace pugi
}
pstd::copy(begin, end, _end);
+ // memcpy(_end, begin, count * sizeof(xpath_node));
_end += count;
}
@@ -2828,6 +2839,7 @@ namespace pugi
assert(!_right); // root step can't have any predicates
xpath_node_set ns;
+ ns._type = xpath_node_set::type_sorted;
if (c.n.node()) ns.push_back(c.n.node().root());
else if (c.n.attribute()) ns.push_back(c.n.parent().root());