/**
* 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) {
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());
_children.erase(it);
}
}
- return dirty;
+ return success;
}
/**
- * 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);