rbtree.c: return key instead of using callback.
This commit is contained in:
parent
9e185ea920
commit
442e912835
3 changed files with 7 additions and 9 deletions
|
|
@ -52,8 +52,8 @@ NOTE: The memory pointed to by the 'key' pointer is *not* copied so you must ens
|
||||||
|
|
||||||
`rbtree_delete()`::
|
`rbtree_delete()`::
|
||||||
|
|
||||||
Deletes a node from the tree. if provided, calls `rbtree->delete_fn` for the node. +
|
Deletes a node from the tree. +
|
||||||
Returns nonzero if a node was removed, zero otherwise.
|
Returns the node's key if a node was removed, `NULL` otherwise.
|
||||||
|
|
||||||
`rbtree_free()`::
|
`rbtree_free()`::
|
||||||
|
|
||||||
|
|
|
||||||
10
src/rbtree.c
10
src/rbtree.c
|
|
@ -278,7 +278,7 @@ done:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rbtree_delete(rbtree *tree, const void *key) {
|
void* rbtree_delete(rbtree *tree, const void *key) {
|
||||||
|
|
||||||
rbnode head = {0};
|
rbnode head = {0};
|
||||||
|
|
||||||
|
|
@ -286,7 +286,7 @@ int rbtree_delete(rbtree *tree, const void *key) {
|
||||||
rbnode *q, *p, *g, *s;
|
rbnode *q, *p, *g, *s;
|
||||||
|
|
||||||
/* found item */
|
/* found item */
|
||||||
rbnode *f = NULL;
|
rbnode *f = NULL, *ret = NULL;
|
||||||
|
|
||||||
int dir = 1, dir2, last;
|
int dir = 1, dir2, last;
|
||||||
|
|
||||||
|
|
@ -342,9 +342,7 @@ int rbtree_delete(rbtree *tree, const void *key) {
|
||||||
|
|
||||||
/* remove if found */
|
/* remove if found */
|
||||||
if (f) {
|
if (f) {
|
||||||
if (tree->delete_fn)
|
ret = (void*)f->key;
|
||||||
tree->delete_fn((void*)f->key);
|
|
||||||
|
|
||||||
if (f != q)
|
if (f != q)
|
||||||
f->key = q->key;
|
f->key = q->key;
|
||||||
swap(p, 1, q) = swap(q, 0, NULL);
|
swap(p, 1, q) = swap(q, 0, NULL);
|
||||||
|
|
@ -359,5 +357,5 @@ int rbtree_delete(rbtree *tree, const void *key) {
|
||||||
rb_assert(tree);
|
rb_assert(tree);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return f != NULL;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,6 @@ void rbtree_free(rbtree *tree);
|
||||||
|
|
||||||
int rbtree_insert(rbtree *tree, const void *key);
|
int rbtree_insert(rbtree *tree, const void *key);
|
||||||
|
|
||||||
int rbtree_delete(rbtree *tree, const void *key);
|
void* rbtree_delete(rbtree *tree, const void *key);
|
||||||
|
|
||||||
#endif /* __RBTREE_H */
|
#endif /* __RBTREE_H */
|
||||||
|
|
|
||||||
Reference in a new issue