Skip to content

Red-Black Interval Tree

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 \
    }