include/structures/rbit.h View source View on GitHub
struct interval {
size_t low;
size_t high;
};
struct rbit_node {
struct interval interval;
enum rbit_color color;
size_t max;
struct rbit_node *left;
struct rbit_node *right;
struct rbit_node *parent;
};
struct rbit {
struct rbit_node *root;
rbit_augment_fn augment;
};
enum rbit_color {
RBIT_RED,
RBIT_BLACK,
};
typedef bool (*rbit_augment_fn)(struct rbit_node * node);
size_t rbit_node_max(const struct rbit_node *n);
void rbit_init_node(struct rbit_node *n);
struct rbit_node rbit_first(const struct rbit *tree);
struct rbit_node rbit_last(const struct rbit *tree);
struct rbit_node rbit_prev(struct rbit_node *node);
bool rbit_empty(const struct rbit *tree);
struct rbit * rbit_init(struct rbit *rbit);
struct rbit * rbit_tree_create(void);
struct rbit_node * rbit_find_min(struct rbit_node *node);
struct rbit_node * rbit_find_max(struct rbit_node *node);
struct rbit_node * rbit_min(struct rbit *tree);
struct rbit_node * rbit_max(struct rbit *tree);
struct rbit_node * rbit_next(struct rbit_node *node);
struct rbit_node * rbit_find_predecessor(struct rbit *tree, size_t low);
struct rbit_node * rbit_find_successor(struct rbit *tree, size_t low);
bool rbit_has_node(struct rbit *tree, struct rbit_node *node);
void rbit_delete(struct rbit *tree, struct rbit_node *z);
struct rbit_node * rbit_search(struct rbit_node *root, struct interval iv);
struct rbit_node * rbit_overlap_search(struct rbit_node *root, struct interval iv);
void rbit_remove(struct rbit *tree, struct interval iv);
void rbit_insert(struct rbit *tree, struct rbit_node *new_node);
#define rbit_for_each_safe(pos, tmp, tree) \
for (pos = rbit_first(tree), tmp = rbit_next(pos); pos != NULL; \
pos = tmp, tmp = rbit_next(pos))
#define rbit_for_each_entry_safe(pos, tmp, tree, member) \
for (pos = rbit_entry(rbit_first(tree), typeof(*pos), member), \
tmp = rbit_entry(rbit_next(&pos->member), typeof(*pos), member); \
pos != NULL; pos = tmp, \
tmp = rbit_entry(rbit_next(&tmp->member), typeof(*tmp), member))
#define rbit_for_each_safe_reverse(pos, tmp, tree) \
for (pos = rbit_last(tree), tmp = rbit_prev(pos); pos != NULL; \
pos = tmp, tmp = rbit_prev(pos))
#define rbit_for_each_entry_safe_reverse(pos, tmp, tree, member) \
for (pos = rbit_entry(rbit_last(tree), typeof(*pos), member), \
tmp = rbit_entry(rbit_prev(&pos->member), typeof(*pos), member); \
pos != NULL; pos = tmp, \
tmp = rbit_entry(rbit_prev(&tmp->member), typeof(*tmp), member))
#define rbit_for_each(pos, tree) \
for (pos = rbit_first(tree); pos != NULL; pos = rbit_next(pos))
#define rbit_for_each_entry(pos, tree, member) \
for (pos = rbit_entry(rbit_first(tree), typeof(*pos), member); \
pos != NULL; \
pos = rbit_entry(rbit_next(&pos->member), typeof(*pos), member))
#define rbit_for_each_reverse(pos, tree) \
for (pos = rbit_last(tree); pos != NULL; pos = rbit_prev(pos))
#define rbit_for_each_entry_reverse(pos, tree, member) \
for (pos = rbit_entry(rbit_last(tree), typeof(*pos), member); pos != NULL; \
pos = rbit_entry(rbit_prev(&pos->member), typeof(*pos), member))
#define rbit_entry(ptr, type, member) container_of(ptr, type, member)
#define rbit_parent(n) ((n)->parent)
#define RBIT_NODE_INIT \
(struct rbit_node) { \
.interval = {0, 0}, .color = RBIT_BLACK, .max = 0, .left = NULL, \
.right = NULL, .parent = NULL \
}