diff options
author | David Robillard <d@drobilla.net> | 2021-09-10 20:11:40 -0400 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2021-09-10 20:54:28 -0400 |
commit | 06443ecb437eebcf3373b1034ca5ff84ebe212df (patch) | |
tree | 89c4c0d72eac6b10d88bf1042584d84cf9fc607f /src/tree.c | |
parent | 6d4cb50fa2f2cdd092e9459a6da59eb3cdda7434 (diff) | |
download | zix-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.c | 25 |
1 files changed, 14 insertions, 11 deletions
@@ -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); |