]> git.ipfire.org Git - thirdparty/gcc.git/blame - include/hashtab.h
[Ada] Use new API when creating a special SPARK heap entity
[thirdparty/gcc.git] / include / hashtab.h
CommitLineData
a6ee63bb 1/* An expandable hash tables datatype.
8d9254fc 2 Copyright (C) 1999-2020 Free Software Foundation, Inc.
a6ee63bb
VM
3 Contributed by Vladimir Makarov (vmakarov@cygnus.com).
4
5This program is free software; you can redistribute it and/or modify
6it under the terms of the GNU General Public License as published by
7the Free Software Foundation; either version 2 of the License, or
8(at your option) any later version.
9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program; if not, write to the Free Software
d6d47ea0 17Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
a6ee63bb
VM
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
36extern "C" {
37#endif /* __cplusplus */
38
8ff82b06 39#include "ansidecl.h"
a6ee63bb 40
b13eb66b
MM
41/* The type for a hash code. */
42typedef unsigned int hashval_t;
43
5194cf08 44/* Callback function pointer types. */
a6ee63bb 45
5194cf08 46/* Calculate hash of a table entry. */
6da879de 47typedef hashval_t (*htab_hash) (const void *);
5194cf08
ZW
48
49/* Compare a table entry with a possible entry. The entry already in
8c5d513f
BS
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). */
6da879de 54typedef int (*htab_eq) (const void *, const void *);
5194cf08 55
5dc9cffd
ZW
56/* Cleanup function called whenever a live element is removed from
57 the hash table. */
6da879de 58typedef void (*htab_del) (void *);
5dc9cffd 59
5194cf08 60/* Function called by htab_traverse for each live element. The first
8c5d513f
BS
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. */
6da879de 64typedef int (*htab_trav) (void **, void *);
a6ee63bb 65
e2500fed
GK
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. */
8766be86 70typedef void *(*htab_alloc) (size_t, size_t);
e2500fed
GK
71
72/* We also need a free() routine. */
8766be86 73typedef void (*htab_free) (void *);
e2500fed 74
74828682
DJ
75/* Memory allocation and deallocation; variants which take an extra
76 argument. */
8766be86 77typedef void *(*htab_alloc_with_arg) (void *, size_t, size_t);
6da879de 78typedef void (*htab_free_with_arg) (void *, void *);
74828682 79
a3648cfc
DB
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
a6ee63bb
VM
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
74828682
DJ
92 functions mentioned below. The size of this structure is subject to
93 change. */
a6ee63bb 94
63f5d5b8 95struct htab {
5194cf08
ZW
96 /* Pointer to hash function. */
97 htab_hash hash_f;
98
5dc9cffd 99 /* Pointer to comparison function. */
5194cf08
ZW
100 htab_eq eq_f;
101
5dc9cffd
ZW
102 /* Pointer to cleanup function. */
103 htab_del del_f;
104
105 /* Table itself. */
63f5d5b8 106 void **entries;
5194cf08 107
228c46db 108 /* Current size (in entries) of the hash table. */
a6ee63bb 109 size_t size;
5194cf08 110
228c46db 111 /* Current number of elements including also deleted elements. */
5194cf08
ZW
112 size_t n_elements;
113
228c46db 114 /* Current number of deleted elements in the table. */
5194cf08
ZW
115 size_t n_deleted;
116
a6ee63bb 117 /* The following member is used for debugging. Its value is number
5194cf08
ZW
118 of all calls of `htab_find_slot' for the hash table. */
119 unsigned int searches;
120
a6ee63bb
VM
121 /* The following member is used for debugging. Its value is number
122 of collisions fixed for time of work with the hash table. */
5194cf08 123 unsigned int collisions;
917ccc05
DD
124
125 /* Pointers to allocate/free functions. */
126 htab_alloc alloc_f;
127 htab_free free_f;
74828682
DJ
128
129 /* Alternate allocate/free functions, which take an extra argument. */
63f5d5b8 130 void *alloc_arg;
74828682
DJ
131 htab_alloc_with_arg alloc_with_arg_f;
132 htab_free_with_arg free_with_arg_f;
228c46db
RH
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;
5194cf08 137};
a6ee63bb 138
5194cf08 139typedef struct htab *htab_t;
a6ee63bb 140
e38992e8
RK
141/* An enum saying whether we insert into the hash table or not. */
142enum insert_option {NO_INSERT, INSERT};
143
a6ee63bb
VM
144/* The prototypes of the package functions. */
145
6da879de
GDR
146extern htab_t htab_create_alloc (size_t, htab_hash,
147 htab_eq, htab_del,
148 htab_alloc, htab_free);
e2500fed 149
6da879de
GDR
150extern htab_t htab_create_alloc_ex (size_t, htab_hash,
151 htab_eq, htab_del,
8766be86 152 void *, htab_alloc_with_arg,
6da879de 153 htab_free_with_arg);
74828682 154
a9429e29
LB
155extern htab_t htab_create_typed_alloc (size_t, htab_hash, htab_eq, htab_del,
156 htab_alloc, htab_alloc, htab_free);
157
045b3a49 158/* Backward-compatibility functions. */
6da879de
GDR
159extern htab_t htab_create (size_t, htab_hash, htab_eq, htab_del);
160extern htab_t htab_try_create (size_t, htab_hash, htab_eq, htab_del);
161
162extern void htab_set_functions_ex (htab_t, htab_hash,
163 htab_eq, htab_del,
8766be86 164 void *, htab_alloc_with_arg,
6da879de
GDR
165 htab_free_with_arg);
166
167extern void htab_delete (htab_t);
168extern void htab_empty (htab_t);
169
8766be86
KG
170extern void * htab_find (htab_t, const void *);
171extern void ** htab_find_slot (htab_t, const void *, enum insert_option);
172extern void * htab_find_with_hash (htab_t, const void *, hashval_t);
173extern void ** htab_find_slot_with_hash (htab_t, const void *,
174 hashval_t, enum insert_option);
6da879de 175extern void htab_clear_slot (htab_t, void **);
5f44a434
AB
176extern void htab_remove_elt (htab_t, const void *);
177extern void htab_remove_elt_with_hash (htab_t, const void *, hashval_t);
6da879de
GDR
178
179extern void htab_traverse (htab_t, htab_trav, void *);
180extern void htab_traverse_noresize (htab_t, htab_trav, void *);
181
182extern size_t htab_size (htab_t);
183extern size_t htab_elements (htab_t);
184extern double htab_collisions (htab_t);
a6ee63bb 185
18a94a2f
MM
186/* A hash function for pointers. */
187extern htab_hash htab_hash_pointer;
188
189/* An equality function for pointers. */
190extern htab_eq htab_eq_pointer;
191
457f49df 192/* A hash function for null-terminated strings. */
8766be86 193extern hashval_t htab_hash_string (const void *);
457f49df 194
5cc5a0d0 195/* An iterative hash function for arbitrary data. */
8766be86 196extern hashval_t iterative_hash (const void *, size_t, hashval_t);
5cc5a0d0 197/* Shorthand for hashing something with an intrinsic size. */
9d70d418 198#define iterative_hash_object(OB,INIT) iterative_hash (&OB, sizeof (OB), INIT)
5cc5a0d0 199
a6ee63bb
VM
200#ifdef __cplusplus
201}
202#endif /* __cplusplus */
203
204#endif /* __HASHTAB_H */