X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fgl_array_oset.c;h=83c563b743bc3bdb9f85287178c50054156cc504;hb=665a8a0fca396d67dfed85580a48178df8b4a60e;hp=a6fdb06e9e93bae80dda045b159b4290631669e5;hpb=5c90f29795d4e8d9a66268d5dc61d02b82cf7db8;p=gnulib.git diff --git a/lib/gl_array_oset.c b/lib/gl_array_oset.c index a6fdb06e9..83c563b74 100644 --- a/lib/gl_array_oset.c +++ b/lib/gl_array_oset.c @@ -1,11 +1,11 @@ /* Ordered set data type implemented by an array. - 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 + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -13,8 +13,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ #include @@ -43,13 +42,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 = - (struct gl_oset_impl *) xmalloc (sizeof (struct gl_oset_impl)); + 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; @@ -205,6 +205,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; @@ -263,7 +265,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); } @@ -298,8 +316,8 @@ gl_array_iterator_next (gl_oset_iterator_t *iterator, const void **eltp) abort (); /* The last returned element was removed. */ iterator->count--; - iterator->p--; - iterator->q--; + iterator->p = (const void **) iterator->p - 1; + iterator->q = (const void **) iterator->q - 1; } if (iterator->p < iterator->q) {