]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
hashtab.h (struct htab): Add del_f.
authorZack Weinberg <zack@wolery.cumb.org>
Fri, 10 Mar 2000 00:00:24 +0000 (00:00 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Fri, 10 Mar 2000 00:00:24 +0000 (00:00 +0000)
* hashtab.h (struct htab): Add del_f.
(htab_del): New type.
(htab_create): Add fourth argument.

* hashtab.c (htab_create): Set del_f.
(htab_delete, htab_empty, htab_remove_elt, htab_clear_slot):
Use it.

From-SVN: r32459

include/ChangeLog
include/hashtab.h
libiberty/ChangeLog
libiberty/hashtab.c

index 5ab66bcba7a844cf93a43aa9d82e0f6d18614c0f..a73e5fefb06b5f410ed8b31bbeaa12ff2755388d 100644 (file)
@@ -1,3 +1,9 @@
+2000-03-09  Zack Weinberg  <zack@wolery.cumb.org>
+
+       * hashtab.h (struct htab): Add del_f.
+       (htab_del): New type.
+       (htab_create): Add fourth argument.
+
 2000-03-08  Zack Weinberg  <zack@wolery.cumb.org>
 
        * hashtab.h (hash_table_t): Rename to htab_t.
index f17572af86316932b4c8d656b59610ce586703fd..e6e38e4d0589df9ae6e1a07424d55a428087a491 100644 (file)
@@ -47,6 +47,10 @@ typedef unsigned int (*htab_hash) PARAMS ((const void *));
    the table always comes first.  */
 typedef int (*htab_eq) PARAMS ((const void *, const void *));
 
+/* Cleanup function called whenever a live element is removed from
+   the hash table.  */
+typedef void (*htab_del) PARAMS ((void *));
+  
 /* Function called by htab_traverse for each live element.  The first
    arg is the element, the second arg is the auxiliary pointer handed
    to htab_traverse.  Return 1 to continue scan, 0 to stop.  */
@@ -62,10 +66,13 @@ struct htab
   /* Pointer to hash function.  */
   htab_hash hash_f;
 
-  /* Pointer to comparison function. */
+  /* Pointer to comparison function.  */
   htab_eq eq_f;
 
-  /* Table itself */
+  /* Pointer to cleanup function.  */
+  htab_del del_f;
+
+  /* Table itself.  */
   void **entries;
 
   /* Current size (in entries) of the hash table */
@@ -90,7 +97,8 @@ typedef struct htab *htab_t;
 
 /* The prototypes of the package functions. */
 
-extern htab_t  htab_create     PARAMS ((size_t, htab_hash, htab_eq));
+extern htab_t  htab_create     PARAMS ((size_t, htab_hash,
+                                        htab_eq, htab_del));
 extern void    htab_delete     PARAMS ((htab_t));
 extern void    htab_empty      PARAMS ((htab_t));
 
index c0f59a89716ef421606141362dc11523429f0ae2..a9d849c3970b961b3ac0eda0cf5a2d1034cf6d4c 100644 (file)
@@ -1,3 +1,9 @@
+2000-03-09  Zack Weinberg  <zack@wolery.cumb.org>
+
+       * hashtab.c (htab_create): Set del_f.
+       (htab_delete, htab_empty, htab_remove_elt, htab_clear_slot):
+       Use it.
+
 2000-03-08  Zack Weinberg  <zack@wolery.cumb.org>
 
        * hashtab.c: Remove debugging variables (all_searches,
index ea9f9d38ac760e63f973f63a2849aebbf593ffa8..0bc9e485ef0eb3092e3b42d04693b2b4d52ec4bc 100644 (file)
@@ -88,10 +88,11 @@ higher_prime_number (n)
    created hash table. */
 
 htab_t
-htab_create (size, hash_f, eq_f)
+htab_create (size, hash_f, eq_f, del_f)
      size_t size;
      htab_hash hash_f;
      htab_eq eq_f;
+     htab_del del_f;
 {
   htab_t result;
 
@@ -101,6 +102,7 @@ htab_create (size, hash_f, eq_f)
   result->size = size;
   result->hash_f = hash_f;
   result->eq_f = eq_f;
+  result->del_f = del_f;
   return result;
 }
 
@@ -111,6 +113,15 @@ void
 htab_delete (htab)
      htab_t htab;
 {
+  int i;
+  if (htab->del_f)
+    for (i = htab->size - 1; i >= 0; i--)
+      {
+       if (htab->entries[i] != EMPTY_ENTRY
+           && htab->entries[i] != DELETED_ENTRY)
+         (*htab->del_f) (htab->entries[i]);
+      }
+
   free (htab->entries);
   free (htab);
 }
@@ -121,6 +132,15 @@ void
 htab_empty (htab)
      htab_t htab;
 {
+  int i;
+  if (htab->del_f)
+    for (i = htab->size - 1; i >= 0; i--)
+      {
+       if (htab->entries[i] != EMPTY_ENTRY
+           && htab->entries[i] != DELETED_ENTRY)
+         (*htab->del_f) (htab->entries[i]);
+      }
+
   memset (htab->entries, 0, htab->size * sizeof (void *));
 }
 
@@ -273,6 +293,9 @@ htab_remove_elt (htab, element)
   if (*slot == EMPTY_ENTRY)
     return;
 
+  if (htab->del_f)
+    (*htab->del_f) (*slot);
+
   *slot = DELETED_ENTRY;
   htab->n_deleted++;
 }
@@ -289,6 +312,8 @@ htab_clear_slot (htab, slot)
   if (slot < htab->entries || slot >= htab->entries + htab->size
       || *slot == EMPTY_ENTRY || *slot == DELETED_ENTRY)
     abort ();
+  if (htab->del_f)
+    (*htab->del_f) (*slot);
   *slot = DELETED_ENTRY;
   htab->n_deleted++;
 }