#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; /* * Allocate a new node. */ vieter_tree_node *vieter_tree_node_init(); /* * Free an allocated node. */ void vieter_tree_node_free(vieter_tree_node *node); /* * Insert a new key into the given tree. */ 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); /* * Search for the data represented by the given key. */ vieter_tree_error vieter_tree_node_search(void **out, vieter_tree_node *root, uint64_t key); /* * Remove the data associated with the given key. */ vieter_tree_error vieter_tree_node_remove(void **out, vieter_tree_node **root_ptr, uint64_t key); /* * Set a node's bit flag to the given value. */ void vieter_tree_node_set(vieter_tree_node *node, vieter_tree_node_flag flag, bool value); /* * Get whether a node's bit flag is set. */ bool vieter_tree_node_get(vieter_tree_node *node, vieter_tree_node_flag flag); /* * Add a new child to the parent, replacing either its left or right child, * depending on the key values. */ void vieter_tree_node_add_child(vieter_tree_node *parent, uint64_t key, vieter_tree_node *child); /* * Replace a node's children array. */ void vieter_tree_node_set_children(vieter_tree_node *parent, vieter_tree_node **children); /* * Set a node's left or right child to the given node. */ void vieter_tree_node_set_child(vieter_tree_node *parent, vieter_tree_node *child, bool right); /* * Return the in-order successor of the given node, or NULL if it's the last * node in the tree. */ vieter_tree_node *vieter_tree_node_next(vieter_tree_node *node); #endif