bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Idea for linked-list


From: Bruno Haible
Subject: Re: Idea for linked-list
Date: Fri, 16 Mar 2007 01:31:08 +0100
User-agent: KMail/1.5.4

Simon Josefsson wrote:
> > This function is invoked for each list item that for any reason is
> > being removed from the list.  Is it possible to do this with the
> > linked-list module?

Good idea. I'm apply this:

2007-03-15  Bruno Haible  <address@hidden>

        * lib/gl_list.h (gl_listelement_dispose_fn): New type.
        (gl_list_create_empty, gl_list_create): Add dispose_fn argument.
        (struct gl_list_implementation): Add dispose_fn argument to the
        'create_empty', 'create' methods.
        (struct gl_list_impl_base): Add field 'dispose_fn'.
        * lib/gl_list.c (gl_list_create_empty, gl_list_create): Add dispose_fn
        argument.
        * lib/gl_array_list.c (gl_array_create_empty, gl_array_create): Add
        dispose_fn argument.
        (gl_array_remove_node, gl_array_remove_at, gl_array_list_free): Call
        dispose_fn on the dropped values.
        * lib/gl_carray_list.c (gl_carray_create_empty, gl_carray_create): Add
        dispose_fn argument.
        (gl_carray_remove_at, gl_carray_list_free): Call dispose_fn on the
        dropped values.
        * lib/gl_anyavltree_list2.h (gl_tree_create): Add dispose_fn argument.
        (gl_tree_remove_node): Call dispose_fn on the dropped value.
        * lib/gl_anyrbtree_list2.h (gl_tree_create): Add dispose_fn argument.
        (gl_tree_remove_node): Call dispose_fn on the dropped value.
        * lib/gl_anytree_list2.h (gl_tree_create_empty): Add dispose_fn
        argument.
        (gl_tree_list_free): Call dispose_fn on the dropped values.
        * lib/gl_anytreehash_list2.h (gl_tree_list_free): Call dispose_fn on
        the dropped values.
        * lib/gl_anylinked_list2.h (gl_linked_create_empty, gl_linked_create):
        Add dispose_fn argument.
        (gl_linked_remove_node, gl_linked_remove_at, gl_linked_list_free):
        Call dispose_fn on the dropped values.
        * lib/gl_sublist.c (gl_sublist_create_empty, gl_sublist_create_fill):
        Add dispose_fn argument.
        (gl_sublist_create): Initialize the 'dispose_fn' field.
        * lib/clean-temp.c (create_temp_dir, register_fd): Update.
        * tests/test-array_list.c (main): Update.
        * tests/test-carray_list.c (main): Update.
        * tests/test-avltree_list.c (main): Update.
        * tests/test-rbtree_list.c (main): Update.
        * tests/test-avltreehash_list.c (main): Update.
        * tests/test-rbtreehash_list.c (main): Update.
        * tests/test-linked_list.c (main): Update.
        * tests/test-linkedhash_list.c (main): Update.
        * tests/test-array_oset.c (main): Update.

*** lib/clean-temp.c    18 Feb 2007 15:42:40 -0000      1.13
--- lib/clean-temp.c    16 Mar 2007 00:03:58 -0000
***************
*** 320,328 ****
    tmpdir->dirname = NULL;
    tmpdir->cleanup_verbose = cleanup_verbose;
    tmpdir->subdirs = gl_list_create_empty (GL_LINKEDHASH_LIST,
!                                         string_equals, string_hash, false);
    tmpdir->files = gl_list_create_empty (GL_LINKEDHASH_LIST,
!                                       string_equals, string_hash, false);
  
    /* Create the temporary directory.  */
    xtemplate = (char *) xallocsa (PATH_MAX);
--- 320,330 ----
    tmpdir->dirname = NULL;
    tmpdir->cleanup_verbose = cleanup_verbose;
    tmpdir->subdirs = gl_list_create_empty (GL_LINKEDHASH_LIST,
!                                         string_equals, string_hash, NULL,
!                                         false);
    tmpdir->files = gl_list_create_empty (GL_LINKEDHASH_LIST,
!                                       string_equals, string_hash, NULL,
!                                       false);
  
    /* Create the temporary directory.  */
    xtemplate = (char *) xallocsa (PATH_MAX);
***************
*** 599,605 ****
  register_fd (int fd)
  {
    if (descriptors == NULL)
!     descriptors = gl_list_create_empty (GL_LINKEDHASH_LIST, NULL, NULL, 
false);
    gl_list_add_first (descriptors, (void *) (uintptr_t) fd);
  }
  
--- 601,608 ----
  register_fd (int fd)
  {
    if (descriptors == NULL)
!     descriptors = gl_list_create_empty (GL_LINKEDHASH_LIST, NULL, NULL, NULL,
!                                       false);
    gl_list_add_first (descriptors, (void *) (uintptr_t) fd);
  }
  
