]> git.mxchange.org Git - simgear.git/blobdiff - simgear/props/props.cxx
Harald JOHNSEN:
[simgear.git] / simgear / props / props.cxx
index 2e14a643f90231accf59d3c4fd7737fe4a3e2424..dd8cb0c01fea7436eb50bf4be6bff8d733f0f48d 100644 (file)
@@ -778,7 +778,6 @@ SGPropertyNode::alias (SGPropertyNode * target)
   clearValue();
   _value.alias = target;
   _type = ALIAS;
-  _value.alias->incrementRef();
   return true;
 }
 
@@ -802,7 +801,6 @@ SGPropertyNode::unalias ()
   if (_type != ALIAS)
     return false;
   _type = NONE;
-  _value.alias->decrementRef();
   _value.alias = 0;
   return true;
 }
@@ -914,71 +912,29 @@ SGPropertyNode::getChildren (const char * name) const
 
 
 /**
- * Remove a child node, and all children that aren't referenced.
- * "keep" does only apply to the outmost item. Returns "true" if
- * not all nodes could be removed.
+ * Remove a child node
  */
-bool
+SGPropertyNode_ptr 
 SGPropertyNode::removeChild (const char * name, int index, bool keep)
 {
-  bool dirty = false;
+  SGPropertyNode_ptr ret;
   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->isTied() || node->_count != 1 || node->nChildren())
-      dirty = true;
-    else {
-      if (keep)
-        _removedChildren.push_back(node);
-
-      if (_path_cache)
-        _path_cache->erase(name); // EMH - TODO: Take "index" into account!
-
-      node->setAttribute(REMOVED, true);
-      node->clearValue();
-      fireChildRemoved(node);
-      _children.erase(it);
+    SGPropertyNode_ptr node = _children[pos];
+    _children.erase(it);
+    if (keep) {
+      _removedChildren.push_back(node);
     }
-  }
-  return dirty;
-}
-
-/**
- * Remove all children nodes, or all with a given name. Returns
- * "true" if not all nodes could be removed.
- */
-bool
-SGPropertyNode::removeChildren(const char *name)
-{
-  bool dirty = false;
-  vector<SGPropertyNode_ptr>::iterator it = _children.end();
-  vector<SGPropertyNode_ptr>::iterator begin = _children.begin();
-  while (it-- != begin) {
-    SGPropertyNode *node = *it;
-    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;
-    else {
-      if (_path_cache)
-        _path_cache->erase(node->getName());
-
-      node->setAttribute(REMOVED, true);
-      node->clearValue();
-      fireChildRemoved(node);
-      _children.erase(it);
-    }
-  }
-  return dirty;
+    if (_path_cache)
+       _path_cache->erase(name); // EMH - TODO: Take "index" into account!
+    node->setAttribute(REMOVED, true);
+    node->clearValue();
+    ret = node;
+    fireChildRemoved(node);
+  }
+  return ret;
 }