summaryrefslogtreecommitdiffstats
path: root/src/tree.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-09-10 20:11:40 -0400
committerDavid Robillard <d@drobilla.net>2021-09-10 20:54:28 -0400
commit06443ecb437eebcf3373b1034ca5ff84ebe212df (patch)
tree89c4c0d72eac6b10d88bf1042584d84cf9fc607f /src/tree.c
parent6d4cb50fa2f2cdd092e9459a6da59eb3cdda7434 (diff)
downloadzix-06443ecb437eebcf3373b1034ca5ff84ebe212df.tar.gz
zix-06443ecb437eebcf3373b1034ca5ff84ebe212df.tar.bz2
zix-06443ecb437eebcf3373b1034ca5ff84ebe212df.zip
Add a user handle to destroy callback
Diffstat (limited to 'src/tree.c')
-rw-r--r--src/tree.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/tree.c b/src/tree.c
index 9faf13c..f26ff90 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -27,6 +27,7 @@ typedef struct ZixTreeNodeImpl ZixTreeNode;
struct ZixTreeImpl {
ZixTreeNode* root;
ZixDestroyFunc destroy;
+ const void* destroy_user_data;
ZixComparator cmp;
void* cmp_data;
size_t size;
@@ -69,15 +70,17 @@ ZixTree*
zix_tree_new(bool allow_duplicates,
ZixComparator cmp,
void* cmp_data,
- ZixDestroyFunc destroy)
+ ZixDestroyFunc destroy,
+ const void* destroy_user_data)
{
- ZixTree* t = (ZixTree*)malloc(sizeof(ZixTree));
- t->root = NULL;
- t->destroy = destroy;
- t->cmp = cmp;
- t->cmp_data = cmp_data;
- t->size = 0;
- t->allow_duplicates = allow_duplicates;
+ ZixTree* t = (ZixTree*)malloc(sizeof(ZixTree));
+ t->root = NULL;
+ t->destroy = destroy;
+ t->destroy_user_data = destroy_user_data;
+ t->cmp = cmp;
+ t->cmp_data = cmp_data;
+ t->size = 0;
+ t->allow_duplicates = allow_duplicates;
return t;
}
@@ -88,7 +91,7 @@ zix_tree_free_rec(ZixTree* t, ZixTreeNode* n)
zix_tree_free_rec(t, n->left);
zix_tree_free_rec(t, n->right);
if (t->destroy) {
- t->destroy(n->data);
+ t->destroy(n->data, t->destroy_user_data);
}
free(n);
}
@@ -451,7 +454,7 @@ zix_tree_remove(ZixTree* t, ZixTreeIter* ti)
if ((n == t->root) && !n->left && !n->right) {
t->root = NULL;
if (t->destroy) {
- t->destroy(n->data);
+ t->destroy(n->data, t->destroy_user_data);
}
free(n);
--t->size;
@@ -583,7 +586,7 @@ zix_tree_remove(ZixTree* t, ZixTreeIter* ti)
DUMP(t);
if (t->destroy) {
- t->destroy(n->data);
+ t->destroy(n->data, t->destroy_user_data);
}
free(n);