From 5811786ccdf88af00852db78318c48deaa0dc24c Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Wed, 7 Jul 2010 20:10:48 +0000 Subject: remove_child and remove_attribute now return operation result git-svn-id: http://pugixml.googlecode.com/svn/trunk@572 99668b35-9821-0410-8761-19e4c4f06640 --- src/pugixml.cpp | 22 +++++++++++++--------- src/pugixml.hpp | 12 ++++++++---- tests/test_dom_modify.cpp | 32 ++++++++++++++++---------------- 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/src/pugixml.cpp b/src/pugixml.cpp index 0b50fe7..96f6037 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -3774,21 +3774,21 @@ namespace pugi return result; } - void xml_node::remove_attribute(const char_t* name) + bool xml_node::remove_attribute(const char_t* name) { - remove_attribute(attribute(name)); + return remove_attribute(attribute(name)); } - void xml_node::remove_attribute(const xml_attribute& a) + bool xml_node::remove_attribute(const xml_attribute& a) { - if (!_root || !a._attr) return; + if (!_root || !a._attr) return false; // check that attribute belongs to *this xml_attribute_struct* attr = a._attr; while (attr->prev_attribute_c->next_attribute) attr = attr->prev_attribute_c; - if (attr != _root->first_attribute) return; + if (attr != _root->first_attribute) return false; if (a._attr->next_attribute) a._attr->next_attribute->prev_attribute_c = a._attr->prev_attribute_c; else if (_root->first_attribute) _root->first_attribute->prev_attribute_c = a._attr->prev_attribute_c; @@ -3797,16 +3797,18 @@ namespace pugi else _root->first_attribute = a._attr->next_attribute; destroy_attribute(a._attr, get_allocator(_root)); + + return true; } - void xml_node::remove_child(const char_t* name) + bool xml_node::remove_child(const char_t* name) { - remove_child(child(name)); + return remove_child(child(name)); } - void xml_node::remove_child(const xml_node& n) + bool xml_node::remove_child(const xml_node& n) { - if (!_root || !n._root || n._root->parent != _root) return; + if (!_root || !n._root || n._root->parent != _root) return false; if (n._root->next_sibling) n._root->next_sibling->prev_sibling_c = n._root->prev_sibling_c; else if (_root->first_child) _root->first_child->prev_sibling_c = n._root->prev_sibling_c; @@ -3815,6 +3817,8 @@ namespace pugi else _root->first_child = n._root->next_sibling; destroy_node(n._root, get_allocator(_root)); + + return true; } xml_node xml_node::find_child_by_attribute(const char_t* name, const char_t* attr_name, const char_t* attr_value) const diff --git a/src/pugixml.hpp b/src/pugixml.hpp index 00a273a..dacd8cd 100644 --- a/src/pugixml.hpp +++ b/src/pugixml.hpp @@ -1217,29 +1217,33 @@ namespace pugi * Remove specified attribute * * \param a - attribute to be removed + * \return success flag */ - void remove_attribute(const xml_attribute& a); + bool remove_attribute(const xml_attribute& a); /** * Remove attribute with the specified name, if any * * \param name - attribute name + * \return success flag */ - void remove_attribute(const char_t* name); + bool remove_attribute(const char_t* name); /** * Remove specified child * * \param n - child node to be removed + * \return success flag */ - void remove_child(const xml_node& n); + bool remove_child(const xml_node& n); /** * Remove child with the specified name, if any * * \param name - child name + * \return success flag */ - void remove_child(const char_t* name); + bool remove_child(const char_t* name); public: /** diff --git a/tests/test_dom_modify.cpp b/tests/test_dom_modify.cpp index fac3eba..384124c 100644 --- a/tests/test_dom_modify.cpp +++ b/tests/test_dom_modify.cpp @@ -273,21 +273,21 @@ TEST_XML(dom_node_insert_copy_before_attribute, "< TEST_XML(dom_node_remove_attribute, "") { - xml_node().remove_attribute(STR("a")); - xml_node().remove_attribute(xml_attribute()); + CHECK(!xml_node().remove_attribute(STR("a"))); + CHECK(!xml_node().remove_attribute(xml_attribute())); xml_node node = doc.child(STR("node")); xml_node child = node.child(STR("child")); - node.remove_attribute(STR("a")); - node.remove_attribute(xml_attribute()); - node.remove_attribute(child.attribute(STR("a4"))); + CHECK(!node.remove_attribute(STR("a"))); + CHECK(!node.remove_attribute(xml_attribute())); + CHECK(!node.remove_attribute(child.attribute(STR("a4")))); CHECK_NODE(doc, STR("")); - node.remove_attribute(STR("a1")); - node.remove_attribute(node.attribute(STR("a3"))); - child.remove_attribute(STR("a4")); + CHECK(node.remove_attribute(STR("a1"))); + CHECK(node.remove_attribute(node.attribute(STR("a3")))); + CHECK(child.remove_attribute(STR("a4"))); CHECK_NODE(doc, STR("")); } @@ -388,21 +388,21 @@ TEST_XML(dom_node_insert_child_before, "foo") TEST_XML(dom_node_remove_child, "") { - xml_node().remove_child(STR("a")); - xml_node().remove_child(xml_node()); + CHECK(!xml_node().remove_child(STR("a"))); + CHECK(!xml_node().remove_child(xml_node())); xml_node node = doc.child(STR("node")); xml_node child = node.child(STR("child")); - node.remove_child(STR("a")); - node.remove_child(xml_node()); - node.remove_child(child.child(STR("n4"))); + CHECK(!node.remove_child(STR("a"))); + CHECK(!node.remove_child(xml_node())); + CHECK(!node.remove_child(child.child(STR("n4")))); CHECK_NODE(doc, STR("")); - node.remove_child(STR("n1")); - node.remove_child(node.child(STR("n3"))); - child.remove_child(STR("n4")); + CHECK(node.remove_child(STR("n1"))); + CHECK(node.remove_child(node.child(STR("n3")))); + CHECK(child.remove_child(STR("n4"))); CHECK_NODE(doc, STR("")); } -- cgit v1.2.3