*** lib/gl_anyavltree_list2.h   7 Nov 2006 14:24:05 -0000       1.2
--- lib/gl_anyavltree_list2.h   16 Mar 2007 00:03:58 -0000
***************
*** 1,5 ****
  /* Sequential list data type implemented by a binary tree.
!    Copyright (C) 2006 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
--- 1,5 ----
  /* Sequential list data type implemented by a binary tree.
!    Copyright (C) 2006-2007 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
***************
*** 63,68 ****
--- 63,69 ----
  gl_tree_create (gl_list_implementation_t implementation,
                gl_listelement_equals_fn equals_fn,
                gl_listelement_hashcode_fn hashcode_fn,
+               gl_listelement_dispose_fn dispose_fn,
                bool allow_duplicates,
                size_t count, const void **contents)
  {
***************
*** 71,76 ****
--- 72,78 ----
    list->base.vtable = implementation;
    list->base.equals_fn = equals_fn;
    list->base.hashcode_fn = hashcode_fn;
+   list->base.dispose_fn = dispose_fn;
    list->base.allow_duplicates = allow_duplicates;
  #if WITH_HASHTABLE
    {
***************
*** 738,743 ****
--- 740,747 ----
        rebalance (list, child, -1, subst_parent != node ? subst_parent : 
subst);
      }
  
+   if (list->base.dispose_fn != NULL)
+     list->base.dispose_fn (node->value);
    free (node);
    return true;
  }
*** lib/gl_anylinked_list2.h    7 Nov 2006 14:24:05 -0000       1.7
--- lib/gl_anylinked_list2.h    16 Mar 2007 00:03:58 -0000
***************
*** 1,5 ****
  /* Sequential list data type implemented by a linked list.
!    Copyright (C) 2006 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
--- 1,5 ----
  /* Sequential list data type implemented by a linked list.
!    Copyright (C) 2006-2007 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
***************
*** 41,46 ****
--- 41,47 ----
  gl_linked_create_empty (gl_list_implementation_t implementation,
                        gl_listelement_equals_fn equals_fn,
                        gl_listelement_hashcode_fn hashcode_fn,
+                       gl_listelement_dispose_fn dispose_fn,
                        bool allow_duplicates)
  {
    struct gl_list_impl *list = XMALLOC (struct gl_list_impl);
***************
*** 48,53 ****
--- 49,55 ----
    list->base.vtable = implementation;
    list->base.equals_fn = equals_fn;
    list->base.hashcode_fn = hashcode_fn;
+   list->base.dispose_fn = dispose_fn;
    list->base.allow_duplicates = allow_duplicates;
  #if WITH_HASHTABLE
    list->table_size = 11;
***************
*** 64,69 ****
--- 66,72 ----
  gl_linked_create (gl_list_implementation_t implementation,
                  gl_listelement_equals_fn equals_fn,
                  gl_listelement_hashcode_fn hashcode_fn,
+                 gl_listelement_dispose_fn dispose_fn,
                  bool allow_duplicates,
                  size_t count, const void **contents)
  {
***************
*** 73,78 ****
--- 76,82 ----
    list->base.vtable = implementation;
    list->base.equals_fn = equals_fn;
    list->base.hashcode_fn = hashcode_fn;
+   list->base.dispose_fn = dispose_fn;
    list->base.allow_duplicates = allow_duplicates;
  #if WITH_HASHTABLE
    {
***************
*** 684,689 ****
--- 688,695 ----
    next->prev = prev;
    list->count--;
  
+   if (list->base.dispose_fn != NULL)
+     list->base.dispose_fn (node->value);
    free (node);
    return true;
  }
***************
*** 730,735 ****
--- 736,743 ----
  #endif
    list->count--;
  
+   if (list->base.dispose_fn != NULL)
+     list->base.dispose_fn (removed_node->value);
    free (removed_node);
    return true;
  }
***************
*** 748,758 ****
--- 756,769 ----
  static void
  gl_linked_list_free (gl_list_t list)
  {
+   gl_listelement_dispose_fn dispose = list->base.dispose_fn;
    gl_list_node_t node;
  
    for (node = list->root.next; node != &list->root; )
      {
        gl_list_node_t next = node->next;
+       if (dispose != NULL)
+       dispose (node->value);
        free (node);
        node = next;
      }
*** lib/gl_anyrbtree_list2.h    7 Nov 2006 14:24:05 -0000       1.2
--- lib/gl_anyrbtree_list2.h    16 Mar 2007 00:03:58 -0000
***************
*** 1,5 ****
  /* Sequential list data type implemented by a binary tree.
!    Copyright (C) 2006 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
--- 1,5 ----
  /* Sequential list data type implemented by a binary tree.
!    Copyright (C) 2006-2007 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
***************
*** 68,73 ****
--- 68,74 ----
  gl_tree_create (gl_list_implementation_t implementation,
                gl_listelement_equals_fn equals_fn,
                gl_listelement_hashcode_fn hashcode_fn,
+               gl_listelement_dispose_fn dispose_fn,
                bool allow_duplicates,
                size_t count, const void **contents)
  {
***************
*** 76,81 ****
--- 77,83 ----
    list->base.vtable = implementation;
    list->base.equals_fn = equals_fn;
    list->base.hashcode_fn = hashcode_fn;
+   list->base.dispose_fn = dispose_fn;
    list->base.allow_duplicates = allow_duplicates;
  #if WITH_HASHTABLE
    {
***************
*** 959,964 ****
--- 961,968 ----
        }
      }
  
+   if (list->base.dispose_fn != NULL)
+     list->base.dispose_fn (node->value);
    free (node);
    return true;
  }
*** lib/gl_anytree_list2.h      7 Nov 2006 14:24:05 -0000       1.5
--- lib/gl_anytree_list2.h      16 Mar 2007 00:03:58 -0000
***************
*** 1,5 ****
  /* Sequential list data type implemented by a binary tree.
!    Copyright (C) 2006 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
--- 1,5 ----
  /* Sequential list data type implemented by a binary tree.
!    Copyright (C) 2006-2007 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
***************
*** 23,28 ****
--- 23,29 ----
  gl_tree_create_empty (gl_list_implementation_t implementation,
                      gl_listelement_equals_fn equals_fn,
                      gl_listelement_hashcode_fn hashcode_fn,
+                     gl_listelement_dispose_fn dispose_fn,
                      bool allow_duplicates)
  {
    struct gl_list_impl *list = XMALLOC (struct gl_list_impl);
***************
*** 30,35 ****
--- 31,37 ----
    list->base.vtable = implementation;
    list->base.equals_fn = equals_fn;
    list->base.hashcode_fn = hashcode_fn;
+   list->base.dispose_fn = dispose_fn;
    list->base.allow_duplicates = allow_duplicates;
  #if WITH_HASHTABLE
    list->table_size = 11;
***************
*** 457,462 ****
--- 459,466 ----
          if (!stack_ptr->rightp)
            break;
          /* Free the current node.  */
