2023-01-19 22:23:19 +01:00
|
|
|
#ifndef VIETER_TREE_NODE
|
|
|
|
#define VIETER_TREE_NODE
|
2023-01-19 21:22:08 +01:00
|
|
|
|
2023-01-19 22:23:19 +01:00
|
|
|
#include "vieter_tree.h"
|
2023-01-20 12:08:05 +01:00
|
|
|
#include <stdbool.h>
|
2023-02-23 10:13:58 +01:00
|
|
|
#include <stdint.h>
|
2023-01-20 12:08:05 +01:00
|
|
|
|
2023-01-29 17:32:27 +01:00
|
|
|
typedef enum vieter_tree_node_flag {
|
2023-01-29 20:33:11 +01:00
|
|
|
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
|
2023-01-29 17:32:27 +01:00
|
|
|
} vieter_tree_node_flag;
|
2023-01-19 21:22:08 +01:00
|
|
|
|
|
|
|
typedef struct vieter_tree_node {
|
2023-02-23 10:13:58 +01:00
|
|
|
uint64_t key;
|
|
|
|
void *data;
|
|
|
|
struct vieter_tree_node *parent;
|
|
|
|
struct vieter_tree_node *children[2];
|
|
|
|
uint8_t flags;
|
2023-01-19 21:22:08 +01:00
|
|
|
} vieter_tree_node;
|
|
|
|
|
2023-02-01 23:24:22 +01:00
|
|
|
/*
|
|
|
|
* Allocate a new node.
|
|
|
|
*/
|
2023-01-19 22:23:19 +01:00
|
|
|
vieter_tree_node *vieter_tree_node_init();
|
|
|
|
|
2023-02-01 23:24:22 +01:00
|
|
|
/*
|
|
|
|
* Free an allocated node.
|
|
|
|
*/
|
2023-01-20 11:07:33 +01:00
|
|
|
void vieter_tree_node_free(vieter_tree_node *node);
|
|
|
|
|
2023-02-01 23:24:22 +01:00
|
|
|
/*
|
|
|
|
* Insert a new key into the given tree.
|
|
|
|
*/
|
2023-02-23 10:13:58 +01:00
|
|
|
vieter_tree_error vieter_tree_node_insert(vieter_tree_node *root, uint64_t key,
|
|
|
|
void *data);
|
2023-01-19 22:23:19 +01:00
|
|
|
|
2023-01-29 17:32:27 +01:00
|
|
|
/*
|
|
|
|
* Return the node representing the requested value.
|
|
|
|
*/
|
2023-02-23 10:13:58 +01:00
|
|
|
vieter_tree_error vieter_tree_node_search_node(vieter_tree_node **out,
|
|
|
|
vieter_tree_node *root,
|
|
|
|
uint64_t key);
|
2023-01-29 17:32:27 +01:00
|
|
|
|
2023-02-01 23:24:22 +01:00
|
|
|
/*
|
|
|
|
* Search for the data represented by the given key.
|
|
|
|
*/
|
2023-02-23 10:13:58 +01:00
|
|
|
vieter_tree_error vieter_tree_node_search(void **out, vieter_tree_node *root,
|
|
|
|
uint64_t key);
|
2023-01-19 22:23:19 +01:00
|
|
|
|
2023-02-01 23:24:22 +01:00
|
|
|
/*
|
|
|
|
* Remove the data associated with the given key.
|
|
|
|
*/
|
2023-02-23 10:13:58 +01:00
|
|
|
vieter_tree_error
|
|
|
|
vieter_tree_node_remove(void **out, vieter_tree_node **root_ptr, uint64_t key);
|
2023-01-19 22:45:22 +01:00
|
|
|
|
2023-02-01 23:24:22 +01:00
|
|
|
/*
|
|
|
|
* Set a node's bit flag to the given value.
|
|
|
|
*/
|
2023-02-23 10:13:58 +01:00
|
|
|
void vieter_tree_node_set(vieter_tree_node *node, vieter_tree_node_flag flag,
|
|
|
|
bool value);
|
2023-02-01 23:24:22 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Get whether a node's bit flag is set.
|
|
|
|
*/
|
2023-01-29 17:32:27 +01:00
|
|
|
bool vieter_tree_node_get(vieter_tree_node *node, vieter_tree_node_flag flag);
|
2023-01-20 12:08:05 +01:00
|
|
|
|
2023-02-01 23:24:22 +01:00
|
|
|
/*
|
|
|
|
* Add a new child to the parent, replacing either its left or right child,
|
|
|
|
* depending on the key values.
|
|
|
|
*/
|
2023-01-20 13:23:53 +01:00
|
|
|
void vieter_tree_node_add_child(vieter_tree_node *parent, uint64_t key,
|
|
|
|
vieter_tree_node *child);
|
2023-02-01 23:24:22 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Replace a node's children array.
|
|
|
|
*/
|
2023-02-23 10:13:58 +01:00
|
|
|
void vieter_tree_node_set_children(vieter_tree_node *parent,
|
|
|
|
vieter_tree_node **children);
|
2023-01-20 13:23:53 +01:00
|
|
|
|
2023-02-01 23:24:22 +01:00
|
|
|
/*
|
|
|
|
* Set a node's left or right child to the given node.
|
|
|
|
*/
|
2023-02-23 10:13:58 +01:00
|
|
|
void vieter_tree_node_set_child(vieter_tree_node *parent,
|
|
|
|
vieter_tree_node *child, bool right);
|
2023-01-28 19:27:40 +01:00
|
|
|
|
2023-02-02 14:10:35 +01:00
|
|
|
/*
|
|
|
|
* 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);
|
|
|
|
|
2023-01-19 21:22:08 +01:00
|
|
|
#endif
|