Branch data Line data Source code
1 : : /*
2 : : * RBtree implementation adopted from the Linux kernel sources.
3 : : */
4 : :
5 : : #ifndef __CR_RBTREE_H__
6 : : #define __CR_RBTREE_H__
7 : :
8 : : #include <stddef.h>
9 : :
10 : : #include "compiler.h"
11 : : #include "types.h"
12 : :
13 : : #define RB_RED 0
14 : : #define RB_BLACK 1
15 : : #define RB_MASK 3
16 : :
17 : : struct rb_node {
18 : : unsigned long rb_parent_color; /* Keeps both parent anc color */
19 : : struct rb_node *rb_right;
20 : : struct rb_node *rb_left;
21 : : } __aligned(sizeof(long));
22 : :
23 : : struct rb_root {
24 : : struct rb_node *rb_node;
25 : : };
26 : :
27 : : #define rb_parent(r) ((struct rb_node *)((r)->rb_parent_color & ~RB_MASK))
28 : : #define rb_color(r) ((r)->rb_parent_color & RB_BLACK)
29 : : #define rb_is_red(r) (!rb_color(r))
30 : : #define rb_is_black(r) (rb_color(r))
31 : : #define rb_set_red(r) do { (r)->rb_parent_color &= ~RB_BLACK; } while (0)
32 : : #define rb_set_black(r) do { (r)->rb_parent_color |= RB_BLACK; } while (0)
33 : :
34 : : static inline void rb_set_parent(struct rb_node *rb, struct rb_node *p)
35 : : {
36 : 4480 : rb->rb_parent_color = (rb->rb_parent_color & RB_MASK) | (unsigned long)p;
37 : : }
38 : :
39 : : static inline void rb_set_color(struct rb_node *rb, int color)
40 : : {
41 : 0 : rb->rb_parent_color = (rb->rb_parent_color & ~RB_BLACK) | color;
42 : : }
43 : :
44 : : #define RB_ROOT (struct rb_root){ NULL, }
45 : : #define rb_entry(ptr, type, member) container_of(ptr, type, member)
46 : :
47 : : #define RB_EMPTY_ROOT(root) ((root)->rb_node == NULL)
48 : : #define RB_EMPTY_NODE(node) (rb_parent(node) == node)
49 : : #define RB_CLEAR_NODE(node) (rb_set_parent(node, node))
50 : :
51 : : static inline void rb_init_node(struct rb_node *node)
52 : : {
53 : 4432 : *node = (struct rb_node){ };
54 : :
55 : 4432 : RB_CLEAR_NODE(node);
56 : : }
57 : :
58 : : extern void rb_insert_color(struct rb_node *node, struct rb_root *root);
59 : : extern void rb_erase(struct rb_node *node, struct rb_root *root);
60 : :
61 : : /* Find logical next and previous nodes in a tree */
62 : : extern struct rb_node *rb_first(const struct rb_root *root);
63 : : extern struct rb_node *rb_last(const struct rb_root *root);
64 : : extern struct rb_node *rb_next(const struct rb_node *node);
65 : : extern struct rb_node *rb_prev(const struct rb_node *node);
66 : :
67 : : /* Fast replacement of a single node without remove/rebalance/add/rebalance */
68 : : extern void rb_replace_node(struct rb_node *victim, struct rb_node *new,
69 : : struct rb_root *root);
70 : :
71 : : static inline void rb_link_node(struct rb_node *node, struct rb_node *parent,
72 : : struct rb_node **rb_link)
73 : : {
74 : 4432 : node->rb_parent_color = (unsigned long)parent;
75 : 4432 : node->rb_left = node->rb_right = NULL;
76 : :
77 : 4432 : *rb_link = node;
78 : : }
79 : :
80 : : static inline void rb_link_and_balance(struct rb_root *root,
81 : : struct rb_node *node,
82 : : struct rb_node *parent,
83 : : struct rb_node **rb_link)
84 : : {
85 : : rb_link_node(node, parent, rb_link);
86 : 4432 : rb_insert_color(node, root);
87 : : }
88 : :
89 : : #endif /* __CR_RBTREE_H__ */
|