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