Make removeChild() work (again?)

This commit is contained in:
ehofman
2005-05-17 09:56:08 +00:00
parent bdcb94af81
commit 3af1f3bc63
2 changed files with 33 additions and 2 deletions

View File

@@ -275,7 +275,7 @@ find_node (SGPropertyNode * current,
// Success! This is the one we want.
else if (position >= (int)components.size()) {
return current;
return (current->getAttribute(SGPropertyNode::REMOVED) ? 0 : current);
}
// Empty component means root.
@@ -927,6 +927,7 @@ SGPropertyNode::removeChild (const char * name, int index, bool keep)
if (keep) {
_removedChildren.push_back(node);
}
_path_cache->erase(name); // EMH - TODO: Take "index" into account!
node->setAttribute(REMOVED, true);
node->clearValue();
ret = node;
@@ -1737,7 +1738,7 @@ SGPropertyNode::getNode (const char * relative_path, int index, bool create)
vector<PathComponent> components;
parse_path(relative_path, components);
if (components.size() > 0)
components[components.size()-1].index = index;
components.back().index = index;
return find_node(this, components, 0, create);
}
@@ -2167,6 +2168,23 @@ SGPropertyNode::hash_table::bucket::get_entry (const char * key, bool create)
}
}
void
SGPropertyNode::hash_table::bucket::erase (const char * key)
{
int i;
for (i = 0; i < _length; i++) {
if (!strcmp(_entries[i]->get_key(), key))
break;
}
if (i < _length) {
for (++i; i < _length; i++) {
_entries[i-1] = _entries[i];
}
_length--;
}
}
SGPropertyNode::hash_table::hash_table ()
: _data_length(0),
@@ -2212,6 +2230,17 @@ SGPropertyNode::hash_table::put (const char * key, SGPropertyNode * value)
e->set_value(value);
}
void
SGPropertyNode::hash_table::erase (const char * key)
{
if (_data_length == 0)
return;
unsigned int index = hashcode(key) % _data_length;
if (_data[index] == 0)
return;
_data[index]->erase(key);
}
unsigned int
SGPropertyNode::hash_table::hashcode (const char * key)
{

View File

@@ -1312,6 +1312,7 @@ private:
bucket ();
virtual ~bucket ();
virtual entry * get_entry (const char * key, bool create = false);
virtual void erase(const char * key);
private:
int _length;
entry ** _entries;
@@ -1323,6 +1324,7 @@ private:
virtual ~hash_table ();
virtual SGPropertyNode * get (const char * key);
virtual void put (const char * key, SGPropertyNode * value);
virtual void erase(const char * key);
private:
unsigned int hashcode (const char * key);