Blame include/hashtab.h

Packit bbfece
/* An expandable hash tables datatype.  
Packit bbfece
   Copyright (C) 1999-2018 Free Software Foundation, Inc.
Packit bbfece
   Contributed by Vladimir Makarov (vmakarov@cygnus.com).
Packit bbfece
Packit bbfece
This program is free software; you can redistribute it and/or modify
Packit bbfece
it under the terms of the GNU General Public License as published by
Packit bbfece
the Free Software Foundation; either version 2 of the License, or
Packit bbfece
(at your option) any later version.
Packit bbfece
Packit bbfece
This program is distributed in the hope that it will be useful,
Packit bbfece
but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit bbfece
GNU General Public License for more details.
Packit bbfece
Packit bbfece
You should have received a copy of the GNU General Public License
Packit bbfece
along with this program; if not, write to the Free Software
Packit bbfece
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
Packit bbfece
Packit bbfece
/* This package implements basic hash table functionality.  It is possible
Packit bbfece
   to search for an entry, create an entry and destroy an entry.
Packit bbfece
Packit bbfece
   Elements in the table are generic pointers.
Packit bbfece
Packit bbfece
   The size of the table is not fixed; if the occupancy of the table
Packit bbfece
   grows too high the hash table will be expanded.
Packit bbfece
Packit bbfece
   The abstract data implementation is based on generalized Algorithm D
Packit bbfece
   from Knuth's book "The art of computer programming".  Hash table is
Packit bbfece
   expanded by creation of new hash table and transferring elements from
Packit bbfece
   the old table to the new table.  */
