13#ifndef __xwos_lib_rbtree_h__
14#define __xwos_lib_rbtree_h__
126#define xwlib_rbtree_get_link(lpc) \
127 ((struct xwlib_rbtree_node **)(((xwptr_t)(lpc)) & (~((xwptr_t)3UL))))
134#define xwlib_rbtree_get_lnpos(lpc) ((xwptr_t)(lpc) & (~((xwptr_t)2UL)))
141#define xwlib_rbtree_get_pos(lpc) ((xwptr_t)(((xwptr_t)(lpc)) & (xwptr_t)1UL))
150#define xwlib_rbtree_tst_right(lpc) (!!xwlib_rbtree_get_pos(lpc))
159#define xwlib_rbtree_tst_left(lpc) (!xwlib_rbtree_tst_right(lpc))
167#define xwlib_rbtree_gen_lc(n, color) \
168 ((xwptr_t)(&((n)->left)) | (xwptr_t)(color))
176#define xwlib_rbtree_gen_rc(n, color) \
177 ((xwptr_t)(&((n)->right)) | (xwptr_t)(color) | (xwptr_t)XWLIB_RBTREE_POS_RIGHT)
184#define xwlib_rbtree_gen_lr(n) xwlib_rbtree_gen_lc((n), XWLIB_RBTREE_COLOR_RED)
191#define xwlib_rbtree_gen_lb(n) xwlib_rbtree_gen_lc((n), XWLIB_RBTREE_COLOR_BLACK)
198#define xwlib_rbtree_gen_rr(n) xwlib_rbtree_gen_rc((n), XWLIB_RBTREE_COLOR_RED)
205#define xwlib_rbtree_gen_rb(n) xwlib_rbtree_gen_rc((n), XWLIB_RBTREE_COLOR_BLACK)
212#define xwlib_rbtree_get_color(lpc) (((xwptr_t)(lpc)) & (xwptr_t)2UL)
220#define xwlib_rbtree_tst_black(lpc) (!!xwlib_rbtree_get_color(lpc))
228#define xwlib_rbtree_tst_red(lpc) (!xwlib_rbtree_get_color(lpc))
236#define xwlib_rbtree_entry(ptr, type, member) xwcc_derof((ptr), type, member)
static void xwlib_rbtree_link_nil(struct xwlib_rbtree_node **link)
链接空(叶子)节点
static bool xwlib_rbtree_tst_link_root(struct xwlib_rbtree *rbt, struct xwlib_rbtree_node **link)
测试是否连接到根节点(是否为根节点的子节点)
xwlib_rbtree_pos_em
红黑树节点位置枚举
static struct xwlib_rbtree_node * xwlib_rbtree_get_successor(struct xwlib_rbtree_node *node)
返回节点的后继节点
static bool xwlib_rbtree_tst_node_unlinked(struct xwlib_rbtree_node *n)
测试红黑树节点是否已经链接到红黑树中
static struct xwlib_rbtree_node * xwlib_rbtree_get_predecessor(struct xwlib_rbtree_node *node)
返回节点的前趋节点
static void xwlib_rbtree_flip_color(struct xwlib_rbtree_node *node)
反转节点的颜色
static void xwlib_rbtree_transplant_nil(struct xwlib_rbtree_node *oldn)
用叶子(NIL)替换一个旧节点
xwlib_rbtree_color_em
红黑树节点颜色枚举
static void xwlib_rbtree_init_node(struct xwlib_rbtree_node *rbn)
初始化红黑树节点
#define xwlib_rbtree_get_link(lpc)
获取lpc信息中的link指针
static bool xwlib_rbtree_tst_empty(struct xwlib_rbtree *t)
测试一棵红黑树是否为空树
static void xwlib_rbtree_set_black(struct xwlib_rbtree_node *node)
将节点设置为黑色
static void xwlib_rbtree_set_red(struct xwlib_rbtree_node *node)
将节点设置为红色
static void xwlib_rbtree_transplant(struct xwlib_rbtree_node *newn, struct xwlib_rbtree_node *oldn)
用新节点代替旧节点并继承它的链指针、颜色和位置信息, 但新节点并不接管旧节点的子节点
#define xwlib_rbtree_get_pos(lpc)
获取lpc信息中的位置信息
static struct xwlib_rbtree_node * xwlib_rbtree_get_parent(struct xwlib_rbtree_node *node)
返回节点的父节点指针
void xwlib_rbtree_insert_color(struct xwlib_rbtree *tree, struct xwlib_rbtree_node *node)
插入一个红色节点后修正红黑树的颜色
static void xwlib_rbtree_init(struct xwlib_rbtree *rbt)
初始化红黑树
static struct xwlib_rbtree_node * xwlib_rbtree_get_parent_from_lpc(xwptr_t lpc)
从lpc信息返回父节点指针
void xwlib_rbtree_remove(struct xwlib_rbtree *tree, struct xwlib_rbtree_node *node)
删除一个节点,并修正红黑树的颜色
static bool xwlib_rbtree_tst_root(struct xwlib_rbtree *rbt, struct xwlib_rbtree_node *node)
测试当前节点是否为根节点
static void xwlib_rbtree_link(struct xwlib_rbtree_node *node, xwptr_t lpc)
链接节点,并设置位置及颜色信息
void xwlib_rbtree_replace(struct xwlib_rbtree_node *newn, struct xwlib_rbtree_node *oldn)
用一个新节点代替旧节点,继承它的颜色、位置信息并接管它的子树
@ XWLIB_RBTREE_COLOR_BLACK
struct xwlib_rbtree_node * left
struct xwlib_rbtree_node ** link
struct xwlib_rbtree_node * right
union xwlib_rbtree_node::@5 lpc
struct xwlib_rbtree_node * root