+         if (list->base.dispose_fn != NULL)
+           list->base.dispose_fn (node->value);
          free (node);
        }
        /* Descend on right branch.  */
*** lib/gl_anytreehash_list2.h  10 Oct 2006 12:48:57 -0000      1.3
--- lib/gl_anytreehash_list2.h  16 Mar 2007 00:03:58 -0000
***************
*** 1,5 ****
  /* Sequential list data type implemented by a hash table with a binary tree.
!    Copyright (C) 2006 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
--- 1,5 ----
  /* Sequential list data type implemented by a hash table with a binary tree.
!    Copyright (C) 2006-2007 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
***************
*** 198,203 ****
--- 198,205 ----
            if (!stack_ptr->rightp)
              break;
            /* Free the current node.  */
+           if (list->base.dispose_fn != NULL)
+             list->base.dispose_fn (node->value);
            free (node);
          }
        /* Descend on right branch.  */
*** lib/gl_array_list.c 6 Nov 2006 13:03:51 -0000       1.8
--- lib/gl_array_list.c 16 Mar 2007 00:03:58 -0000
***************
*** 1,5 ****
  /* Sequential list data type implemented by an array.
!    Copyright (C) 2006 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
--- 1,5 ----
  /* Sequential list data type implemented by an array.
!    Copyright (C) 2006-2007 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
***************
*** 56,61 ****
--- 56,62 ----
  gl_array_create_empty (gl_list_implementation_t implementation,
                       gl_listelement_equals_fn equals_fn,
                       gl_listelement_hashcode_fn hashcode_fn,
+                      gl_listelement_dispose_fn dispose_fn,
                       bool allow_duplicates)
  {
    struct gl_list_impl *list = XMALLOC (struct gl_list_impl);
***************
*** 63,68 ****
--- 64,70 ----
    list->base.vtable = implementation;
    list->base.equals_fn = equals_fn;
    list->base.hashcode_fn = hashcode_fn;
+   list->base.dispose_fn = dispose_fn;
    list->base.allow_duplicates = allow_duplicates;
    list->elements = NULL;
    list->count = 0;
***************
*** 75,80 ****
--- 77,83 ----
  gl_array_create (gl_list_implementation_t implementation,
                 gl_listelement_equals_fn equals_fn,
                 gl_listelement_hashcode_fn hashcode_fn,
+                gl_listelement_dispose_fn dispose_fn,
                 bool allow_duplicates,
                 size_t count, const void **contents)
  {
***************
*** 83,88 ****
--- 86,92 ----
    list->base.vtable = implementation;
    list->base.equals_fn = equals_fn;
    list->base.hashcode_fn = hashcode_fn;
+   list->base.dispose_fn = dispose_fn;
    list->base.allow_duplicates = allow_duplicates;
    if (count > 0)
      {
***************
*** 345,350 ****
--- 349,356 ----
      abort ();
    position = index;
    elements = list->elements;
+   if (list->base.dispose_fn != NULL)
+     list->base.dispose_fn (elements[position]);
    for (i = position + 1; i < count; i++)
      elements[i - 1] = elements[i];
    list->count = count - 1;
***************
*** 362,367 ****
--- 368,375 ----
      /* Invalid argument.  */
      abort ();
    elements = list->elements;
+   if (list->base.dispose_fn != NULL)
+     list->base.dispose_fn (elements[position]);
    for (i = position + 1; i < count; i++)
      elements[i - 1] = elements[i];
    list->count = count - 1;
