Imported Upstream version 0.155
[platform/upstream/elfutils.git] / lib / dynamicsizehash.h
1 /* Copyright (C) 2000-2010 Red Hat, Inc.
2    This file is part of elfutils.
3    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
4
5    This file is free software; you can redistribute it and/or modify
6    it under the terms of either
7
8      * the GNU Lesser General Public License as published by the Free
9        Software Foundation; either version 3 of the License, or (at
10        your option) any later version
11
12    or
13
14      * the GNU General Public License as published by the Free
15        Software Foundation; either version 2 of the License, or (at
16        your option) any later version
17
18    or both in parallel, as here.
19
20    elfutils is distributed in the hope that it will be useful, but
21    WITHOUT ANY WARRANTY; without even the implied warranty of
22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23    General Public License for more details.
24
25    You should have received copies of the GNU General Public License and
26    the GNU Lesser General Public License along with this program.  If
27    not, see <http://www.gnu.org/licenses/>.  */
28
29 #include <stddef.h>
30
31 /* Before including this file the following macros must be defined:
32
33    NAME      name of the hash table structure.
34    TYPE      data type of the hash table entries
35
36    The following macros if present select features:
37
38    ITERATE   iterating over the table entries is possible
39    HASHTYPE  integer type for hash values, default unsigned long int
40  */
41
42
43 /* Optionally include an entry pointing to the first used entry.  */
44 #ifdef ITERATE
45 # define FIRST(name)    name##_ent *first;
46 # define NEXT(name)     struct name##_ent *next;
47 #else
48 # define FIRST(name)
49 # define NEXT(name)
50 #endif
51
52 #ifndef HASHTYPE
53 # define HASHTYPE unsigned long int
54 #endif
55
56
57 /* Defined separately.  */
58 extern size_t next_prime (size_t seed);
59
60
61 /* Table entry type.  */
62 #define _DYNHASHENTTYPE(name) \
63   typedef struct name##_ent                                                   \
64   {                                                                           \
65     HASHTYPE hashval;                                                         \
66     TYPE data;                                                                \
67     NEXT (name)                                                               \
68   } name##_ent
69 #define DYNHASHENTTYPE(name) _DYNHASHENTTYPE (name)
70 DYNHASHENTTYPE (NAME);
71
72
73 /* Type of the dynamic hash table data structure.  */
74 #define _DYNHASHTYPE(name) \
75 typedef struct                                                                \
76 {                                                                             \
77   size_t size;                                                                \
78   size_t filled;                                                              \
79   name##_ent *table;                                                          \
80   FIRST (name)                                                                \
81 } name
82 #define DYNHASHTYPE(name) _DYNHASHTYPE (name)
83 DYNHASHTYPE (NAME);
84
85
86
87 #define _FUNCTIONS(name) \
88 /* Initialize the hash table.  */                                             \
89 extern int name##_init (name *htab, size_t init_size);                        \
90                                                                               \
91 /* Free resources allocated for hash table.  */                               \
92 extern int name##_free (name *htab);                                          \
93                                                                               \
94 /* Insert new entry.  */                                                      \
95 extern int name##_insert (name *htab, HASHTYPE hval, TYPE data);              \
96                                                                               \
97 /* Insert new entry, possibly overwrite old entry.  */                        \
98 extern int name##_overwrite (name *htab, HASHTYPE hval, TYPE data);           \
99                                                                               \
100 /* Find entry in hash table.  */                                              \
101 extern TYPE name##_find (name *htab, HASHTYPE hval, TYPE val);
102 #define FUNCTIONS(name) _FUNCTIONS (name)
103 FUNCTIONS (NAME)
104
105
106 #ifdef ITERATE
107 # define _XFUNCTIONS(name) \
108 /* Get next element in table.  */                                             \
109 extern TYPE name##_iterate (name *htab, void **ptr);
110 # define XFUNCTIONS(name) _XFUNCTIONS (name)
111 XFUNCTIONS (NAME)
112 #endif
113
114 #ifndef NO_UNDEF
115 # undef DYNHASHENTTYPE
116 # undef DYNHASHTYPE
117 # undef FUNCTIONS
118 # undef _FUNCTIONS
119 # undef XFUNCTIONS
120 # undef _XFUNCTIONS
121 # undef NAME
122 # undef TYPE
123 # undef ITERATE
124 # undef COMPARE
125 # undef FIRST
126 # undef NEXT
127 #endif