From 3af1f3bc63d9c5062652bb7caafb5729bab7a944 Mon Sep 17 00:00:00 2001 From: ehofman Date: Tue, 17 May 2005 09:56:08 +0000 Subject: [PATCH] Make removeChild() work (again?) --- simgear/props/props.cxx | 33 +++++++++++++++++++++++++++++++-- simgear/props/props.hxx | 2 ++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/simgear/props/props.cxx b/simgear/props/props.cxx index 76b94eb5..a46ecfc8 100644 --- a/simgear/props/props.cxx +++ b/simgear/props/props.cxx @@ -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 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) { diff --git a/simgear/props/props.hxx b/simgear/props/props.hxx index e4c4220c..9ce7df4b 100644 --- a/simgear/props/props.hxx +++ b/simgear/props/props.hxx @@ -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); -- 2.39.5