50#define PARENT(node) ((rb_node*)((node)->color & ~RB_BLACK))
51#define COLOR(node) ((node)->color & RB_BLACK)
53#define SET_RED(node) (node)->color &= (~(intptr_t)RB_BLACK)
54#define SET_BLACK(node) (node)->color |= ((intptr_t)RB_BLACK)
55#define SET_PARENT(node,p) (node)->color = COLOR(node) | (intptr_t)(p)
108static rb_node* node_new(
void* key);
136 dct->
_vtable = &rb_tree_vtable;
159 if (delete_func) delete_func(node->
key, node->
datum);
185 parent = node; node = node->
llink;
186 }
else if (cmp > 0) {
187 parent = node; node = node->
rlink;
192 if (!(node = node_new(key)))
196 if (parent == NULL) {
203 parent->
llink = node;
205 parent->
rlink = node;
216 unsigned rotations = 0;
227 if (node ==
PARENT(node)->rlink) {
229 rot_left(
tree, node);
236 rot_right(
tree, temp);
248 if (node ==
PARENT(node)->llink) {
250 rot_right(
tree, node);
257 rot_left(
tree, temp);
284 bool left = xp && xp->
llink == out;
300 remove_node(
tree, node);
307 unsigned rotations = 0;
314 rot_left(
tree, parent); ++rotations;
322 left = parent && parent->
llink == node;
327 rot_right(
tree, w); ++rotations;
337 rot_left(
tree, parent); ++rotations;
345 rot_right(
tree, parent); ++rotations;
353 left = parent && parent->
llink == node;
358 rot_left(
tree, w); ++rotations;
368 rot_right(
tree, parent); ++rotations;
392 for (; node != NULL; node = node_next(node)) {
394 if (!visit(node->
key, node->
datum, user_data))
break;
414 node = node_prev(node);
418 node = node_next(node);
423 *datum = node->
datum;
458 ASSERT((((intptr_t)node) & 1) == 0);
476 while (temp && temp->
rlink == node) {
494 while (temp && temp->
llink == node) {
506 unsigned black_node_count,
unsigned leaf_black_node_count)
508 if (parent == NULL) {
517 if (parent->
llink == node) {
535 VERIFY(black_node_count == leaf_black_node_count);
537 bool l = node_verify(
tree, node, node->
llink, black_node_count, leaf_black_node_count);
538 bool r = node_verify(
tree, node, node->
rlink, black_node_count, leaf_black_node_count);
549 unsigned leaf_black_node_count = 0;
554 leaf_black_node_count++;
558 return node_verify(
tree, NULL,
tree->
root, 0, leaf_black_node_count);
581 itor->
_vtable = &rb_tree_itor_vtable;
595 return itor->
node != NULL;
603 return itor->
node != NULL;
613 return itor->
node != NULL;
623 return itor->
node != NULL;
dict_remove_result(* dict_remove_func)(void *obj, const void *key)
int(* dict_compare_func)(const void *, const void *)
bool(* dict_select_func)(void *obj, size_t n, const void **key, void **datum)
void(* dict_invalidate_func)(void *itor)
size_t(* dict_traverse_func)(void *obj, dict_visit_func visit, void *user_data)
dict_insert_result(* dict_insert_func)(void *obj, void *key)
void(* dict_delete_func)(void *, void *)
int(* dict_icompare_func)(void *itor1, void *itor2)
bool(* dict_nextn_func)(void *itor, size_t count)
bool(* dict_valid_func)(const void *itor)
size_t(* dict_count_func)(const void *obj)
bool(* dict_first_func)(void *itor)
bool(* dict_next_func)(void *itor)
void *(* dict_key_func)(void *itor)
size_t(* dict_dfree_func)(void *obj, dict_delete_func delete_func)
void **(* dict_datum_func)(void *itor)
bool(* dict_prevn_func)(void *itor, size_t count)
void **(* dict_search_func)(void *obj, const void *key)
bool(* dict_isearch_func)(void *itor, const void *key)
bool(* dict_iremove_func)(void *itor)
bool(* dict_prev_func)(void *itor)
dict_itor *(* dict_inew_func)(void *obj)
bool(* dict_last_func)(void *itor)
bool(* dict_verify_func)(const void *obj)
bool(* dict_visit_func)(const void *, void *, void *)
size_t(* dict_clear_func)(void *obj, dict_delete_func delete_func)
void(* dict_ifree_func)(void *itor)
void ** rb_tree_search_lt(rb_tree *tree, const void *key)
size_t rb_tree_min_path_length(const rb_tree *tree)
bool rb_itor_search_lt(rb_itor *itor, const void *key)
bool rb_itor_search_ge(rb_itor *itor, const void *key)
const void * rb_itor_key(const rb_itor *itor)
rb_tree * rb_tree_new(dict_compare_func cmp_func)
bool rb_itor_next(rb_itor *itor)
bool rb_itor_valid(const rb_itor *itor)
void ** rb_tree_search_ge(rb_tree *tree, const void *key)
dict_itor * rb_dict_itor_new(rb_tree *tree)
size_t rb_tree_traverse(rb_tree *tree, dict_visit_func visit, void *user_data)
size_t rb_tree_total_path_length(const rb_tree *tree)
void ** rb_tree_search(rb_tree *tree, const void *key)
bool rb_itor_search_le(rb_itor *itor, const void *key)
void rb_itor_invalidate(rb_itor *itor)
size_t rb_tree_clear(rb_tree *tree, dict_delete_func delete_func)
size_t rb_tree_max_path_length(const rb_tree *tree)
rb_itor * rb_itor_new(rb_tree *tree)
bool rb_itor_remove(rb_itor *it)
bool rb_itor_prevn(rb_itor *itor, size_t count)
bool rb_itor_search(rb_itor *itor, const void *key)
bool rb_itor_prev(rb_itor *itor)
#define SET_PARENT(node, p)
void ** rb_itor_datum(rb_itor *itor)
bool rb_itor_first(rb_itor *itor)
size_t rb_tree_free(rb_tree *tree, dict_delete_func delete_func)
bool rb_itor_nextn(rb_itor *itor, size_t count)
void rb_itor_free(rb_itor *itor)
bool rb_itor_last(rb_itor *itor)
dict_insert_result rb_tree_insert(rb_tree *tree, void *key)
bool rb_tree_verify(const rb_tree *tree)
void ** rb_tree_search_le(rb_tree *tree, const void *key)
size_t rb_tree_count(const rb_tree *tree)
dict * rb_dict_new(dict_compare_func cmp_func)
dict_remove_result rb_tree_remove(rb_tree *tree, const void *key)
bool rb_tree_select(rb_tree *tree, size_t n, const void **key, void **datum)
bool rb_itor_search_gt(rb_itor *itor, const void *key)
void ** rb_tree_search_gt(rb_tree *tree, const void *key)
int rb_itor_compare(const rb_itor *i1, const rb_itor *i2)
const itor_vtable * _vtable
const dict_vtable * _vtable
dict_compare_func cmp_func
bool tree_iterator_last(void *Iterator)
void ** tree_iterator_datum(void *Iterator)
void * tree_node_max(void *Node)
void tree_iterator_invalidate(void *Iterator)
void ** tree_search_gt(void *Tree, const void *key)
int tree_iterator_compare(const void *Iterator1, const void *Iterator2)
void * tree_search_node(void *Tree, const void *key)
bool tree_iterator_search_le(void *Iterator, const void *key)
bool tree_iterator_valid(const void *Iterator)
size_t tree_count(const void *Tree)
void ** tree_search_lt(void *Tree, const void *key)
const void * tree_iterator_key(const void *Iterator)
size_t tree_min_path_length(const void *Tree)
void * tree_node_min(void *Node)
void ** tree_search(void *Tree, const void *key)
size_t tree_total_path_length(const void *Tree)
bool tree_iterator_first(void *Iterator)
void tree_iterator_free(void *Iterator)
bool tree_iterator_search_lt(void *Iterator, const void *key)
bool tree_iterator_search_ge(void *Iterator, const void *key)
size_t tree_max_path_length(const void *Tree)
bool tree_iterator_search_gt(void *Iterator, const void *key)
void ** tree_search_ge(void *Tree, const void *key)
void ** tree_search_le(void *Tree, const void *key)
bool tree_iterator_search(void *Iterator, const void *key)
#define TREE_ITERATOR_FIELDS(tree_type, node_type)
#define TREE_FIELDS(node_type)