Packit bbfece
Packit bbfece
#ifndef __HASHTAB_H__
Packit bbfece
#define __HASHTAB_H__
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
extern "C" {
Packit bbfece
#endif /* __cplusplus */
Packit bbfece
Packit bbfece
#include "ansidecl.h"
Packit bbfece
Packit bbfece
/* The type for a hash code.  */
Packit bbfece
typedef unsigned int hashval_t;
Packit bbfece
Packit bbfece
/* Callback function pointer types.  */
Packit bbfece
Packit bbfece
/* Calculate hash of a table entry.  */
Packit bbfece
typedef hashval_t (*htab_hash) (const void *);
Packit bbfece
Packit bbfece
/* Compare a table entry with a possible entry.  The entry already in
Packit bbfece
   the table always comes first, so the second element can be of a
Packit bbfece
   different type (but in this case htab_find and htab_find_slot
Packit bbfece
   cannot be used; instead the variants that accept a hash value
Packit bbfece
   must be used).  */
Packit bbfece
typedef int (*htab_eq) (const void *, const void *);
Packit bbfece
Packit bbfece
/* Cleanup function called whenever a live element is removed from
Packit bbfece
   the hash table.  */
Packit bbfece
typedef void (*htab_del) (void *);
Packit bbfece
  
Packit bbfece
/* Function called by htab_traverse for each live element.  The first
Packit bbfece
   arg is the slot of the element (which can be passed to htab_clear_slot
Packit bbfece
   if desired), the second arg is the auxiliary pointer handed to
Packit bbfece
   htab_traverse.  Return 1 to continue scan, 0 to stop.  */
Packit bbfece
typedef int (*htab_trav) (void **, void *);
Packit bbfece
Packit bbfece
/* Memory-allocation function, with the same functionality as calloc().
Packit bbfece
   Iff it returns NULL, the hash table implementation will pass an error
Packit bbfece
   code back to the user, so if your code doesn't handle errors,
Packit bbfece
   best if you use xcalloc instead.  */
Packit bbfece
typedef void *(*htab_alloc) (size_t, size_t);
Packit bbfece
Packit bbfece
/* We also need a free() routine.  */
Packit bbfece
typedef void (*htab_free) (void *);
Packit bbfece
Packit bbfece
/* Memory allocation and deallocation; variants which take an extra
Packit bbfece
   argument.  */
Packit bbfece
typedef void *(*htab_alloc_with_arg) (void *, size_t, size_t);
Packit bbfece
typedef void (*htab_free_with_arg) (void *, void *);
Packit bbfece
Packit bbfece
/* This macro defines reserved value for empty table entry.  */
Packit bbfece
Packit bbfece
#define HTAB_EMPTY_ENTRY    ((PTR) 0)
Packit bbfece
Packit bbfece
/* This macro defines reserved value for table entry which contained
Packit bbfece
   a deleted element. */
Packit bbfece
Packit bbfece
#define HTAB_DELETED_ENTRY  ((PTR) 1)
Packit bbfece
Packit bbfece
/* Hash tables are of the following type.  The structure
Packit bbfece
   (implementation) of this type is not needed for using the hash
Packit bbfece
   tables.  All work with hash table should be executed only through
Packit bbfece
   functions mentioned below.  The size of this structure is subject to
Packit bbfece
   change.  */
Packit bbfece
Packit bbfece
struct htab {
Packit bbfece
  /* Pointer to hash function.  */
Packit bbfece
  htab_hash hash_f;
Packit bbfece
Packit bbfece
  /* Pointer to comparison function.  */
Packit bbfece
  htab_eq eq_f;
Packit bbfece
Packit bbfece
  /* Pointer to cleanup function.  */
Packit bbfece
  htab_del del_f;
Packit bbfece
Packit bbfece
  /* Table itself.  */
Packit bbfece
  void **entries;
Packit bbfece
Packit bbfece
  /* Current size (in entries) of the hash table.  */
Packit bbfece
  size_t size;
Packit bbfece
Packit bbfece
  /* Current number of elements including also deleted elements.  */
Packit bbfece
  size_t n_elements;
Packit bbfece
Packit bbfece
  /* Current number of deleted elements in the table.  */
Packit bbfece
  size_t n_deleted;
Packit bbfece
Packit bbfece
  /* The following member is used for debugging. Its value is number
Packit bbfece
     of all calls of `htab_find_slot' for the hash table. */
Packit bbfece
  unsigned int searches;
Packit bbfece
Packit bbfece
  /* The following member is used for debugging.  Its value is number
Packit bbfece
     of collisions fixed for time of work with the hash table. */
Packit bbfece
  unsigned int collisions;
Packit bbfece
Packit bbfece
  /* Pointers to allocate/free functions.  */
Packit bbfece
  htab_alloc alloc_f;
Packit bbfece
  htab_free free_f;
Packit bbfece
Packit bbfece
  /* Alternate allocate/free functions, which take an extra argument.  */
Packit bbfece
  void *alloc_arg;
Packit bbfece
  htab_alloc_with_arg alloc_with_arg_f;
Packit bbfece
  htab_free_with_arg free_with_arg_f;
Packit bbfece
Packit bbfece
  /* Current size (in entries) of the hash table, as an index into the
Packit bbfece
     table of primes.  */
Packit bbfece
  unsigned int size_prime_index;
Packit bbfece
};
Packit bbfece
Packit bbfece
typedef struct htab *htab_t;
Packit bbfece
Packit bbfece
/* An enum saying whether we insert into the hash table or not.  */
Packit bbfece
enum insert_option {NO_INSERT, INSERT};
Packit bbfece
Packit bbfece
/* The prototypes of the package functions. */
Packit bbfece
Packit bbfece
extern htab_t	htab_create_alloc  (size_t, htab_hash,
Packit bbfece
                                    htab_eq, htab_del,
Packit bbfece
                                    htab_alloc, htab_free);
Packit bbfece
Packit bbfece
extern htab_t	htab_create_alloc_ex (size_t, htab_hash,
Packit bbfece
                                      htab_eq, htab_del,
Packit bbfece
                                      void *, htab_alloc_with_arg,
Packit bbfece
                                      htab_free_with_arg);
Packit bbfece
Packit bbfece
extern htab_t  htab_create_typed_alloc (size_t, htab_hash, htab_eq, htab_del,
Packit bbfece
					htab_alloc, htab_alloc, htab_free);
Packit bbfece
Packit bbfece
/* Backward-compatibility functions.  */
Packit bbfece
extern htab_t htab_create (size_t, htab_hash, htab_eq, htab_del);
Packit bbfece
extern htab_t htab_try_create (size_t, htab_hash, htab_eq, htab_del);
Packit bbfece
Packit bbfece
extern void	htab_set_functions_ex (htab_t, htab_hash,
Packit bbfece
                                       htab_eq, htab_del,
Packit bbfece
                                       void *, htab_alloc_with_arg,
Packit bbfece
                                       htab_free_with_arg);
Packit bbfece
Packit bbfece
extern void	htab_delete (htab_t);
Packit bbfece
extern void	htab_empty (htab_t);
Packit bbfece
Packit bbfece
extern void *	htab_find (htab_t, const void *);
Packit bbfece
extern void **	htab_find_slot (htab_t, const void *, enum insert_option);
Packit bbfece
extern void *	htab_find_with_hash (htab_t, const void *, hashval_t);
Packit bbfece
extern void **	htab_find_slot_with_hash (htab_t, const void *,
Packit bbfece
					  hashval_t, enum insert_option);
Packit bbfece
extern void	htab_clear_slot	(htab_t, void **);
Packit bbfece
extern void	htab_remove_elt	(htab_t, void *);
Packit bbfece
extern void	htab_remove_elt_with_hash (htab_t, void *, hashval_t);
Packit bbfece
Packit bbfece
extern void	htab_traverse (htab_t, htab_trav, void *);
Packit bbfece
extern void	htab_traverse_noresize (htab_t, htab_trav, void *);
Packit bbfece
Packit bbfece
extern size_t	htab_size (htab_t);
Packit bbfece
extern size_t	htab_elements (htab_t);
Packit bbfece
extern double	htab_collisions	(htab_t);
Packit bbfece
Packit bbfece
/* A hash function for pointers.  */
Packit bbfece
extern htab_hash htab_hash_pointer;
Packit bbfece
Packit bbfece
/* An equality function for pointers.  */
Packit bbfece
extern htab_eq htab_eq_pointer;
Packit bbfece
Packit bbfece
/* A hash function for null-terminated strings.  */
Packit bbfece
extern hashval_t htab_hash_string (const void *);
Packit bbfece
Packit bbfece
/* An iterative hash function for arbitrary data.  */
Packit bbfece
extern hashval_t iterative_hash (const void *, size_t, hashval_t);
Packit bbfece
/* Shorthand for hashing something with an intrinsic size.  */
Packit bbfece
#define iterative_hash_object(OB,INIT) iterative_hash (&OB, sizeof (OB), INIT)
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
}
Packit bbfece
#endif /* __cplusplus */
Packit bbfece
Packit bbfece
#endif /* __HASHTAB_H */