***************
*** 382,388 ****
  gl_array_list_free (gl_list_t list)
  {
    if (list->elements != NULL)
!     free (list->elements);
    free (list);
  }
  
--- 390,412 ----
  gl_array_list_free (gl_list_t list)
  {
    if (list->elements != NULL)
!     {
!       if (list->base.dispose_fn != NULL)
!       {
!         size_t count = list->count;
! 
!         if (count > 0)
!           {
!             gl_listelement_dispose_fn dispose = list->base.dispose_fn;
!             const void **elements = list->elements;
! 
!             do
!               dispose (*elements++);
!             while (--count > 0);
!           }
!       }
!       free (list->elements);
!     }
    free (list);
  }
  
*** lib/gl_carray_list.c        6 Nov 2006 13:03:10 -0000       1.7
--- lib/gl_carray_list.c        16 Mar 2007 00:03:58 -0000
***************
*** 1,5 ****
  /* Sequential list data type implemented by a circular array.
!    Copyright (C) 2006 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
--- 1,5 ----
  /* Sequential list data type implemented by a circular array.
!    Copyright (C) 2006-2007 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
***************
*** 57,71 ****
  
  static gl_list_t
  gl_carray_create_empty (gl_list_implementation_t implementation,
!                      gl_listelement_equals_fn equals_fn,
!                      gl_listelement_hashcode_fn hashcode_fn,
!                      bool allow_duplicates)
  {
    struct gl_list_impl *list = XMALLOC (struct gl_list_impl);
  
    list->base.vtable = implementation;
    list->base.equals_fn = equals_fn;
    list->base.hashcode_fn = hashcode_fn;
    list->base.allow_duplicates = allow_duplicates;
    list->elements = NULL;
    list->offset = 0;
--- 57,73 ----
  
  static gl_list_t
  gl_carray_create_empty (gl_list_implementation_t implementation,
!                       gl_listelement_equals_fn equals_fn,
!                       gl_listelement_hashcode_fn hashcode_fn,
!                       gl_listelement_dispose_fn dispose_fn,
!                       bool allow_duplicates)
  {
    struct gl_list_impl *list = XMALLOC (struct gl_list_impl);
  
    list->base.vtable = implementation;
    list->base.equals_fn = equals_fn;
    list->base.hashcode_fn = hashcode_fn;
+   list->base.dispose_fn = dispose_fn;
    list->base.allow_duplicates = allow_duplicates;
    list->elements = NULL;
    list->offset = 0;
***************
*** 77,92 ****
  
  static gl_list_t
  gl_carray_create (gl_list_implementation_t implementation,
!                gl_listelement_equals_fn equals_fn,
!                gl_listelement_hashcode_fn hashcode_fn,
!                bool allow_duplicates,
!                size_t count, const void **contents)
  {
    struct gl_list_impl *list = XMALLOC (struct gl_list_impl);
  
    list->base.vtable = implementation;
    list->base.equals_fn = equals_fn;
    list->base.hashcode_fn = hashcode_fn;
    list->base.allow_duplicates = allow_duplicates;
    if (count > 0)
      {
--- 79,96 ----
  
  static gl_list_t
  gl_carray_create (gl_list_implementation_t implementation,
!                 gl_listelement_equals_fn equals_fn,
!                 gl_listelement_hashcode_fn hashcode_fn,
!                 gl_listelement_dispose_fn dispose_fn,
!                 bool allow_duplicates,
!                 size_t count, const void **contents)
  {
    struct gl_list_impl *list = XMALLOC (struct gl_list_impl);
  
    list->base.vtable = implementation;
    list->base.equals_fn = equals_fn;
    list->base.hashcode_fn = hashcode_fn;
+   list->base.dispose_fn = dispose_fn;
    list->base.allow_duplicates = allow_duplicates;
    if (count > 0)
      {
***************
*** 448,453 ****
--- 452,459 ----
          /* Here we must have list->offset > 0, hence list->allocated > 0.  */
          size_t i1 = list->allocated - 1;
          i2 -= list->allocated;
+         if (list->base.dispose_fn != NULL)
+           list->base.dispose_fn (elements[i2]);
          for (i = i2; i > 0; i--)
            elements[i] = elements[i - 1];
          elements[0] = elements[i1];
***************
*** 456,461 ****
--- 462,469 ----
        }
        else
        {
+         if (list->base.dispose_fn != NULL)
+           list->base.dispose_fn (elements[i2]);
          for (i = i2; i > i0; i--)
            elements[i] = elements[i - 1];
        }
***************
*** 474,479 ****
--- 482,489 ----
        {
          i1 -= list->allocated;
          i3 -= list->allocated;
+         if (list->base.dispose_fn != NULL)
+           list->base.dispose_fn (elements[i1]);
          for (i = i1; i < i3; i++)
            elements[i] = elements[i + 1];
        }
***************
*** 482,487 ****
--- 492,499 ----
          /* Here we must have list->offset > 0, hence list->allocated > 0.  */
          size_t i2 = list->allocated - 1;
          i3 -= list->allocated;
