Subversion Repositories Kolibri OS

Rev

Rev 5191 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5191 serge 1
/* An expandable hash tables datatype.
6324 serge 2
   Copyright (C) 1999-2015 Free Software Foundation, Inc.
5191 serge 3
   Contributed by Vladimir Makarov (vmakarov@cygnus.com).
4
 
5
This program is free software; you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation; either version 2 of the License, or
8
(at your option) any later version.
9
 
10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
GNU General Public License for more details.
14
 
15
You should have received a copy of the GNU General Public License
16
along with this program; if not, write to the Free Software
17
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
18
 
19
/* This package implements basic hash table functionality.  It is possible
20
   to search for an entry, create an entry and destroy an entry.
21
 
22
   Elements in the table are generic pointers.
23
 
24
   The size of the table is not fixed; if the occupancy of the table
25
   grows too high the hash table will be expanded.
26
 
27
   The abstract data implementation is based on generalized Algorithm D
28
   from Knuth's book "The art of computer programming".  Hash table is
29
   expanded by creation of new hash table and transferring elements from
30
   the old table to the new table.  */
31
 
32
#ifndef __HASHTAB_H__
33
#define __HASHTAB_H__
34
 
35
#ifdef __cplusplus
36
extern "C" {
37
#endif /* __cplusplus */
38
 
39
#include "ansidecl.h"
40
 
41
/* The type for a hash code.  */
42
typedef unsigned int hashval_t;
43
 
44
/* Callback function pointer types.  */
45
 
46
/* Calculate hash of a table entry.  */
47
typedef hashval_t (*htab_hash) (const void *);
48
 
49
/* Compare a table entry with a possible entry.  The entry already in
50
   the table always comes first, so the second element can be of a
51
   different type (but in this case htab_find and htab_find_slot
52
   cannot be used; instead the variants that accept a hash value
53
   must be used).  */
54
typedef int (*htab_eq) (const void *, const void *);
55
 
56
/* Cleanup function called whenever a live element is removed from
57
   the hash table.  */
58
typedef void (*htab_del) (void *);
59
 
60
/* Function called by htab_traverse for each live element.  The first
61
   arg is the slot of the element (which can be passed to htab_clear_slot
62
   if desired), the second arg is the auxiliary pointer handed to
63
   htab_traverse.  Return 1 to continue scan, 0 to stop.  */
64
typedef int (*htab_trav) (void **, void *);
65
 
66
/* Memory-allocation function, with the same functionality as calloc().
67
   Iff it returns NULL, the hash table implementation will pass an error
68
   code back to the user, so if your code doesn't handle errors,
69
   best if you use xcalloc instead.  */
70
typedef void *(*htab_alloc) (size_t, size_t);
71
 
72
/* We also need a free() routine.  */
73
typedef void (*htab_free) (void *);
74
 
75
/* Memory allocation and deallocation; variants which take an extra
76
   argument.  */
77
typedef void *(*htab_alloc_with_arg) (void *, size_t, size_t);
78
typedef void (*htab_free_with_arg) (void *, void *);
79
 
80
/* This macro defines reserved value for empty table entry.  */
81
 
82
#define HTAB_EMPTY_ENTRY    ((PTR) 0)
83
 
84
/* This macro defines reserved value for table entry which contained
85
   a deleted element. */
86
 
87
#define HTAB_DELETED_ENTRY  ((PTR) 1)
88
 
89
/* Hash tables are of the following type.  The structure
90
   (implementation) of this type is not needed for using the hash
91
   tables.  All work with hash table should be executed only through
92
   functions mentioned below.  The size of this structure is subject to
93
   change.  */
94
 
6324 serge 95
struct htab {
5191 serge 96
  /* Pointer to hash function.  */
97
  htab_hash hash_f;
98
 
99
  /* Pointer to comparison function.  */
100
  htab_eq eq_f;
101
 
102
  /* Pointer to cleanup function.  */
103
  htab_del del_f;
104
 
105
  /* Table itself.  */
6324 serge 106
  void **entries;
5191 serge 107
 
108
  /* Current size (in entries) of the hash table.  */
109
  size_t size;
110
 
111
  /* Current number of elements including also deleted elements.  */
112
  size_t n_elements;
113
 
114
  /* Current number of deleted elements in the table.  */
115
  size_t n_deleted;
116
 
117
  /* The following member is used for debugging. Its value is number
118
     of all calls of `htab_find_slot' for the hash table. */
119
  unsigned int searches;
120
 
121
  /* The following member is used for debugging.  Its value is number
122
     of collisions fixed for time of work with the hash table. */
123
  unsigned int collisions;
124
 
125
  /* Pointers to allocate/free functions.  */
126
  htab_alloc alloc_f;
127
  htab_free free_f;
128
 
129
  /* Alternate allocate/free functions, which take an extra argument.  */
6324 serge 130
  void *alloc_arg;
5191 serge 131
  htab_alloc_with_arg alloc_with_arg_f;
132
  htab_free_with_arg free_with_arg_f;
133
 
134
  /* Current size (in entries) of the hash table, as an index into the
135
     table of primes.  */
136
  unsigned int size_prime_index;
137
};
138
 
139
typedef struct htab *htab_t;
140
 
141
/* An enum saying whether we insert into the hash table or not.  */
142
enum insert_option {NO_INSERT, INSERT};
143
 
144
/* The prototypes of the package functions. */
145
 
146
extern htab_t	htab_create_alloc  (size_t, htab_hash,
147
                                    htab_eq, htab_del,
148
                                    htab_alloc, htab_free);
149
 
150
extern htab_t	htab_create_alloc_ex (size_t, htab_hash,
151
                                      htab_eq, htab_del,
152
                                      void *, htab_alloc_with_arg,
153
                                      htab_free_with_arg);
154
 
155
extern htab_t  htab_create_typed_alloc (size_t, htab_hash, htab_eq, htab_del,
156
					htab_alloc, htab_alloc, htab_free);
157
 
158
/* Backward-compatibility functions.  */
159
extern htab_t htab_create (size_t, htab_hash, htab_eq, htab_del);
160
extern htab_t htab_try_create (size_t, htab_hash, htab_eq, htab_del);
161
 
162
extern void	htab_set_functions_ex (htab_t, htab_hash,
163
                                       htab_eq, htab_del,
164
                                       void *, htab_alloc_with_arg,
165
                                       htab_free_with_arg);
166
 
167
extern void	htab_delete (htab_t);
168
extern void	htab_empty (htab_t);
169
 
170
extern void *	htab_find (htab_t, const void *);
171
extern void **	htab_find_slot (htab_t, const void *, enum insert_option);
172
extern void *	htab_find_with_hash (htab_t, const void *, hashval_t);
173
extern void **	htab_find_slot_with_hash (htab_t, const void *,
174
					  hashval_t, enum insert_option);
175
extern void	htab_clear_slot	(htab_t, void **);
176
extern void	htab_remove_elt	(htab_t, void *);
177
extern void	htab_remove_elt_with_hash (htab_t, void *, hashval_t);
178
 
179
extern void	htab_traverse (htab_t, htab_trav, void *);
180
extern void	htab_traverse_noresize (htab_t, htab_trav, void *);
181
 
182
extern size_t	htab_size (htab_t);
183
extern size_t	htab_elements (htab_t);
184
extern double	htab_collisions	(htab_t);
185
 
186
/* A hash function for pointers.  */
187
extern htab_hash htab_hash_pointer;
188
 
189
/* An equality function for pointers.  */
190
extern htab_eq htab_eq_pointer;
191
 
192
/* A hash function for null-terminated strings.  */
193
extern hashval_t htab_hash_string (const void *);
194
 
195
/* An iterative hash function for arbitrary data.  */
196
extern hashval_t iterative_hash (const void *, size_t, hashval_t);
197
/* Shorthand for hashing something with an intrinsic size.  */
198
#define iterative_hash_object(OB,INIT) iterative_hash (&OB, sizeof (OB), INIT)
199
 
200
#ifdef __cplusplus
201
}
202
#endif /* __cplusplus */
203
 
204
#endif /* __HASHTAB_H */