123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- ITSTART, ITLAST, ITSTATIC, ITPREFIX) \
- \
- \
- \
- static inline ITTYPE ITPREFIX
- { \
- ITTYPE max = ITLAST(node), subtree_last; \
- if (node->ITRB.rb_left) { \
- subtree_last = rb_entry(node->ITRB.rb_left, \
- ITSTRUCT, ITRB)->ITSUBTREE; \
- if (max < subtree_last) \
- max = subtree_last; \
- } \
- if (node->ITRB.rb_right) { \
- subtree_last = rb_entry(node->ITRB.rb_right, \
- ITSTRUCT, ITRB)->ITSUBTREE; \
- if (max < subtree_last) \
- max = subtree_last; \
- } \
- return max; \
- } \
- \
- RB_DECLARE_CALLBACKS(static, ITPREFIX
- ITTYPE, ITSUBTREE, ITPREFIX
- \
- \
- \
- ITSTATIC void ITPREFIX
- { \
- struct rb_node **link = &root->rb_node, *rb_parent = NULL; \
- ITTYPE start = ITSTART(node), last = ITLAST(node); \
- ITSTRUCT *parent; \
- \
- while (*link) { \
- rb_parent = *link; \
- parent = rb_entry(rb_parent, ITSTRUCT, ITRB); \
- if (parent->ITSUBTREE < last) \
- parent->ITSUBTREE = last; \
- if (start < ITSTART(parent)) \
- link = &parent->ITRB.rb_left; \
- else \
- link = &parent->ITRB.rb_right; \
- } \
- \
- node->ITSUBTREE = last; \
- rb_link_node(&node->ITRB, rb_parent, link); \
- rb_insert_augmented(&node->ITRB, root, &ITPREFIX
- } \
- \
- ITSTATIC void ITPREFIX
- { \
- rb_erase_augmented(&node->ITRB, root, &ITPREFIX
- } \
- \
- \
- \
- static ITSTRUCT * \
- ITPREFIX
- { \
- while (true) { \
-
- \
- if (node->ITRB.rb_left) { \
- ITSTRUCT *left = rb_entry(node->ITRB.rb_left, \
- ITSTRUCT, ITRB); \
- if (start <= left->ITSUBTREE) { \
-
- \
- node = left; \
- continue; \
- } \
- } \
- if (ITSTART(node) <= last) { \
- if (start <= ITLAST(node)) \
- return node; \
- if (node->ITRB.rb_right) { \
- node = rb_entry(node->ITRB.rb_right, \
- ITSTRUCT, ITRB); \
- if (start <= node->ITSUBTREE) \
- continue; \
- } \
- } \
- return NULL; \
- } \
- } \
- \
- ITSTATIC ITSTRUCT * \
- ITPREFIX
- { \
- ITSTRUCT *node; \
- \
- if (!root->rb_node) \
- return NULL; \
- node = rb_entry(root->rb_node, ITSTRUCT, ITRB); \
- if (node->ITSUBTREE < start) \
- return NULL; \
- return ITPREFIX
- } \
- \
- ITSTATIC ITSTRUCT * \
- ITPREFIX
- { \
- struct rb_node *rb = node->ITRB.rb_right, *prev; \
- \
- while (true) { \
-
- \
- if (rb) { \
- ITSTRUCT *right = rb_entry(rb, ITSTRUCT, ITRB); \
- if (start <= right->ITSUBTREE) \
- return ITPREFIX
- start, last); \
- } \
- \
- \
- do { \
- rb = rb_parent(&node->ITRB); \
- if (!rb) \
- return NULL; \
- prev = &node->ITRB; \
- node = rb_entry(rb, ITSTRUCT, ITRB); \
- rb = node->ITRB.rb_right; \
- } while (prev == rb); \
- \
- \
- if (last < ITSTART(node)) \
- return NULL; \
- else if (start <= ITLAST(node)) \
- return node; \
- } \
- }
|