#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)
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;
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);
#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
+ *************************************************************************/
}