+         if (list->base.dispose_fn != NULL)
+           list->base.dispose_fn (elements[i1]);
          for (i = i1; i < i2; i++)
            elements[i] = elements[i + 1];
          elements[i2] = elements[0];
***************
*** 490,495 ****
--- 502,509 ----
        }
        else
        {
+         if (list->base.dispose_fn != NULL)
+           list->base.dispose_fn (elements[i1]);
          for (i = i1; i < i3; i++)
            elements[i] = elements[i + 1];
        }
***************
*** 524,530 ****
  gl_carray_list_free (gl_list_t list)
  {
    if (list->elements != NULL)
!     free (list->elements);
    free (list);
  }
  
--- 538,579 ----
  gl_carray_list_free (gl_list_t list)
  {
    if (list->elements != NULL)
!     {
!       if (list->base.dispose_fn != NULL)
!       {
!         size_t count = list->count;
! 
!         if (count > 0)
!           {
!             gl_listelement_dispose_fn dispose = list->base.dispose_fn;
!             const void **elements = list->elements;
!             size_t i1 = list->offset;
!             size_t i3 = list->offset + count - 1;
! 
!             if (i3 >= list->allocated)
!               {
!                 /* Here we must have list->offset > 0, hence
!                    list->allocated > 0.  */
!                 size_t i2 = list->allocated - 1;
!                 size_t i;
! 
!                 i3 -= list->allocated;
!                 for (i = i1; i <= i2; i++)
!                   dispose (elements[i]);
!                 for (i = 0; i <= i3; i++)
!                   dispose (elements[i]);
!               }
!             else
!               {
!                 size_t i;
! 
!                 for (i = i1; i <= i3; i++)
!                   dispose (elements[i]);
!               }
!           }
!       }
!       free (list->elements);
!     }
    free (list);
  }
  
*** lib/gl_list.c       6 Oct 2006 12:06:07 -0000       1.4
--- lib/gl_list.c       16 Mar 2007 00:03:58 -0000
***************
*** 1,5 ****
  /* Abstract sequential list data type.
!    Copyright (C) 2006 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
--- 1,5 ----
  /* Abstract sequential list data type.
!    Copyright (C) 2006-2007 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
***************
*** 31,51 ****
  gl_list_create_empty (gl_list_implementation_t implementation,
                      gl_listelement_equals_fn equals_fn,
                      gl_listelement_hashcode_fn hashcode_fn,
                      bool allow_duplicates)
  {
    return implementation->create_empty (implementation, equals_fn, hashcode_fn,
!                                      allow_duplicates);
  }
  
  gl_list_t
  gl_list_create (gl_list_implementation_t implementation,
                gl_listelement_equals_fn equals_fn,
                gl_listelement_hashcode_fn hashcode_fn,
                bool allow_duplicates,
                size_t count, const void **contents)
  {
    return implementation->create (implementation, equals_fn, hashcode_fn,
!                                allow_duplicates, count, contents);
  }
  
  size_t
--- 31,53 ----
  gl_list_create_empty (gl_list_implementation_t implementation,
                      gl_listelement_equals_fn equals_fn,
                      gl_listelement_hashcode_fn hashcode_fn,
+                     gl_listelement_dispose_fn dispose_fn,
                      bool allow_duplicates)
  {
    return implementation->create_empty (implementation, equals_fn, hashcode_fn,
!                                      dispose_fn, allow_duplicates);
  }
  
  gl_list_t
  gl_list_create (gl_list_implementation_t implementation,
                gl_listelement_equals_fn equals_fn,
                gl_listelement_hashcode_fn hashcode_fn,
+               gl_listelement_dispose_fn dispose_fn,
                bool allow_duplicates,
                size_t count, const void **contents)
  {
    return implementation->create (implementation, equals_fn, hashcode_fn,
!                                dispose_fn, allow_duplicates, count, contents);
  }
  
  size_t
*** lib/gl_list.h       24 Oct 2006 13:25:29 -0000      1.4
--- lib/gl_list.h       16 Mar 2007 00:03:58 -0000
***************
*** 1,5 ****
  /* Abstract sequential list data type.
!    Copyright (C) 2006 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
--- 1,5 ----
  /* Abstract sequential list data type.
!    Copyright (C) 2006-2007 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
***************
*** 102,107 ****
--- 102,111 ----
     NULL denotes a function that depends only on the pointer itself.  */
  typedef size_t (*gl_listelement_hashcode_fn) (const void *elt);
  
+ /* Type of function used to dispose an element once it's removed from a list.
+    NULL denotes a no-op.  */
+ typedef void (*gl_listelement_dispose_fn) (const void *elt);
+ 
  struct gl_list_impl;
  /* Type representing an entire list.  */
  typedef struct gl_list_impl * gl_list_t;
***************
*** 122,132 ****
--- 126,138 ----
     GL_RBTREEHASH_LIST.
     EQUALS_FN is an element comparison function or NULL.
     HASHCODE_FN is an element hash code function or NULL.
