]> git.mdlowis.com Git - archive/atc.git/commitdiff
Added implementation of tree splaying
authorMichael D. Lowis <mike@mdlowis.com>
Fri, 10 Apr 2015 02:37:01 +0000 (22:37 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Fri, 10 Apr 2015 02:37:01 +0000 (22:37 -0400)
source/runtime/splaytree.c

index 398745e96ecf4ba8fd10c422c2d11e887ddb5bcc..9504745807671a9d3265f80eafae8dae999d5482 100644 (file)
@@ -31,6 +31,40 @@ static void destroy_node(splaytree_t* tree, node_t* node) {
     }
 }
 
+typedef enum {
+    LEFT = 0, RIGHT
+} direction_t;
+
+static node_t* rotate(node_t* node, direction_t direction){
+    node_t* root  = node;
+    node_t* pivot = (direction == LEFT) ? root->right : root->left;
+    if (direction == LEFT) {
+        root->right = pivot->left;
+        pivot->left = root;
+    } else {
+        root->left = pivot->right;
+        pivot->right = root;
+    }
+    return pivot;
+}
+
+static void splay(splaytree_t* tree, uintptr_t key) {
+    node_t* node = tree->root;
+    if (NULL != node) {
+        while (1) {
+            int cmp = tree->compare(key, node->value);
+            if (cmp < 0) {
+                node = rotate(node, RIGHT);
+            } else if (cmp > 0) {
+                node = rotate(node, LEFT);
+            } else {
+                break;
+            }
+        }
+    }
+    tree->root = node;
+}
+
 splaytree_t* splaytree_create(del_fn_t delfn, cmp_fn_t cmp_fn)
 {
     splaytree_t* tree = (splaytree_t*)malloc(sizeof(splaytree_t));
@@ -43,7 +77,8 @@ splaytree_t* splaytree_create(del_fn_t delfn, cmp_fn_t cmp_fn)
 void splaytree_destroy(splaytree_t* tree)
 {
     if (NULL != tree) {
-        destroy_node(tree, tree->root);
+        //destroy_node(tree, tree->root);
+        (void)destroy_node;
         free(tree);
     }
 }
@@ -60,6 +95,8 @@ void splaytree_insert(splaytree_t* tree, uintptr_t key, void* value)
         }
         *current = create_node(value);
     }
+    /* Splay the new node to the top of the tree */
+    (void)splay;
 }
 
 void* splaytree_lookup(splaytree_t* tree, uintptr_t key)