]> git.mdlowis.com Git - projs/libcds.git/commitdiff
create red/black trees
authora bellenir <a@bellenir.com>
Tue, 5 Aug 2014 18:58:43 +0000 (18:58 +0000)
committera bellenir <a@bellenir.com>
Tue, 5 Aug 2014 18:58:43 +0000 (18:58 +0000)
source/rb/rb.c [new file with mode: 0644]
source/rb/rb.h [new file with mode: 0644]
tests/main.c
tests/test_rb.c [new file with mode: 0644]

diff --git a/source/rb/rb.c b/source/rb/rb.c
new file mode 100644 (file)
index 0000000..07de5f3
--- /dev/null
@@ -0,0 +1,34 @@
+#include <stdlib.h>
+
+#include "mem.h"
+#include "rb.h"
+
+static void rb_tree_free(void* v_tree){
+       rb_tree_t* tree = (rb_tree_t*) v_tree;
+       if(tree && tree->root) mem_release(tree->root);
+}
+
+static void rb_node_free(void* v_node){
+       rb_node_t* node = (rb_node_t*) v_node;
+       if(node){
+               if(node->left) mem_release(node->left);
+               if(node->right) mem_release(node->right);
+       }
+}
+
+
+rb_node_t* rb_node_new(int contents){
+       rb_node_t* node = mem_allocate(sizeof(rb_node_t), &rb_node_free);
+       node->left = NULL;
+       node->right = NULL;
+       node->contents = contents;
+       node->color = RED;
+       return node;
+}
+
+rb_tree_t* rb_tree_new(){
+       rb_tree_t* tree = mem_allocate(sizeof(rb_tree_t), &rb_tree_free);
+       tree->root = NULL;
+       return tree;
+}
+
diff --git a/source/rb/rb.h b/source/rb/rb.h
new file mode 100644 (file)
index 0000000..06dd293
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef RB_H
+#define RB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+       RED = 0,
+       BLACK
+} rb_color_t;
+
+typedef struct rb_node_t {
+       struct rb_node_t* left;
+       struct rb_node_t* right;
+       rb_color_t color;
+       int contents; /* int for development; TODO: make this a void* */
+} rb_node_t;
+
+typedef struct {
+       rb_node_t* root;
+} rb_tree_t;
+
+
+rb_node_t* rb_node_new(int contents);
+rb_tree_t* rb_tree_new();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RB_H */
+
index 0e15d6b458c47f4792fdc9de9c215d8692e19545..b34c392c4a2e8daf541efaf041cc69757c407ed2 100644 (file)
@@ -7,5 +7,6 @@ int main(int argc, char** argv)
     RUN_TEST_SUITE(Vector);
     RUN_TEST_SUITE(List);
     RUN_TEST_SUITE(Buffer);
+    RUN_TEST_SUITE(RB);
     return PRINT_TEST_RESULTS();
 }
diff --git a/tests/test_rb.c b/tests/test_rb.c
new file mode 100644 (file)
index 0000000..e2440c6
--- /dev/null
@@ -0,0 +1,32 @@
+// Unit Test Framework Includes
+#include "test.h"
+
+#include "rb.h"
+#include "mem.h"
+
+static void test_setup(void) { }
+//-----------------------------------------------------------------------------
+// Begin Unit Tests
+//-----------------------------------------------------------------------------
+TEST_SUITE(RB) {
+    //-------------------------------------------------------------------------
+    // Test the rb_new functions
+    //-------------------------------------------------------------------------
+    TEST(Verify_rb_node_new_returns_a_new_node){
+               rb_node_t* node = rb_node_new(42);
+               CHECK(NULL != node);
+               CHECK(NULL == node->left);
+               CHECK(NULL == node->right);
+               CHECK(42 == node->contents);
+               mem_release(node);
+    }
+
+       TEST(Verify_rb_tree_new_returns_an_empty_red_black_tree){
+               rb_tree_t* rb = rb_tree_new();
+               CHECK(rb != NULL);
+               CHECK(rb->root == NULL);
+               mem_release(rb);
+       }
+
+}
+