+    DISPOSE_FN is an element disposal function or NULL.
     ALLOW_DUPLICATES is false if duplicate elements shall not be allowed in
     the list. The implementation may verify this at runtime.  */
  extern gl_list_t gl_list_create_empty (gl_list_implementation_t 
implementation,
                                       gl_listelement_equals_fn equals_fn,
                                       gl_listelement_hashcode_fn hashcode_fn,
+                                      gl_listelement_dispose_fn dispose_fn,
                                       bool allow_duplicates);
  
  /* Create a list with given contents.
***************
*** 135,140 ****
--- 141,147 ----
     GL_RBTREEHASH_LIST.
     EQUALS_FN is an element comparison function or NULL.
     HASHCODE_FN is an element hash code function or NULL.
+    DISPOSE_FN is an element disposal function or NULL.
     ALLOW_DUPLICATES is false if duplicate elements shall not be allowed in
     the list. The implementation may verify this at runtime.
     COUNT is the number of initial elements.
***************
*** 142,147 ****
--- 149,155 ----
  extern gl_list_t gl_list_create (gl_list_implementation_t implementation,
                                 gl_listelement_equals_fn equals_fn,
                                 gl_listelement_hashcode_fn hashcode_fn,
+                                gl_listelement_dispose_fn dispose_fn,
                                 bool allow_duplicates,
                                 size_t count, const void **contents);
  
***************
*** 364,373 ****
--- 372,383 ----
    gl_list_t (*create_empty) (gl_list_implementation_t implementation,
                             gl_listelement_equals_fn equals_fn,
                             gl_listelement_hashcode_fn hashcode_fn,
+                            gl_listelement_dispose_fn dispose_fn,
                             bool allow_duplicates);
    gl_list_t (*create) (gl_list_implementation_t implementation,
                       gl_listelement_equals_fn equals_fn,
                       gl_listelement_hashcode_fn hashcode_fn,
+                      gl_listelement_dispose_fn dispose_fn,
                       bool allow_duplicates,
                       size_t count, const void **contents);
    size_t (*size) (gl_list_t list);
***************
*** 429,434 ****
--- 439,445 ----
    const struct gl_list_implementation *vtable;
    gl_listelement_equals_fn equals_fn;
    gl_listelement_hashcode_fn hashcode_fn;
+   gl_listelement_dispose_fn dispose_fn;
    bool allow_duplicates;
  };
  
***************
*** 443,452 ****
  gl_list_create_empty (gl_list_implementation_t implementation,
                      gl_listelement_equals_fn equals_fn,
                      gl_listelement_hashcode_fn hashcode_fn,
                      bool allow_duplicates)
  {
    return implementation->create_empty (implementation, equals_fn, hashcode_fn,
!                                      allow_duplicates);
  }
  
  # define gl_list_create gl_list_create_inline
--- 454,464 ----
  gl_list_create_empty (gl_list_implementation_t implementation,
                      gl_listelement_equals_fn equals_fn,
                      gl_listelement_hashcode_fn hashcode_fn,
+                     gl_listelement_dispose_fn dispose_fn,
                      bool allow_duplicates)
  {
    return implementation->create_empty (implementation, equals_fn, hashcode_fn,
!                                      dispose_fn, allow_duplicates);
  }
  
  # define gl_list_create gl_list_create_inline
***************
*** 454,464 ****
  gl_list_create (gl_list_implementation_t implementation,
                gl_listelement_equals_fn equals_fn,
                gl_listelement_hashcode_fn hashcode_fn,
                bool allow_duplicates,
                size_t count, const void **contents)
  {
    return implementation->create (implementation, equals_fn, hashcode_fn,
!                                allow_duplicates, count, contents);
  }
  
  # define gl_list_size gl_list_size_inline
--- 466,477 ----
  gl_list_create (gl_list_implementation_t implementation,
                gl_listelement_equals_fn equals_fn,
                gl_listelement_hashcode_fn hashcode_fn,
+               gl_listelement_dispose_fn dispose_fn,
                bool allow_duplicates,
                size_t count, const void **contents)
  {
    return implementation->create (implementation, equals_fn, hashcode_fn,
!                                dispose_fn, allow_duplicates, count, contents);
  }
  
  # define gl_list_size gl_list_size_inline
*** lib/gl_sublist.c    6 Nov 2006 13:03:10 -0000       1.2
--- lib/gl_sublist.c    16 Mar 2007 00:03:59 -0000
***************
*** 1,5 ****
  /* Sequential list data type backed by another list.
!    Copyright (C) 2006 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
--- 1,5 ----
  /* Sequential list data type backed by another list.
!    Copyright (C) 2006-2007 Free Software Foundation, Inc.
     Written by Bruno Haible <address@hidden>, 2006.
  
     This program is free software; you can redistribute it and/or modify
***************
*** 53,58 ****
--- 53,59 ----
  gl_sublist_create_empty (gl_list_implementation_t implementation,
                         gl_listelement_equals_fn equals_fn,
                         gl_listelement_hashcode_fn hashcode_fn,
+                        gl_listelement_dispose_fn dispose_fn,
                         bool allow_duplicates)
  {
    /* Shouldn't be called.  */
