diff options
Diffstat (limited to 'lib/avl_tree/avl_tree.h')
| -rw-r--r-- | lib/avl_tree/avl_tree.h | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/lib/avl_tree/avl_tree.h b/lib/avl_tree/avl_tree.h new file mode 100644 index 0000000..2f0563a --- /dev/null +++ b/lib/avl_tree/avl_tree.h @@ -0,0 +1,52 @@ +#ifndef AVL_TREE_H +#define AVL_TREE_H + +#include "../sys/sizes.h" + +typedef struct avl_tree_node_t__ { + i8 balance_factor; + struct avl_tree_node_t__ *parent; + struct avl_tree_node_t__ *left; + struct avl_tree_node_t__ *right; + void *value; +} avl_tree_node_t; + +/** DOC + * @type typename + * @name avl_tree_t + * + * @member avl_tree_node_t *root + * @member u64 size + * @member u8(*compare)(void*, void*) + * + * @description + * This type describes the head of an `avl_tree_t` + * It contains its `size` and holds its `root`. + * Additionally it holds the `compare` function + * which is used for having a custom order of elements. + * To use the normal order for an `avl_tree_t` just holding + * integers use the `<type>_compare` functions given by this header. + */ +typedef struct { + avl_tree_node_t *root; + u64 size; + i8(*compare)(void*, void*); + u8 free_value; +} avl_tree_t; + +avl_tree_t *new_avl_tree(i8(*compare)(void*, void*), u8 free_value); +void free_avl_tree(avl_tree_t *tree); +void *avl_tree_search(avl_tree_t *tree, void *value); +void avl_tree_insert(avl_tree_t *tree, void *value); +void avl_tree_remove(avl_tree_t *tree, void *value); + +i8 u8_compare(void*, void*); +i8 i8_compare(void*, void*); +i8 u16_compare(void*, void*); +i8 i16_compare(void*, void*); +i8 u32_compare(void*, void*); +i8 i32_compare(void*, void*); +i8 u64_compare(void*, void*); +i8 i64_compare(void*, void*); + +#endif |