]> git.mdlowis.com Git - archive/atc.git/commitdiff
Started implementing splaytrees
authorMichael D. Lowis <mike@mdlowis.com>
Sun, 29 Mar 2015 23:02:09 +0000 (19:02 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Sun, 29 Mar 2015 23:02:09 +0000 (19:02 -0400)
source/runtime/splaytree.c
source/runtime/splaytree.h
tests/test_splaytree.c

index 34d5a05c8b008f188721ab0b5225f1eb4aea8d3e..37d9c5df2564ef8f1c37dbeec07176b7d1c19f89 100644 (file)
@@ -5,20 +5,61 @@
 #include "splaytree.h"
 #include <stdlib.h>
 
+static node_t* create_tree(uintptr_t val) {
+    node_t* node = (node_t*)malloc(sizeof(node_t));
+    node->value  = val;
+    node->parent = NULL;
+    node->left   = NULL;
+    node->right  = NULL;
+    return node;
+}
+
+static void destroy_tree(node_t* node) {
+    if (NULL != node) {
+        destroy_tree(node->left);
+        destroy_tree(node->right);
+    }
+}
+
 splaytree_t* splaytree_create(comp_fn_t cfn)
 {
-    (void)cfn;
-    return NULL;
+    splaytree_t* splaytree = (splaytree_t*)malloc(sizeof(splaytree_t));
+    splaytree->compare = cfn;
+    splaytree->root    = NULL;
+    return splaytree;
 }
 
 void splaytree_destroy(splaytree_t* tree)
 {
-    (void)tree;
+    destroy_tree(tree->root);
+    free(tree);
 }
 
-void splaytree_insert(splaytree_t* tree)
+void splaytree_insert(splaytree_t* tree, uintptr_t value)
 {
-    (void)tree;
+    if (tree->root == NULL) {
+        tree->root = create_tree(value);
+    } else {
+        node_t* curr = tree->root;
+        while (1) {
+            int cmp = tree->compare(value, curr->value);
+            if (0 == cmp) {
+                break;
+            } else if (cmp < 1) {
+                if (NULL == curr->left) {
+                    curr->left = create_tree(value);
+                } else {
+                    curr = curr->left;
+                }
+            } else if (cmp > 1) {
+                if (NULL == curr->right) {
+                    curr->right = create_tree(value);
+                } else {
+                    curr = curr->right;
+                }
+            }
+        }
+    }
 }
 
 uintptr_t splaytree_lookup(splaytree_t* tree, uintptr_t value)
index dd18a213c9b87434001d74d70f47c4ba7a429e97..2689ab0d10df4a0a2b04a2a178d1b9f18311bd73 100644 (file)
@@ -14,7 +14,7 @@ typedef struct node_t {
     struct node_t* right;
 } node_t;
 
-typedef int (*comp_fn_t)(uintptr_t a, uintptr_t b);
+typedef int (*comp_fn_t)(uintptr_t key, uintptr_t cval);
 
 typedef struct splaytree_t {
     comp_fn_t compare;
@@ -25,7 +25,7 @@ splaytree_t* splaytree_create(comp_fn_t cfn);
 
 void splaytree_destroy(splaytree_t* tree);
 
-void splaytree_insert(splaytree_t* tree);
+void splaytree_insert(splaytree_t* tree, uintptr_t value);
 
 uintptr_t splaytree_lookup(splaytree_t* tree, uintptr_t value);
 
index 396c42a5dcc2c72bfd3c393c2b752b0764330b8a..157e070f1575c18febc0fb36605d24784183192c 100644 (file)
@@ -2,7 +2,15 @@
 #include "splaytree.h"
 
 TEST_SUITE(SplayTree) {
-    TEST(Verify_foo) {
-        CHECK(0);
+    /* Verify: splaytree_create
+     *************************************************************************/
+    TEST(Verify_Create_allocates_and_initializes_an_empty_tree) {
+        splaytree_t* tree = splaytree_create((comp_fn_t)0x1234);
+        CHECK(tree->compare == (comp_fn_t)0x1234);
+        CHECK(tree->root    == NULL);
+        splaytree_destroy(tree);
     }
+
+    /* Verify: splaytree_create
+     *************************************************************************/
 }