***************
*** 63,68 ****
--- 64,70 ----
  gl_sublist_create_fill (gl_list_implementation_t implementation,
                        gl_listelement_equals_fn equals_fn,
                        gl_listelement_hashcode_fn hashcode_fn,
+                       gl_listelement_dispose_fn dispose_fn,
                        bool allow_duplicates,
                        size_t count, const void **contents)
  {
***************
*** 435,440 ****
--- 437,443 ----
      list->base.vtable = &gl_sublist_list_implementation;
      list->base.equals_fn = whole_list->base.equals_fn; /* actually unused */
      list->base.hashcode_fn = whole_list->base.hashcode_fn; /* actually unused 
*/
+     list->base.dispose_fn = whole_list->base.dispose_fn; /* actually unused */
      list->base.allow_duplicates = whole_list->base.allow_duplicates; /* 
unused */
      if (whole_list->base.vtable == &gl_sublist_list_implementation)
        {
*** tests/test-array_list.c     3 Mar 2007 01:46:17 -0000       1.3
--- tests/test-array_list.c     16 Mar 2007 00:03:59 -0000
***************
*** 71,80 ****
        contents[i] = RANDOM_OBJECT ();
  
      /* Create list1.  */
!     list1 = gl_list_create (GL_ARRAY_LIST, NULL, NULL, true,
                              initial_size, contents);
      /* Create list2.  */
!     list2 = gl_list_create_empty (GL_ARRAY_LIST, NULL, NULL, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
--- 71,80 ----
        contents[i] = RANDOM_OBJECT ();
  
      /* Create list1.  */
!     list1 = gl_list_create (GL_ARRAY_LIST, NULL, NULL, NULL, true,
                              initial_size, contents);
      /* Create list2.  */
!     list2 = gl_list_create_empty (GL_ARRAY_LIST, NULL, NULL, NULL, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
*** tests/test-array_oset.c     15 Mar 2007 23:56:14 -0000      1.3
--- tests/test-array_oset.c     16 Mar 2007 00:03:59 -0000
***************
*** 91,97 ****
      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);
  
      check_all (set1, set2);
  
--- 91,97 ----
      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, NULL, false);
  
      check_all (set1, set2);
  
*** tests/test-avltree_list.c   3 Mar 2007 01:50:21 -0000       1.2
--- tests/test-avltree_list.c   16 Mar 2007 00:03:59 -0000
***************
*** 81,95 ****
        contents[i] = RANDOM_OBJECT ();
  
      /* Create list1.  */
!     list1 = gl_list_create (GL_ARRAY_LIST, NULL, NULL, true,
                              initial_size, contents);
      /* Create list2.  */
!     list2 = gl_list_create_empty (GL_AVLTREE_LIST, NULL, NULL, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
!     list3 = gl_list_create (GL_AVLTREE_LIST, NULL, NULL, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);
--- 81,95 ----
        contents[i] = RANDOM_OBJECT ();
  
      /* Create list1.  */
!     list1 = gl_list_create (GL_ARRAY_LIST, NULL, NULL, NULL, true,
                              initial_size, contents);
      /* Create list2.  */
!     list2 = gl_list_create_empty (GL_AVLTREE_LIST, NULL, NULL, NULL, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
!     list3 = gl_list_create (GL_AVLTREE_LIST, NULL, NULL, NULL, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);
*** tests/test-avltreehash_list.c       3 Mar 2007 01:54:22 -0000       1.2
--- tests/test-avltreehash_list.c       16 Mar 2007 00:03:59 -0000
***************
*** 111,127 ****
  
      /* Create list1.  */
      list1 = gl_list_create (GL_ARRAY_LIST,
!                             string_equals, string_hash, true,
                              initial_size, contents);
      /* Create list2.  */
      list2 = gl_list_create_empty (GL_AVLTREEHASH_LIST,
!                                   string_equals, string_hash, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
      list3 = gl_list_create (GL_AVLTREEHASH_LIST,
!                             string_equals, string_hash, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);
--- 111,127 ----
  
      /* Create list1.  */
      list1 = gl_list_create (GL_ARRAY_LIST,
!                             string_equals, string_hash, NULL, true,
                              initial_size, contents);
      /* Create list2.  */
      list2 = gl_list_create_empty (GL_AVLTREEHASH_LIST,
!                                   string_equals, string_hash, NULL, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
      list3 = gl_list_create (GL_AVLTREEHASH_LIST,
!                             string_equals, string_hash, NULL, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);
*** tests/test-carray_list.c    3 Mar 2007 04:01:15 -0000       1.2
--- tests/test-carray_list.c    16 Mar 2007 00:03:59 -0000
***************
*** 79,93 ****
        contents[i] = RANDOM_OBJECT ();
  
      /* Create list1.  */
!     list1 = gl_list_create (GL_ARRAY_LIST, NULL, NULL, true,
                              initial_size, contents);
      /* Create list2.  */
!     list2 = gl_list_create_empty (GL_CARRAY_LIST, NULL, NULL, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
!     list3 = gl_list_create (GL_CARRAY_LIST, NULL, NULL, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);
--- 79,93 ----
        contents[i] = RANDOM_OBJECT ();
  
      /* Create list1.  */
!     list1 = gl_list_create (GL_ARRAY_LIST, NULL, NULL, NULL, true,
                              initial_size, contents);
      /* Create list2.  */
!     list2 = gl_list_create_empty (GL_CARRAY_LIST, NULL, NULL, NULL, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
!     list3 = gl_list_create (GL_CARRAY_LIST, NULL, NULL, NULL, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);
*** tests/test-linked_list.c    3 Mar 2007 12:42:29 -0000       1.2
--- tests/test-linked_list.c    16 Mar 2007 00:03:59 -0000
***************
*** 79,93 ****
        contents[i] = RANDOM_OBJECT ();
  
      /* Create list1.  */
!     list1 = gl_list_create (GL_ARRAY_LIST, NULL, NULL, true,
                              initial_size, contents);
      /* Create list2.  */
!     list2 = gl_list_create_empty (GL_LINKED_LIST, NULL, NULL, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
!     list3 = gl_list_create (GL_LINKED_LIST, NULL, NULL, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);
--- 79,93 ----
        contents[i] = RANDOM_OBJECT ();
  
      /* Create list1.  */
!     list1 = gl_list_create (GL_ARRAY_LIST, NULL, NULL, NULL, true,
                              initial_size, contents);
      /* Create list2.  */
!     list2 = gl_list_create_empty (GL_LINKED_LIST, NULL, NULL, NULL, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
!     list3 = gl_list_create (GL_LINKED_LIST, NULL, NULL, NULL, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);
*** tests/test-linkedhash_list.c        3 Mar 2007 04:05:36 -0000       1.2
--- tests/test-linkedhash_list.c        16 Mar 2007 00:03:59 -0000
***************
*** 107,123 ****
  
      /* Create list1.  */
      list1 = gl_list_create (GL_ARRAY_LIST,
!                             string_equals, string_hash, true,
                              initial_size, contents);
      /* Create list2.  */
      list2 = gl_list_create_empty (GL_LINKEDHASH_LIST,
!                                   string_equals, string_hash, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
      list3 = gl_list_create (GL_LINKEDHASH_LIST,
!                             string_equals, string_hash, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);
--- 107,123 ----
  
      /* Create list1.  */
      list1 = gl_list_create (GL_ARRAY_LIST,
!                             string_equals, string_hash, NULL, true,
                              initial_size, contents);
      /* Create list2.  */
      list2 = gl_list_create_empty (GL_LINKEDHASH_LIST,
!                                   string_equals, string_hash, NULL, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
      list3 = gl_list_create (GL_LINKEDHASH_LIST,
!                             string_equals, string_hash, NULL, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);
*** tests/test-rbtree_list.c    3 Mar 2007 12:56:10 -0000       1.2
--- tests/test-rbtree_list.c    16 Mar 2007 00:03:59 -0000
***************
*** 83,97 ****
        contents[i] = RANDOM_OBJECT ();
  
      /* Create list1.  */
!     list1 = gl_list_create (GL_ARRAY_LIST, NULL, NULL, true,
                              initial_size, contents);
      /* Create list2.  */
!     list2 = gl_list_create_empty (GL_RBTREE_LIST, NULL, NULL, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
!     list3 = gl_list_create (GL_RBTREE_LIST, NULL, NULL, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);
--- 83,97 ----
        contents[i] = RANDOM_OBJECT ();
  
      /* Create list1.  */
!     list1 = gl_list_create (GL_ARRAY_LIST, NULL, NULL, NULL, true,
                              initial_size, contents);
      /* Create list2.  */
!     list2 = gl_list_create_empty (GL_RBTREE_LIST, NULL, NULL, NULL, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
!     list3 = gl_list_create (GL_RBTREE_LIST, NULL, NULL, NULL, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);
*** tests/test-rbtreehash_list.c        3 Mar 2007 13:00:31 -0000       1.2
--- tests/test-rbtreehash_list.c        16 Mar 2007 00:03:59 -0000
***************
*** 111,127 ****
  
      /* Create list1.  */
      list1 = gl_list_create (GL_ARRAY_LIST,
!                             string_equals, string_hash, true,
                              initial_size, contents);
      /* Create list2.  */
      list2 = gl_list_create_empty (GL_RBTREEHASH_LIST,
!                                   string_equals, string_hash, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
      list3 = gl_list_create (GL_RBTREEHASH_LIST,
!                             string_equals, string_hash, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);
--- 111,127 ----
  
      /* Create list1.  */
      list1 = gl_list_create (GL_ARRAY_LIST,
!                             string_equals, string_hash, NULL, true,
                              initial_size, contents);
      /* Create list2.  */
      list2 = gl_list_create_empty (GL_RBTREEHASH_LIST,
!                                   string_equals, string_hash, NULL, true);
      for (i = 0; i < initial_size; i++)
        gl_list_add_last (list2, contents[i]);
  
      /* Create list3.  */
      list3 = gl_list_create (GL_RBTREEHASH_LIST,
!                             string_equals, string_hash, NULL, true,
                              initial_size, contents);
  
      check_all (list1, list2, list3);





reply via email to

[Prev in Thread] Current Thread [Next in Thread]