This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: A more consistent naming scheme for libiberty/hashtab.c


On Wed, Mar 08, 2000 at 02:28:27PM -0800, Richard Henderson wrote:
> On Tue, Feb 29, 2000 at 11:23:25PM -0800, Zack Weinberg wrote:
> > This patch renames all the functions to consistent, _short_ names, and
> > tunes the expansion and lookup functions a bit.
> 
> Ok.

Thanks.

Here's an additional refinement: it adds a hook for deleting elements
from the hash table, so you don't have to worry about deallocating
them by hand.  If you don't need this, you can set it to NULL.

zw

	* 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.

===================================================================
Index: include/hashtab.h
--- include/hashtab.h	2000/03/08 23:44:29	1.3
+++ include/hashtab.h	2000/03/09 21:02:19
@@ -47,6 +47,10 @@ typedef unsigned int (*htab_hash) PARAMS
    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: libiberty/hashtab.c
--- libiberty/hashtab.c	2000/03/08 23:44:29	1.6
+++ libiberty/hashtab.c	2000/03/09 21:02:19
@@ -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++;
 }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]