Enlightenment CVS committal

Author  : rbdpngn
Project : e17
Module  : libs/ewd

Dir     : e17/libs/ewd/src


Modified Files:
        ewd_tree.c 


Log Message:
A fixup for removing values from the tree. There is still a bug here, but it's
bettern than it was.

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewd/src/ewd_tree.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- ewd_tree.c  8 Nov 2001 22:47:26 -0000       1.5
+++ ewd_tree.c  5 Feb 2004 21:53:37 -0000       1.6
@@ -254,11 +254,16 @@
  */
 int ewd_tree_destroy(Ewd_Tree * tree)
 {
+       Ewd_Tree_Node *node;
+
        CHECK_PARAM_POINTER_RETURN("tree", tree, FALSE);
 
        EWD_WRITE_LOCK(tree);
-       while (tree->tree)
-               ewd_tree_remove_node(tree, tree->tree);
+       while ((node = tree->tree)) {
+               printf("Removing value: %d\n", node->key);
+               ewd_tree_remove_node(tree, node);
+               ewd_tree_node_destroy(node, tree->free_func);
+       }
        EWD_WRITE_UNLOCK(tree);
        EWD_DESTROY_LOCKS(tree);
 
@@ -463,40 +468,69 @@
        CHECK_PARAM_POINTER_RETURN("tree", tree, FALSE);
        CHECK_PARAM_POINTER_RETURN("node", node, FALSE);
 
-       traverse = node;
-
-       /* If there's a right node we need to start at that point, otherwise
-        * there's only a single left node. */
-       if (node->left_child)
+       /*
+        * Find the nearest value to the balanced one.
+        */
+       if (node->left_child) {
                traverse = node->left_child;
 
-       /* Now work our way down left side of the traverse node.
-        * This will give us the node with the next closest value to the
-        * current node. If node had no right node, then this will stop at
-        * node's left node. */
-       while (traverse->right_child)
-               traverse = traverse->right_child;
+               /* Now work our way down right side of the traverse node.
+                * This will give us the node with the next closest value
+                * to the current node. If traverse had no right node, then
+                * this will stop at node's left node. */
+               while (traverse->right_child) {
+                       traverse = traverse->right_child;
+               }
+
+               /*
+                * Hook any dropped leaves into the moved nodes spot
+                */
+               if (traverse->parent)
+                       traverse->parent->left_child = traverse->left_child;
+       }
+       else if (node->right_child) {
+               traverse = node->right_child;
 
-       if (traverse == node) {
-               if (traverse->parent) {
-                       if (traverse->parent->left_child == traverse)
-                               traverse->parent->left_child = NULL;
-                       else
-                               traverse->parent->right_child = NULL;
-               } else
-                       tree->tree = NULL;
+               /* Now work our way down left side of the traverse node.
+                * This will give us the node with the next closest value
+                * to the current node. If traverse had no left node, then
+                * this will stop at node's right node. */
+               while (traverse->left_child) {
+                       traverse = traverse->left_child;
+               }
+
+               /*
+                * Hook any dropped leaves into the moved nodes spot
+                */
+               if (traverse->right_child)
+                       traverse->right_child->parent = traverse->parent;
+
+               if (traverse->parent)
+                       traverse->parent->right_child = traverse->right_child;
+               else
+                       tree->tree = traverse->right_child;
+       }
+       else
                traverse = NULL;
-       } else {
-               /* This if ensures that we won't point traverse->right_child back
-                * to traverse */
-               if (node->right_child != traverse)
+
+       if (traverse) {
+
+               /*
+                * Ensure that we don't get a recursive reference.
+                */
+               if (node->right_child && node->right_child != traverse) {
+                       node->right_child->parent = traverse;
                        traverse->right_child = node->right_child;
+               }
 
-               /* This if ensures that we won't point traverse->left_child
-                * back to traverse */
-               if (node->left_child != traverse)
+               if (node->left_child && node->left_child != traverse) {
+                       node->left_child->parent = traverse;
                        traverse->left_child = node->left_child;
+               }
 
+               /*
+                * Hide the 
+                */
                if (traverse->parent) {
                        if (traverse->parent->left_child == traverse)
                                traverse->parent->left_child = NULL;
@@ -506,10 +540,25 @@
                traverse->parent = node->parent;
        }
 
+       if (node->parent) {
+               if (node == node->parent->left_child)
+                       node->parent->left_child = traverse;
+               else
+                       node->parent->right_child = traverse;
+       }
+
+       if (tree->tree == node)
+               tree->tree = traverse;
+
        node->parent = node->left_child = node->right_child = NULL;
 
-       for (; traverse; traverse = traverse->parent)
+       /*
+        * Rebalance the tree to ensure short search paths.
+        */
+       while (traverse) {
                tree_node_balance(tree, traverse);
+               traverse = traverse->parent;
+       }
 
        return TRUE;
 }
@@ -537,7 +586,6 @@
        if (!ewd_tree_remove_node(tree, node))
                return FALSE;
 
-       node->left_child = node->right_child = NULL;
        ewd_tree_node_destroy(node, tree->free_func);
 
        return TRUE;




-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to