rbtree: move delete_fn from the structure to argument.
This commit is contained in:
parent
ae3dec912a
commit
b5f0c3117c
5 changed files with 10 additions and 14 deletions
|
|
@ -25,9 +25,6 @@ Structure that holds a tree of nodes
|
||||||
`root`::
|
`root`::
|
||||||
Pointer to the node that is the root of the tree.
|
Pointer to the node that is the root of the tree.
|
||||||
|
|
||||||
`delete_fn`::
|
|
||||||
Pointer to the function that should handle the delete routines for the `key` pointer.
|
|
||||||
|
|
||||||
`cmp_fn`::
|
`cmp_fn`::
|
||||||
Pointer to the function that is used to compare two `key` pointers. +
|
Pointer to the function that is used to compare two `key` pointers. +
|
||||||
Shall return a value greater than zero if 'ptr1' > 'ptr2', a value less than zero if 'ptr1' < 'ptr2' and zero if 'ptr1' == 'ptr2'.
|
Shall return a value greater than zero if 'ptr1' > 'ptr2', a value less than zero if 'ptr1' < 'ptr2' and zero if 'ptr1' == 'ptr2'.
|
||||||
|
|
@ -50,7 +47,7 @@ NOTE: The memory pointed to by the 'key' pointer is *not* copied so you must ens
|
||||||
|
|
||||||
`rbtree_free()`::
|
`rbtree_free()`::
|
||||||
|
|
||||||
Deletes the whole tree. if provided, calls `rbtree->delete_fn` for every node.
|
Deletes the whole tree. if provided, calls 'free_fn' for every node.
|
||||||
|
|
||||||
`rbtree_walk()`::
|
`rbtree_walk()`::
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -136,8 +136,8 @@ int inotify_unmap_path(const char *path) {
|
||||||
|
|
||||||
void inotify_unmap_all() {
|
void inotify_unmap_all() {
|
||||||
|
|
||||||
rbtree_free(&tree_path_wd);
|
rbtree_free(&tree_path_wd, xfree);
|
||||||
rbtree_free(&tree_wd_paths);
|
rbtree_free(&tree_wd_paths, wd_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
int inotify_map_get_wd(const char *path) {
|
int inotify_map_get_wd(const char *path) {
|
||||||
|
|
|
||||||
|
|
@ -185,12 +185,12 @@ void rbtree_walk(rbtree *tree, void (*action)(const void *)) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void rbtree_free(rbtree *tree) {
|
void rbtree_free(rbtree *tree, void (*free_fn)(void *)) {
|
||||||
|
|
||||||
if (!tree)
|
if (!tree)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
node_dealloc(tree->root, tree->delete_fn);
|
node_dealloc(tree->root, free_fn);
|
||||||
tree->root = NULL;
|
tree->root = NULL;
|
||||||
|
|
||||||
#ifdef __DEBUG__
|
#ifdef __DEBUG__
|
||||||
|
|
|
||||||
|
|
@ -16,11 +16,10 @@
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct _rbn *root;
|
struct _rbn *root;
|
||||||
/* user defined operations */
|
/* user defined operations */
|
||||||
void (*delete_fn)(void *);
|
|
||||||
int (*cmp_fn)(const void *, const void *);
|
int (*cmp_fn)(const void *, const void *);
|
||||||
} rbtree;
|
} rbtree;
|
||||||
|
|
||||||
#define RBTREE_INIT(delete, update, cmp) { NULL, delete, cmp}
|
#define RBTREE_INIT(delete, update, cmp) { NULL, cmp }
|
||||||
|
|
||||||
int rbtree_is_empty(rbtree *tree);
|
int rbtree_is_empty(rbtree *tree);
|
||||||
|
|
||||||
|
|
@ -28,7 +27,7 @@ void* rbtree_search(rbtree *tree, const void *key);
|
||||||
|
|
||||||
void rbtree_walk(rbtree *tree, void (*action)(const void *));
|
void rbtree_walk(rbtree *tree, void (*action)(const void *));
|
||||||
|
|
||||||
void rbtree_free(rbtree *tree);
|
void rbtree_free(rbtree *tree, void (*free_fn)(void *));
|
||||||
|
|
||||||
int rbtree_insert(rbtree *tree, const void *key);
|
int rbtree_insert(rbtree *tree, const void *key);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ static int vcmp(const void *a, const void *b);
|
||||||
static void vdelete(void *ptr);
|
static void vdelete(void *ptr);
|
||||||
|
|
||||||
/* data */
|
/* data */
|
||||||
static rbtree tree = RBTREE_INIT(vdelete, NULL, vcmp);
|
static rbtree tree = RBTREE_INIT(NULL, NULL, vcmp);
|
||||||
static int keyref[NODES];
|
static int keyref[NODES];
|
||||||
|
|
||||||
static int vcmp(const void *a, const void *b) {
|
static int vcmp(const void *a, const void *b) {
|
||||||
|
|
@ -77,7 +77,7 @@ static void teardown() {
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
rbtree_free(&tree);
|
rbtree_free(&tree, vdelete);
|
||||||
|
|
||||||
for(i=0; i < NODES; i++)
|
for(i=0; i < NODES; i++)
|
||||||
keyref[i] = -1;
|
keyref[i] = -1;
|
||||||
|
|
@ -89,7 +89,7 @@ void test_rbtree_is_empty() {
|
||||||
|
|
||||||
assert(rbtree_is_empty(&tree) == 0);
|
assert(rbtree_is_empty(&tree) == 0);
|
||||||
|
|
||||||
rbtree_free(&tree);
|
rbtree_free(&tree, vdelete);
|
||||||
|
|
||||||
assert(rbtree_is_empty(&tree));
|
assert(rbtree_is_empty(&tree));
|
||||||
|
|
||||||
|
|
|
||||||
Reference in a new issue