33#define RBTREE_INITIAL_BLOCK_SIZE 4 
   38    assert(compare_keys != NULL);
 
   48    rbtree_init(tree, compare_keys, free_key, free_value, pool);
 
 
   57    assert(compare_keys != NULL);
 
   59    memset(tree, 0, 
sizeof(
RBTree));
 
 
   86        _rbtree_destroy_node(tree, node->
left);
 
   91        _rbtree_destroy_node(tree, node->
right);
 
  117    assert(tree != NULL);
 
 
  126    assert(tree != NULL);
 
  130        _rbtree_destroy_node(tree, tree->
root);
 
 
  139    assert(tree != NULL);
 
  143        _rbtree_destroy_node(tree, tree->
root);
 
 
  154    assert(tree != NULL);
 
 
  165    assert(tree != NULL);
 
  166    assert(node != NULL);
 
  174        intptr_t sp = tree->
sp - tree->
stack;
 
  176        if(sp >= 0 && (
size_t)sp >= tree->
stack_size - 1)
 
  180                fprintf(stderr, 
"%s(): integer overflow.\n", __func__);
 
  209#define _rbnode_is_black(n) (n == NULL ? 1 : n->black) 
  213_rbnode_create_new(
Pool *pool, 
void *key, 
void *value, 
int black, 
RBNode *left, 
RBNode *right)
 
  244    assert(tree != NULL);
 
  248        if(old_node == parent->
left)
 
  250            parent->
left = new_node;
 
  254            parent->
right = new_node;
 
  259        tree->
root = new_node;
 
  266    assert(tree != NULL);
 
  267    assert(node != NULL);
 
  271    assert(right != NULL);
 
  273    _rbnode_replace(tree, node, parent, right);
 
  282    assert(tree != NULL);
 
  283    assert(node != NULL);
 
  286    _rbnode_replace(tree, node, parent, left);
 
  295static void _rbtree_insert_case1(
RBTree *tree);
 
  298_rbtree_insert_case2_to_6(
RBTree *tree)
 
  300    assert(tree != NULL);
 
  306    if(_rbnode_is_black(parent))
 
  312    RBNode *grandparent = *(tree->
sp - 2);
 
  313    RBNode *uncle = (parent == grandparent->
left) ? grandparent->
right : grandparent->left;
 
  315    if(!_rbnode_is_black(uncle))
 
  320        grandparent->
black = 0;
 
  322        _rbtree_insert_case1(tree);
 
  327        if(node == parent->
right && parent == grandparent->
left)
 
  329            _rbnode_rotate_left(tree, parent, grandparent);
 
  331            *(tree->
sp - 1) = node;
 
  336        else if(node == parent->
left && parent == grandparent->
right)
 
  338            _rbnode_rotate_right(tree, parent, grandparent);
 
  340            *(tree->
sp - 1) = node;
 
  347        RBNode *great_grandparent = NULL;
 
  349        if(tree->
sp >= tree->
stack + 3)
 
  351            great_grandparent = *(tree->
sp - 3);
 
  354        grandparent->
black = 0;
 
  357        if(node == parent->
left && parent == grandparent->
left)
 
  359            _rbnode_rotate_right(tree, grandparent, great_grandparent);
 
  363            _rbnode_rotate_left(tree, grandparent, great_grandparent);
 
  366        *(tree->
sp - 2) = *(tree->
sp - 1);
 
  367        *(tree->
sp - 1) = *(tree->
sp);
 
  373_rbtree_insert_case1(
RBTree *tree)
 
  375    assert(tree != NULL);
 
  385        _rbtree_insert_case2_to_6(tree);
 
  390_rbtree_insert_root(
RBTree *tree, 
void *key, 
void *value)
 
  392    bool inserted = 
false;
 
  394    assert(tree != NULL);
 
  401        tree->
