]> git.mxchange.org Git - simgear.git/commitdiff
Melchior FRANZ:
authorehofman <ehofman>
Wed, 29 Jun 2005 09:41:07 +0000 (09:41 +0000)
committerehofman <ehofman>
Wed, 29 Jun 2005 09:41:07 +0000 (09:41 +0000)
- check for isTied() and refcount has to be made *before* we go into
  recursion, so as to pertain subtrees of refcounted nodes, even if there
  are no refcounted/tied nodes *in* this tree
- return value inverted, because it's more logical to say
  removeChildren() == true --> everything removed;  false --> failed
- further cleanup

simgear/props/props.cxx
simgear/props/props.hxx

index 927fdd955e29dba65074a4a235f5c7fd0f07b12e..6f8495c770c692b3dd8c7d6c78bb486c73767efa 100644 (file)
@@ -942,44 +942,39 @@ SGPropertyNode::detachChild (const char * name, int index, bool keep)
 
 /**
  * Remove a child node, and all children that aren't referenced.
- * Returns "true" if not all nodes could be deleted.
+ * Returns "true" if the node and all subnodes could be removed.
  */
 bool
 SGPropertyNode::removeChild (const char * name, int index)
 {
-  bool dirty = false;
   int pos = find_child(name, index, _children);
   if (pos >= 0) {
     vector<SGPropertyNode_ptr>::iterator it = _children.begin();
     it += pos;
     SGPropertyNode *node = _children[pos];
-    if (node->nChildren() && node->removeChildren())
-      dirty = true;
+    if (node->_count != 1 || node->isTied() || !node->removeChildren())
+      return false;
 
-    if (node->isTied() || node->_count != 1 || node->nChildren())
-      dirty = true;
-    else {
-      if (_path_cache)
-        _path_cache->erase(name); // EMH - TODO: Take "index" into account!
+    if (_path_cache)
+      _path_cache->erase(name); // EMH - TODO: Take "index" into account!
 
-      node->setAttribute(REMOVED, true);
-      node->clearValue();
-      fireChildRemoved(node);
-      _children.erase(it);
-    }
+    node->setAttribute(REMOVED, true);
+    node->clearValue();
+    fireChildRemoved(node);
+    _children.erase(it);
   }
-  return dirty;
+  return true;
 }
 
 
 /**
- * Remove all children nodes, or all with a given name. Returns
- * "true" if not all nodes could be deleted.
+ * Remove all children nodes, or all with a given name.
+ * Returns "true" if the node and all subnodes could be removed.
  */
 bool
 SGPropertyNode::removeChildren(const char *name)
 {
-  bool dirty = false;
+  bool success = true;
   vector<SGPropertyNode_ptr>::iterator it = _children.end();
   vector<SGPropertyNode_ptr>::iterator begin = _children.begin();
   while (it-- != begin) {
@@ -987,11 +982,8 @@ SGPropertyNode::removeChildren(const char *name)
     if (name && !compare_strings(node->getName(), name))
       continue;
 
-    if (node->nChildren() && node->removeChildren())
-      dirty = true;
-
-    if (node->isTied() || node->_count != 1 || node->nChildren())
-      dirty = true;
+    if (node->_count != 1 || node->isTied() || !node->removeChildren())
+      success = false;
     else {
       if (_path_cache)
         _path_cache->erase(node->getName());
@@ -1002,7 +994,7 @@ SGPropertyNode::removeChildren(const char *name)
       _children.erase(it);
     }
   }
-  return dirty;
+  return success;
 }
 
 
index 9a3e4a7e315065109aac4ee6cc68149bb97c8ad9..092fc224d3ace2d15174353f55348fc4335ed6e6 100644 (file)
@@ -714,14 +714,16 @@ public:
 
 
   /**
-   * Remove a child node. Returns "true" if at least one node had to remain,
-   * because it was tied, aliased, or refcounted through SGPropertyNode_ptr.
+   * Remove a child node. Returns "true" if the node and all subnodes could
+   * be removed, and "false" if at least one node had to remain, because it
+   * was tied, aliased, or refcounted through SGPropertyNode_ptr.
    */
   bool removeChild (const char * name, int index = 0);
 
 
   /**
-   * Remove all children nodes, or all with a given name.
+   * Remove all children nodes, or all with a given name. True if all nodes
+   * were removed.
    */
   bool removeChildren(const char * name = 0);