summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <pbuetow@mimecast.com>2018-03-06 20:07:58 +0000
committerPaul Buetow <pbuetow@mimecast.com>2018-03-06 20:07:58 +0000
commitfd779da9cfd81db6bf1d01404149235d7dd3e9df (patch)
tree2fd4ef782c83c720fda3d1abeb2b4cb7a833405d
parent2ea7e9cca347e4051b650c138055a005ec6f1815 (diff)
add unit tests to btree data structure and add callback function support
-rw-r--r--ioriot/src/datas/btree.c97
-rw-r--r--ioriot/src/datas/btree.h3
-rw-r--r--ioriot/src/utests.c12
3 files changed, 81 insertions, 31 deletions
diff --git a/ioriot/src/datas/btree.c b/ioriot/src/datas/btree.c
index da5da48..b150066 100644
--- a/ioriot/src/datas/btree.c
+++ b/ioriot/src/datas/btree.c
@@ -39,18 +39,17 @@ void btree_destroy2(btree_s* b)
int btree_insert(btree_s* b, int key, void *data)
{
- int ret = 1;
+ int ret = 0;
if (b->root == NULL) {
b->root = btreelem_new(key, data);
- ret = 0;
+ ret = 1;
} else {
ret = btreelem_insert_r(b->root, key, data);
}
- if (ret == 0) {
+ if (ret == 0)
b->size++;
- }
return ret;
}
@@ -68,23 +67,28 @@ void btree_print(btree_s* b)
btreelem_print_r(b->root, 0);
}
+void btree_run_cb2(btree_s* b, void (*cb)(void *data, void *data2))
+{
+ btreelem_run_cb2_r(b->root, cb);
+}
+
btreelem_s* btreelem_new(int key, void *data)
{
btreelem_s *e = Malloc(btreelem_s);
+
*e = (btreelem_s) {
.key = key, .data = data, .left = NULL, .right = NULL
};
+
return e;
}
void btreelem_destroy_r(btreelem_s* e)
{
- if (e->left) {
+ if (e->left)
btreelem_destroy_r(e->left);
- }
- if (e->right) {
+ if (e->right)
btreelem_destroy_r(e->right);
- }
free(e);
}
@@ -103,26 +107,24 @@ void btreelem_destroy_r2(btreelem_s* e)
int btreelem_insert_r(btreelem_s* e, int key, void *data)
{
- int ret = 0;
+ int ret = 1;
if (e->key == key) {
- ret = 1;
+ ret = 0;
}
else if (e->key > key) {
- if (e->left == NULL) {
+ if (e->left == NULL)
e->left = btreelem_new(key, data);
- } else {
+ else
ret = btreelem_insert_r(e->left, key, data);
- }
}
else {
- if (e->right == NULL) {
+ if (e->right == NULL)
e->right = btreelem_new(key, data);
- } else {
+ else
ret = btreelem_insert_r(e->right, key, data);
- }
}
return ret;
@@ -132,20 +134,17 @@ void* btreelem_get_r(btreelem_s* e, int key)
{
void *data = NULL;
- if (e->key == key) {
+ if (e->key == key)
data = e->data;
- }
else if (e->key > key) {
- if (e->left) {
+ if (e->left)
data = btreelem_get_r(e->left, key);
- }
}
else {
- if (e->right) {
+ if (e->right)
data = btreelem_get_r(e->right, key);
- }
}
return data;
@@ -153,17 +152,57 @@ void* btreelem_get_r(btreelem_s* e, int key)
void btreelem_print_r(btreelem_s* e, int depth)
{
- for (int i = 0; i < depth; ++i) {
+ if (!e)
+ return;
+
+ for (int i = 0; i < depth; ++i)
Out(" ");
- }
- Put("%d\n", e->key);
+ Put("key:%d data:%ld\n", e->key, (long) e->data);
- if (e->left) {
+ if (e->left)
btreelem_print_r(e->left, depth);
- }
- if (e->right) {
+ if (e->right)
btreelem_print_r(e->right, depth+1);
- }
}
+void btreelem_run_cb2_r(btreelem_s* e, void (*cb)(void *data, void *data2))
+{
+ if (!e)
+ return;
+
+ cb((void*)(long)e->key, e->data);
+
+ if (e->left)
+ btreelem_run_cb2_r(e->left, cb);
+
+ if (e->right)
+ btreelem_run_cb2_r(e->right, cb);
+}
+
+void btree_test(void)
+{
+ btree_s *b = btree_new();
+ void* somedata = (void*)b;
+
+ assert(1 == btree_insert(b, 1, (void*)1));
+ assert(1 == btree_insert(b, 2, (void*)2));
+ assert(1 == btree_insert(b, 3, (void*)3));
+ assert(1 == (long)btree_get(b, 1));
+
+ assert(1 == btree_insert(b, 1234, somedata));
+ assert(1 == btree_insert(b, 13, somedata));
+ assert(1 == btree_insert(b, 666, somedata));
+ assert(0 == btree_insert(b, 13, somedata));
+
+ assert(NULL != btree_get(b, 666));
+ assert(NULL == btree_get(b, 777));
+
+ assert(0 == btree_insert(b, 666, somedata));
+ assert(1 == btree_insert(b, 42, (void*)42));
+ assert(42 == (long)btree_get(b, 42));
+
+ btree_print(b);
+
+ btree_destroy(b);
+}
diff --git a/ioriot/src/datas/btree.h b/ioriot/src/datas/btree.h
index 55da560..acc5477 100644
--- a/ioriot/src/datas/btree.h
+++ b/ioriot/src/datas/btree.h
@@ -41,6 +41,8 @@ void btree_destroy2(btree_s *b);
int btree_insert(btree_s *b, int key, void *data);
void* btree_get(btree_s *b, int key);
void btree_print(btree_s *b);
+void btree_run_cb2(btree_s* b, void (*cb)(void *data, void *data2));
+void btree_test(void);
btreelem_s* btreelem_new(int key, void *data);
void btreelem_destroy_r(btreelem_s *e);
@@ -48,5 +50,6 @@ void btreelem_destroy_r2(btreelem_s *e);
int btreelem_insert_r(btreelem_s *e, int key, void *data);
void* btreelem_get_r(btreelem_s *e, int key);
void btreelem_print_r(btreelem_s *e, int depth);
+void btreelem_run_cb2_r(btreelem_s* e, void (*cb)(void *data, void *data2));
#endif // BTREE_H
diff --git a/ioriot/src/utests.c b/ioriot/src/utests.c
index 7cc4959..0fc53c3 100644
--- a/ioriot/src/utests.c
+++ b/ioriot/src/utests.c
@@ -15,15 +15,20 @@
#include "utests.h"
#include "datas/amap.h"
+#include "datas/btree.h"
#include "datas/hmap.h"
#include "datas/list.h"
+#include "datas/ranges.h"
#include "datas/rbuffer.h"
#include "utils/utils.h"
void utests_run()
{
- fprintf(stderr, "Running utils_test()\n");
- utils_test();
+ fprintf(stderr, "Running btree_test()\n");
+ btree_test();
+
+ fprintf(stderr, "Running ranges_test()\n");
+ ranges_test();
fprintf(stderr, "Running amap_test()\n");
amap_test();
@@ -37,5 +42,8 @@ void utests_run()
fprintf(stderr, "Running rbuffer_test()\n");
rbuffer_test();
+ fprintf(stderr, "Running utils_test()\n");
+ utils_test();
+
fprintf(stderr, "Great success, run all unit tests without any errors!\n");
}