From 99f430a8044e80894705b9a158e56258e41d7993 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 15 Mar 2007 23:56:13 +0000 Subject: [PATCH] Add an element disposal function. --- ChangeLog | 22 ++++++++++++++++++++++ NEWS | 5 +++++ lib/gl_anytree_oset.h | 8 ++++++-- lib/gl_anytreehash_list1.h | 4 ++-- lib/gl_array_oset.c | 24 ++++++++++++++++++++++-- lib/gl_avltree_oset.c | 4 +++- lib/gl_oset.c | 7 ++++--- lib/gl_oset.h | 21 +++++++++++++++------ lib/gl_rbtree_oset.c | 4 +++- tests/test-array_oset.c | 2 +- tests/test-avltree_oset.c | 4 ++-- tests/test-rbtree_oset.c | 4 ++-- 12 files changed, 87 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index b9180f29f..19af785e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2007-03-15 Bruno Haible + + * lib/gl_oset.h (gl_setelement_dispose_fn): New type. + (gl_oset_create_empty): Add dispose_fn argument. + (struct gl_oset_implementation): Add dispose_fn argument to + 'create_empty' method. + (struct gl_oset_impl_base): Add dispose_fn field. + * lib/gl_oset.c (gl_oset_create_empty): Add dispose_fn argument. + * lib/gl_array_oset.c (gl_array_create_empty): Add dispose_fn argument. + (gl_array_remove_at, gl_array_free): Call dispose_fn on the dropped + values. + * lib/gl_anytree_oset.h (gl_tree_create_empty): Add dispose_fn argument. + (gl_tree_oset_free): Call dispose_fn on the dropped values. + * lib/gl_avltree_oset.c (gl_tree_remove_node): Call dispose_fn on the + dropped value. + * lib/gl_rbtree_oset.c (gl_tree_remove_node): Call dispose_fn on the + dropped value. + * tests/test-array_oset.c (main): Update. + * tests/test-avltree_oset.c (main): Update. + * tests/test-rbtree_oset.c (main): Update. + * lib/gl_anytreehash_list1.h (add_to_bucket): Update. + 2007-03-12 Bruno Haible * lib/quotearg.c: Include early, before the definition of diff --git a/NEWS b/NEWS index 6c97a3518..e9bbe8d3d 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,11 @@ User visible incompatible changes Date Modules Changes +2007-03-15 oset The function gl_oset_create_empty now takes a + array-oset third argument. You can pass NULL. + avltree-oset + rbtree-oset + 2007-03-12 des The types and functions in lib/des.h have been gc-des renamed: diff --git a/lib/gl_anytree_oset.h b/lib/gl_anytree_oset.h index b6b50b4bc..48de0e51c 100644 --- a/lib/gl_anytree_oset.h +++ b/lib/gl_anytree_oset.h @@ -1,5 +1,5 @@ /* Ordered set data type implemented by a binary tree. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006-2007 Free Software Foundation, Inc. Written by Bruno Haible , 2006. This program is free software; you can redistribute it and/or modify @@ -30,12 +30,14 @@ typedef iterstack_item_t iterstack_t[MAXHEIGHT]; static gl_oset_t gl_tree_create_empty (gl_oset_implementation_t implementation, - gl_setelement_compar_fn compar_fn) + gl_setelement_compar_fn compar_fn, + gl_setelement_dispose_fn dispose_fn) { struct gl_oset_impl *set = XMALLOC (struct gl_oset_impl); set->base.vtable = implementation; set->base.compar_fn = compar_fn; + set->base.dispose_fn = dispose_fn; set->root = NULL; set->count = 0; @@ -216,6 +218,8 @@ gl_tree_oset_free (gl_oset_t set) if (!stack_ptr->rightp) break; /* Free the current node. */ + if (set->base.dispose_fn != NULL) + set->base.dispose_fn (node->value); free (node); } /* Descend on right branch. */ diff --git a/lib/gl_anytreehash_list1.h b/lib/gl_anytreehash_list1.h index 0ef6d566a..b7a3bd943 100644 --- a/lib/gl_anytreehash_list1.h +++ b/lib/gl_anytreehash_list1.h @@ -1,5 +1,5 @@ /* Sequential list data type implemented by a hash table with a binary tree. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006-2007 Free Software Foundation, Inc. Written by Bruno Haible , 2006. This program is free software; you can redistribute it and/or modify @@ -152,7 +152,7 @@ add_to_bucket (gl_list_t list, gl_list_node_t new_node) nodes = gl_oset_create_empty (OSET_TREE_FLAVOR, - compare_by_position); + compare_by_position, NULL); gl_oset_add (nodes, node); gl_oset_add (nodes, new_node); diff --git a/lib/gl_array_oset.c b/lib/gl_array_oset.c index f7950b7a6..df80578a2 100644 --- a/lib/gl_array_oset.c +++ b/lib/gl_array_oset.c @@ -43,12 +43,14 @@ struct gl_oset_impl static gl_oset_t gl_array_create_empty (gl_oset_implementation_t implementation, - gl_setelement_compar_fn compar_fn) + gl_setelement_compar_fn compar_fn, + gl_setelement_dispose_fn dispose_fn) { struct gl_oset_impl *set = XMALLOC (struct gl_oset_impl); set->base.vtable = implementation; set->base.compar_fn = compar_fn; + set->base.dispose_fn = dispose_fn; set->elements = NULL; set->count = 0; set->allocated = 0; @@ -204,6 +206,8 @@ gl_array_remove_at (gl_oset_t set, size_t position) size_t i; elements = set->elements; + if (set->base.dispose_fn != NULL) + set->base.dispose_fn (elements[position]); for (i = position + 1; i < count; i++) elements[i - 1] = elements[i]; set->count = count - 1; @@ -262,7 +266,23 @@ static void gl_array_free (gl_oset_t set) { if (set->elements != NULL) - free (set->elements); + { + if (set->base.dispose_fn != NULL) + { + size_t count = set->count; + + if (count > 0) + { + gl_setelement_dispose_fn dispose = set->base.dispose_fn; + const void **elements = set->elements; + + do + dispose (*elements++); + while (--count > 0); + } + } + free (set->elements); + } free (set); } diff --git a/lib/gl_avltree_oset.c b/lib/gl_avltree_oset.c index 1e38b984f..e9f1c004b 100644 --- a/lib/gl_avltree_oset.c +++ b/lib/gl_avltree_oset.c @@ -1,5 +1,5 @@ /* Ordered set data type implemented by a binary tree. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006-2007 Free Software Foundation, Inc. Written by Bruno Haible , 2006. This program is free software; you can redistribute it and/or modify @@ -519,6 +519,8 @@ gl_tree_remove_node (gl_oset_t set, gl_oset_node_t node) } set->count--; + if (set->base.dispose_fn != NULL) + set->base.dispose_fn (node->value); free (node); return true; } diff --git a/lib/gl_oset.c b/lib/gl_oset.c index 83f964e0c..3e6f094bf 100644 --- a/lib/gl_oset.c +++ b/lib/gl_oset.c @@ -1,5 +1,5 @@ /* Abstract ordered set data type. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006-2007 Free Software Foundation, Inc. Written by Bruno Haible , 2006. This program is free software; you can redistribute it and/or modify @@ -29,9 +29,10 @@ gl_oset_t gl_oset_create_empty (gl_oset_implementation_t implementation, - gl_setelement_compar_fn compar_fn) + gl_setelement_compar_fn compar_fn, + gl_setelement_dispose_fn dispose_fn) { - return implementation->create_empty (implementation, compar_fn); + return implementation->create_empty (implementation, compar_fn, dispose_fn); } size_t diff --git a/lib/gl_oset.h b/lib/gl_oset.h index fb36aac1c..5a681eefd 100644 --- a/lib/gl_oset.h +++ b/lib/gl_oset.h @@ -1,5 +1,5 @@ /* Abstract ordered set data type. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006-2007 Free Software Foundation, Inc. Written by Bruno Haible , 2006. This program is free software; you can redistribute it and/or modify @@ -70,6 +70,10 @@ extern "C" { NULL denotes pointer comparison. */ typedef int (*gl_setelement_compar_fn) (const void *elt1, const void *elt2); +/* Type of function used to dispose an element once it's removed from a set. + NULL denotes a no-op. */ +typedef void (*gl_setelement_dispose_fn) (const void *elt); + /* Type of function used to compare an element with a threshold. Return true if the element is greater or equal than the threshold. */ typedef bool (*gl_setelement_threshold_fn) (const void *elt, const void *threshold); @@ -84,9 +88,11 @@ typedef const struct gl_oset_implementation * gl_oset_implementation_t; /* Create an empty set. IMPLEMENTATION is one of GL_ARRAY_OSET, GL_AVLTREE_OSET, GL_RBTREE_OSET. - COMPAR_FN is an element comparison function or NULL. */ + COMPAR_FN is an element comparison function or NULL. + DISPOSE_FN is an element disposal function or NULL. */ extern gl_oset_t gl_oset_create_empty (gl_oset_implementation_t implementation, - gl_setelement_compar_fn compar_fn); + gl_setelement_compar_fn compar_fn, + gl_setelement_dispose_fn dispose_fn); /* Return the current number of elements in an ordered set. */ extern size_t gl_oset_size (gl_oset_t set); @@ -155,7 +161,8 @@ struct gl_oset_implementation { /* gl_oset_t functions. */ gl_oset_t (*create_empty) (gl_oset_implementation_t implementation, - gl_setelement_compar_fn compar_fn); + gl_setelement_compar_fn compar_fn, + gl_setelement_dispose_fn dispose_fn); size_t (*size) (gl_oset_t set); bool (*search) (gl_oset_t set, const void *elt); bool (*search_atleast) (gl_oset_t set, @@ -174,6 +181,7 @@ struct gl_oset_impl_base { const struct gl_oset_implementation *vtable; gl_setelement_compar_fn compar_fn; + gl_setelement_dispose_fn dispose_fn; }; #if HAVE_INLINE @@ -185,9 +193,10 @@ struct gl_oset_impl_base # define gl_oset_create_empty gl_oset_create_empty_inline static inline gl_oset_t gl_oset_create_empty (gl_oset_implementation_t implementation, - gl_setelement_compar_fn compar_fn) + gl_setelement_compar_fn compar_fn, + gl_setelement_dispose_fn dispose_fn) { - return implementation->create_empty (implementation, compar_fn); + return implementation->create_empty (implementation, compar_fn, dispose_fn); } # define gl_oset_size gl_oset_size_inline diff --git a/lib/gl_rbtree_oset.c b/lib/gl_rbtree_oset.c index 5e74fc727..936709d58 100644 --- a/lib/gl_rbtree_oset.c +++ b/lib/gl_rbtree_oset.c @@ -1,5 +1,5 @@ /* Ordered set data type implemented by a binary tree. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006-2007 Free Software Foundation, Inc. Written by Bruno Haible , 2006. This program is free software; you can redistribute it and/or modify @@ -749,6 +749,8 @@ gl_tree_remove_node (gl_oset_t set, gl_oset_node_t node) } set->count--; + if (set->base.dispose_fn != NULL) + set->base.dispose_fn (node->value); free (node); return true; } diff --git a/tests/test-array_oset.c b/tests/test-array_oset.c index b28e3d219..c114c86ca 100644 --- a/tests/test-array_oset.c +++ b/tests/test-array_oset.c @@ -88,7 +88,7 @@ main (int argc, char *argv[]) unsigned int repeat; /* Create set1. */ - set1 = gl_oset_create_empty (GL_ARRAY_OSET, (gl_setelement_compar_fn) strcmp); + set1 = gl_oset_create_empty (GL_ARRAY_OSET, (gl_setelement_compar_fn) strcmp, NULL); /* Create set2. */ set2 = gl_list_create_empty (GL_ARRAY_LIST, NULL, NULL, false); diff --git a/tests/test-avltree_oset.c b/tests/test-avltree_oset.c index c5c724873..c7991359d 100644 --- a/tests/test-avltree_oset.c +++ b/tests/test-avltree_oset.c @@ -86,10 +86,10 @@ main (int argc, char *argv[]) unsigned int repeat; /* Create set1. */ - set1 = gl_oset_create_empty (GL_ARRAY_OSET, (gl_setelement_compar_fn) strcmp); + set1 = gl_oset_create_empty (GL_ARRAY_OSET, (gl_setelement_compar_fn) strcmp, NULL); /* Create set2. */ - set2 = gl_oset_create_empty (GL_AVLTREE_OSET, (gl_setelement_compar_fn) strcmp); + set2 = gl_oset_create_empty (GL_AVLTREE_OSET, (gl_setelement_compar_fn) strcmp, NULL); check_all (set1, set2); diff --git a/tests/test-rbtree_oset.c b/tests/test-rbtree_oset.c index 735a2f692..dd778bb02 100644 --- a/tests/test-rbtree_oset.c +++ b/tests/test-rbtree_oset.c @@ -88,10 +88,10 @@ main (int argc, char *argv[]) unsigned int repeat; /* Create set1. */ - set1 = gl_oset_create_empty (GL_ARRAY_OSET, (gl_setelement_compar_fn) strcmp); + set1 = gl_oset_create_empty (GL_ARRAY_OSET, (gl_setelement_compar_fn) strcmp, NULL); /* Create set2. */ - set2 = gl_oset_create_empty (GL_RBTREE_OSET, (gl_setelement_compar_fn) strcmp); + set2 = gl_oset_create_empty (GL_RBTREE_OSET, (gl_setelement_compar_fn) strcmp, NULL); check_all (set1, set2); -- 2.11.0