From: Michael D. Lowis Date: Sun, 29 Mar 2015 23:02:09 +0000 (-0400) Subject: Started implementing splaytrees X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=84dc2a0af47fff920fdb90936263969b450ebe2b;p=archive%2Fatc.git Started implementing splaytrees --- diff --git a/source/runtime/splaytree.c b/source/runtime/splaytree.c index 34d5a05..37d9c5d 100644 --- a/source/runtime/splaytree.c +++ b/source/runtime/splaytree.c @@ -5,20 +5,61 @@ #include "splaytree.h" #include +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) diff --git a/source/runtime/splaytree.h b/source/runtime/splaytree.h index dd18a21..2689ab0 100644 --- a/source/runtime/splaytree.h +++ b/source/runtime/splaytree.h @@ -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); diff --git a/tests/test_splaytree.c b/tests/test_splaytree.c index 396c42a..157e070 100644 --- a/tests/test_splaytree.c +++ b/tests/test_splaytree.c @@ -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 + *************************************************************************/ }