summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/pugixml.cpp8
-rw-r--r--src/pugixml.hpp3
-rw-r--r--tests/test_document.cpp19
3 files changed, 30 insertions, 0 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index 6850589..ff5aaa9 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -4505,6 +4505,14 @@ namespace pugi
create();
}
+ void xml_document::reset(const xml_document& proto)
+ {
+ reset();
+
+ for (xml_node cur = proto.first_child(); cur; cur = cur.next_sibling())
+ append_copy(cur);
+ }
+
void xml_document::create()
{
// initialize sentinel page
diff --git a/src/pugixml.hpp b/src/pugixml.hpp
index ce4abe2..bb08064 100644
--- a/src/pugixml.hpp
+++ b/src/pugixml.hpp
@@ -740,6 +740,9 @@ namespace pugi
// Removes all nodes, leaving the empty document
void reset();
+ // Removes all nodes, then copies the entire contents of the specified document
+ void reset(const xml_document& proto);
+
#ifndef PUGIXML_NO_STL
// Load document from stream.
xml_parse_result load(std::basic_istream<char, std::char_traits<char> >& stream, unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
diff --git a/tests/test_document.cpp b/tests/test_document.cpp
index 342d07c..8796560 100644
--- a/tests/test_document.cpp
+++ b/tests/test_document.cpp
@@ -906,3 +906,22 @@ TEST(document_reset_empty)
CHECK(!doc.first_child());
CHECK_NODE(doc, STR(""));
}
+
+TEST_XML(document_reset_copy, "<node><child/></node>")
+{
+ xml_document doc2;
+
+ CHECK_NODE(doc2, STR(""));
+
+ doc2.reset(doc);
+
+ CHECK_NODE(doc2, STR("<node><child /></node>"));
+ CHECK(doc.first_child() != doc2.first_child());
+
+ doc.reset(doc2);
+
+ CHECK_NODE(doc, STR("<node><child /></node>"));
+ CHECK(doc.first_child() != doc2.first_child());
+
+ CHECK(doc.first_child().offset_debug() == -1);
+}