X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fgl_array_oset.c;h=83c563b743bc3bdb9f85287178c50054156cc504;hb=1233d271afb7c3af7e0f4a4e37b1f3d181529c08;hp=f7950b7a6291cbd743b316eb524bd148e4c601e6;hpb=1c091b642ef5dfebb141d72e1289d5f20d5387b5;p=gnulib.git diff --git a/lib/gl_array_oset.c b/lib/gl_array_oset.c index f7950b7a6..83c563b74 100644 --- a/lib/gl_array_oset.c +++ b/lib/gl_array_oset.c @@ -2,10 +2,10 @@ 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,12 +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 = 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 +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; @@ -262,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); }