]> git.mxchange.org Git - simgear.git/commitdiff
Make removeChild() work (again?)
authorehofman <ehofman>
Tue, 17 May 2005 09:56:08 +0000 (09:56 +0000)
committerehofman <ehofman>
Tue, 17 May 2005 09:56:08 +0000 (09:56 +0000)
simgear/props/props.cxx
simgear/props/props.hxx

index 76b94eb51e23ffe81fda8896e266eea655498f00..a46ecfc8f88215bdb75f2be347f03d707ecefe87 100644 (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)
 {
index e4c4220c0d2c48b755151d3d810da45d8e280cf3..9ce7df4bf52524d315366884ae72b97b292da427 100644 (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);