root = _rbnode_create_new(tree->
pool, key, value, 1, NULL, NULL);
 
  409_rbtree_replace_node(
RBTree *tree, 
RBNode *node, 
void *key, 
void *value, 
bool overwrite_key)
 
  411    assert(tree != NULL);
 
  412    assert(node != NULL);
 
  434_rbtree_insert_child(
RBTree *tree, 
void *key, 
void *value, 
bool overwrite_key)
 
  438    assert(tree != NULL);
 
  439    assert(tree->
root != NULL);
 
  449        if(_rbtree_stack_push(tree, node))
 
  457                _rbtree_replace_node(tree, node, key, value, overwrite_key);
 
  460            else if(tree->
count < SIZE_MAX)
 
  462                RBNode **child = (cmp < 0) ? &node->
left : &node->right;
 
  472                    *child = _rbnode_create_new(tree->
pool, key, value, 0, NULL, NULL);
 
  474                    if(_rbtree_stack_push(tree, *child))
 
  476                        _rbtree_insert_case2_to_6(tree);
 
  488                fprintf(stderr, 
"%s(): integer overflow.\n", __func__);
 
  510    assert(tree != NULL);
 
  514    if(!_rbtree_insert_root(tree, key, value))
 
  516        result = _rbtree_insert_child(tree, key, value, overwrite_key);
 
 
  526_rbtree_find_node(
RBTree *tree, 
const void *key, 
bool build_stack)
 
  528    assert(tree != NULL);
 
  538            _rbtree_stack_push(tree, node);
 
  566    assert(tree != NULL);
 
  569    RBNode *node = _rbtree_find_node((
RBTree *)tree, key, 
false);
 
 
  584    assert(pair != NULL && pair->node != NULL);
 
  588        return pair->node->key;
 
 
  597    assert(pair != NULL && pair->node != NULL);
 
  601        return pair->node->value;
 
 
  610    assert(pair != NULL);
 
  611    assert(pair->node != NULL);
 
  613    if(pair->free_value && pair->node->value)
 
  615        pair->free_value(pair->node->value);
 
  618    pair->node->value = value;
 
 
  624    assert(tree != NULL);
 
  627    return _rbtree_find_node((
RBTree *)tree, key, 
false) ? true : 
false;
 
 
  636    assert(tree != NULL);
 
  637    assert(node != NULL);
 
  639    _rbtree_stack_push(tree, node);
 
  644        _rbtree_stack_push(tree, node);
 
  650static void _rbtree_remove_case1(
RBTree *tree);
 
  653_rbtree_remove_case3_to_6(
RBTree *tree)
 
  655    assert(tree != NULL);
 
  661    if(parent->
right == node)
 
  663        sibling = parent->
left;
 
  667        sibling = parent->
right;
 
  670    assert(sibling != NULL);
 
  672    if(_rbnode_is_black(sibling) && _rbnode_is_black(sibling->
left) && _rbnode_is_black(sibling->
right))
 
  674        if(_rbnode_is_black(parent))
 
  679            _rbtree_remove_case1(tree);
 
  694    if(node == parent->
left && _rbnode_is_black(sibling) && !_rbnode_is_black(sibling->
left) && _rbnode_is_black(sibling->
right))
 
  697        sibling->
left->black = 1;
 
  698        _rbnode_rotate_right(tree, sibling, parent);
 
  699        sibling = parent->
right;
 
  701    else if(node == parent->
right && _rbnode_is_black(sibling) && _rbnode_is_black(sibling->
left) && !_rbnode_is_black(sibling->
right))
 
  704        sibling->
right->black = 1;
 
  705        _rbnode_rotate_left(tree, sibling, parent);
 
  706        sibling = parent->
left;
 
  713    RBNode *grandparent = NULL;
 
  715    if(tree->
sp >= tree->
stack + 2)
 
  717        grandparent = *(tree->
sp - 2);
 
  720    if(node == parent->
left)
 
  722        assert(!_rbnode_is_black(sibling->
right));
 
  723        sibling->
right->black = 1;
 
  724        _rbnode_rotate_left(tree, parent, grandparent);
 
  728        assert(!_rbnode_is_black(sibling->
left));
 
  729        sibling->
