summaryrefslogtreecommitdiff
path: root/include/engine/btree.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/engine/btree.h')
-rw-r--r--include/engine/btree.h57
1 files changed, 57 insertions, 0 deletions
diff --git a/include/engine/btree.h b/include/engine/btree.h
new file mode 100644
index 0000000..5405e7e
--- /dev/null
+++ b/include/engine/btree.h
@@ -0,0 +1,57 @@
+#ifndef BTREE_H
+#define BTREE_H
+
+#include <stddef.h>
+
+#define BTREE_DEGREE_DEFAULT 4
+
+#define BTREE_SIZE_MIN 8
+#define BTREE_SIZE_MAX 4096
+
+#define BTREE_CMP_LT ( -1 )
+#define BTREE_CMP_EQ ( 0 )
+#define BTREE_CMP_GT ( 1 )
+
+struct btree;
+struct btree_iter_t;
+
+/* elem_size: the size of the elements, typically `sizeof(struct <your struct>)`
+ * t: degree of the btree, if you're in doubt, use `BTREE_SIZE_DEFAULT`
+ * cmp: comparison function, in order to support any operations on the tree.
+ *
+ * This function just calls `btree_new_with_allocator` with `free` and `malloc`
+ * as initializers.
+ */
+struct btree* btree_new(size_t elem_size,
+ size_t t,
+ int (*cmp)(const void *a, const void *b));
+
+/* Same as `btree_new`, except that it actually initializes a btree, but with
+ * the given allocators.
+ */
+struct btree* btree_new_with_allocator(
+ size_t elem_size,
+ size_t t,
+ int (*cmp)(const void *a, const void *b),
+ void *(*alloc)(size_t),
+ void (*dealloc)(void*));
+
+void btree_free(struct btree **btree);
+
+void* btree_search(struct btree *btree, void *elem);
+void btree_insert(struct btree *btree, void *elem);
+int btree_delete(struct btree *btree, void *elem);
+
+void btree_print(struct btree *btree, void (*print_elem)(const void*));
+
+void* btree_first(struct btree *btree);
+void* btree_last(struct btree *btree);
+
+size_t btree_size(struct btree *btree);
+
+struct btree_iter_t* btree_iter_t_new(struct btree* tree);
+void btree_iter_t_reset(struct btree *tree, struct btree_iter_t** it);
+
+void* btree_iter(struct btree *tree, struct btree_iter_t *iter);
+
+#endif