#ifndef VIETER_TREE_NODE #define VIETER_TREE_NODE #include "vieter_tree.h" #include #include typedef enum vieter_tree_node_flag { vieter_tree_node_black = ((uint8_t)1) << 0, // This flag is used to index the children array. If this flag isn't set, // it'll evaluate to false, or index 0 in the children array. vieter_tree_node_right = ((uint8_t)1) << 1 } vieter_tree_node_flag; typedef struct vieter_tree_node { uint64_t key; void *data; struct vieter_tree_node *parent; struct vieter_tree_node *children[2]; uint8_t flags; } vieter_tree_node; vieter_tree_node *vieter_tree_node_init(); void vieter_tree_node_free(vieter_tree_node *node); vieter_tree_error vieter_tree_node_insert(vieter_tree_node *root, uint64_t key, void *data); /* * Return the node representing the requested value. */ vieter_tree_error vieter_tree_node_search_node(vieter_tree_node **out, vieter_tree_node *root, uint64_t key); vieter_tree_error vieter_tree_node_search(void **out, vieter_tree_node *root, uint64_t key); vieter_tree_error vieter_tree_node_remove(void **out, vieter_tree_node **root_ptr, uint64_t key); void vieter_tree_node_replace_with_child(vieter_tree_node *to_replace, vieter_tree_node *replacement); void vieter_tree_node_set(vieter_tree_node *node, vieter_tree_node_flag flag, bool value); bool vieter_tree_node_get(vieter_tree_node *node, vieter_tree_node_flag flag); void vieter_tree_node_add_child(vieter_tree_node *parent, uint64_t key, vieter_tree_node *child); void vieter_tree_node_set_children(vieter_tree_node *parent, vieter_tree_node **children); void vieter_tree_node_set_child(vieter_tree_node *parent, vieter_tree_node *child, bool right); bool vieter_tree_node_validate(vieter_tree_node *node, uint64_t passed_black_nodes, uint64_t expected_black_nodes); #endif