left->black = 1;
 
  730        _rbnode_rotate_right(tree, parent, grandparent);
 
  735_rbtree_remove_case2(
RBTree *tree)
 
  737    assert(tree != NULL);
 
  743    if(parent->
right == node)
 
  745        sibling = parent->
left;
 
  749        sibling = parent->
right;
 
  752    if(!_rbnode_is_black(sibling))
 
  757        RBNode *grandparent = NULL;
 
  759        if(tree->
sp >= tree->
stack + 2)
 
  761            grandparent = *(tree->
sp - 2);
 
  764        if(parent->
left == node)
 
  766            _rbnode_rotate_left(tree, parent, grandparent);
 
  770            _rbnode_rotate_right(tree, parent, grandparent);
 
  773        _rbtree_stack_push(tree, node);
 
  774        *(tree->
sp - 1) = parent;
 
  775        *(tree->
sp - 2) = sibling;
 
  778    _rbtree_remove_case3_to_6(tree);
 
  782_rbtree_remove_case1(
RBTree *tree)
 
  784    assert(tree != NULL);
 
  788        _rbtree_remove_case2(tree);
 
  795    assert(tree != NULL);
 
  800    RBNode *node =_rbtree_find_node(tree, key, 
true);
 
  821        RBNode *max = _rbtree_find_max_node(tree, node->
left);
 
  834        parent = *(tree->
sp - 1);
 
  837    if(_rbnode_is_black(node))
 
  839        if(!_rbnode_is_black(child))
 
  844        _rbtree_remove_case1(tree);
 
  847    _rbnode_replace(tree, node, parent, child);
 
 
  872    assert(tree != NULL);
 
  873    assert(iter != NULL);
 
 
  899    assert(iter != NULL);
 
 
  907    assert(tree != NULL);
 
  908    assert(iter != NULL);
 
 
  938    assert(iter != NULL);
 
 
 1004    assert(iter != NULL);
 
 
 1017    assert(iter != NULL);
 
 
int32_t(* CompareFunc)(const void *a, const void *b)
void(* FreeFunc)(void *p)
void * rbtree_iter_get_value(const RBTreeIter *iter)
bool rbtree_remove(RBTree *tree, const void *key)
bool rbtree_key_exists(const RBTree *tree, const void *key)
void * rbtree_pair_get_key(const RBTreePair *pair)
void rbtree_pair_set_value(RBTreePair *pair, void *value)
void rbtree_init(RBTree *tree, CompareFunc compare_keys, FreeFunc free_key, FreeFunc free_value, Pool *pool)
RBTreeInsertResult rbtree_set(RBTree *tree, void *key, void *value, bool overwrite_key)
RBTreePair * rbtree_lookup(RBTree *tree, const void *key)
void rbtree_iter_init(const RBTree *tree, RBTreeIter *iter)
void rbtree_clear(RBTree *tree)
void rbtree_destroy(RBTree *tree)
size_t rbtree_count(const RBTree *tree)
void rbtree_iter_reuse(const RBTree *tree, RBTreeIter *iter)
RBTree * rbtree_new(CompareFunc compare_keys, FreeFunc free_key, FreeFunc free_value, Pool *pool)
#define RBTREE_INITIAL_BLOCK_SIZE
void * rbtree_iter_get_key(const RBTreeIter *iter)
bool rbtree_iter_next(RBTreeIter *iter)
void * rbtree_pair_get_value(const RBTreePair *pair)
void rbtree_iter_free(RBTreeIter *iter)
void rbtree_free(RBTree *tree)
RBTreeIterStackItem * stack
struct RBTree::_RBTreePair pair
Last found key-value pair.
RBTreeInsertResult
result of rbtree_set() method.
@ RBTREE_INSERT_RESULT_NEW
@ RBTREE_INSERT_RESULT_REPLACED
@ RBTREE_INSERT_RESULT_FAILED
struct _RBTreePair RBTreePair
Structure holding node data.
Structure to iterate over the elements of a RBTree.
Structure holding a node and the iteration state.
Allocate groups of equal-sized chunks of memory.
void(* free)(struct _Pool *pool, void *ptr)
void *(* alloc)(struct _Pool *pool)