diff --git a/docs/technical/rbtree.txt b/docs/technical/rbtree.txt index bf3ef58..5316efd 100644 --- a/docs/technical/rbtree.txt +++ b/docs/technical/rbtree.txt @@ -52,8 +52,8 @@ NOTE: The memory pointed to by the 'key' pointer is *not* copied so you must ens `rbtree_delete()`:: - Deletes a node from the tree. if provided, calls `rbtree->delete_fn` for the node. + - Returns nonzero if a node was removed, zero otherwise. + Deletes a node from the tree. + + Returns the node's key if a node was removed, `NULL` otherwise. `rbtree_free()`:: diff --git a/src/rbtree.c b/src/rbtree.c index 2069245..4634662 100644 --- a/src/rbtree.c +++ b/src/rbtree.c @@ -278,7 +278,7 @@ done: return 1; } -int rbtree_delete(rbtree *tree, const void *key) { +void* rbtree_delete(rbtree *tree, const void *key) { rbnode head = {0}; @@ -286,7 +286,7 @@ int rbtree_delete(rbtree *tree, const void *key) { rbnode *q, *p, *g, *s; /* found item */ - rbnode *f = NULL; + rbnode *f = NULL, *ret = NULL; int dir = 1, dir2, last; @@ -342,9 +342,7 @@ int rbtree_delete(rbtree *tree, const void *key) { /* remove if found */ if (f) { - if (tree->delete_fn) - tree->delete_fn((void*)f->key); - + ret = (void*)f->key; if (f != q) f->key = q->key; swap(p, 1, q) = swap(q, 0, NULL); @@ -359,5 +357,5 @@ int rbtree_delete(rbtree *tree, const void *key) { rb_assert(tree); #endif - return f != NULL; + return ret; } diff --git a/src/rbtree.h b/src/rbtree.h index f592d00..9815ef5 100644 --- a/src/rbtree.h +++ b/src/rbtree.h @@ -33,6 +33,6 @@ void rbtree_free(rbtree *tree); 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 */