diff --git a/docs/rbtree.txt b/docs/rbtree.txt index ba7ce1f..34c7071 100644 --- a/docs/rbtree.txt +++ b/docs/rbtree.txt @@ -68,14 +68,14 @@ Functions Creates and inserts a new node in the tree. + If provided, calls `rbtree->update_fn` and `rbtree->delete_fn` if a node should be updated. + - Returns a nonzero value if a new node was inserted, zero if 'key' already existed and that node was updated. + Returns nonzero if a new node was inserted or updated, zero otherwise. NOTE: The memory pointed to by the 'key' pointer is *not* copied so you must ensure that it has a infinite lifetime. `rbtree_delete()`:: Deletes a node from the tree. if provided, calls `rbtree->delete_fn` for the node. + - Returns non zero if a node was removed. zero otherwise. + Returns nonzero if a node was removed, zero otherwise. `rbtree_free()`:: diff --git a/src/rbtree.c b/src/rbtree.c index 18dcadd..404526c 100644 --- a/src/rbtree.c +++ b/src/rbtree.c @@ -133,14 +133,13 @@ int rbtree_insert(rbtree *tree, const void *key) { /* iterator and parent */ rbnode *p, *q; - unsigned char dir = 0, dir2, last, inserted = 0; + unsigned char dir = 0, dir2, last; if (!tree || !tree->cmp_fn) return 0; if (tree->root == NULL) { tree->root = node_alloc(key); - inserted = 1; goto done; } @@ -155,7 +154,6 @@ int rbtree_insert(rbtree *tree, const void *key) { if (q == NULL) { p->child[dir] = q = node_alloc(key); - inserted = 1; } else if (is_red(q->child[0]) && is_red(q->child[1])) { /* color flip case */ q->color = RB_RED; @@ -186,7 +184,7 @@ int rbtree_insert(rbtree *tree, const void *key) { q = q->child[dir]; } - if (!inserted) { + if (q->key != key) { if (tree->delete_fn) tree->delete_fn((void*)q->key); q->key = key; @@ -198,7 +196,7 @@ done: /* root should be black */ tree->root->color = RB_BLACK; - return inserted; + return 1; } int rbtree_delete(rbtree *tree, const void *key) { @@ -212,7 +210,7 @@ int rbtree_delete(rbtree *tree, const void *key) { rbnode *f = NULL; unsigned char dir = 1, dir2, last; - + if (rbtree_is_empty(tree) || !tree->cmp_fn) return 0;