ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
hashInt.h
Go to the documentation of this file.
1
20
21#ifndef ABC__misc__hash__hashInt_h
22#define ABC__misc__hash__hashInt_h
23
24
28
29#include <stdio.h>
30#include "misc/extra/extra.h"
31
33
34
35extern int Hash_DefaultHashFunc(int key, int nBins);
36
40
44
45typedef struct Hash_Int_t_ Hash_Int_t;
47
49{
50 int key;
51 int data;
53};
54
56{
57 int nSize;
58 int nBins;
59 int (* fHash)(int key, int nBins);
61};
62
63
64
68
69#define Hash_IntForEachEntry( pHash, pEntry, bin) \
70 for(bin=-1, pEntry=NULL; bin < pHash->nBins; (!pEntry)?(pEntry=pHash->pArray[++bin]):(pEntry=pEntry->pNext)) \
71 if (pEntry)
72
76
88static inline Hash_Int_t * Hash_IntAlloc( int nBins )
89{
90 Hash_Int_t * p;
91 int i;
92 assert(nBins > 0);
93 p = ABC_ALLOC( Hash_Int_t, 1);
94 p->nBins = nBins;
95 p->fHash = Hash_DefaultHashFunc;
96 p->nSize = 0;
97 p->pArray = ABC_ALLOC( Hash_Int_Entry_t *, nBins+1 );
98 for(i=0; i<nBins; i++)
99 p->pArray[i] = NULL;
100
101 return p;
102}
103
115static inline int Hash_IntExists( Hash_Int_t *p, int key)
116{
117 int bin;
118 Hash_Int_Entry_t *pEntry, **pLast;
119
120 // find the bin where this key would live
121 bin = (*(p->fHash))(key, p->nBins);
122
123 // search for key
124 pLast = &(p->pArray[bin]);
125 pEntry = p->pArray[bin];
126 while(pEntry) {
127 if (pEntry->key == key) {
128 return 1;
129 }
130 pLast = &(pEntry->pNext);
131 pEntry = pEntry->pNext;
132 }
133
134 return 0;
135}
136
148static inline void Hash_IntWriteEntry( Hash_Int_t *p, int key, int data )
149{
150 int bin;
151 Hash_Int_Entry_t *pEntry, **pLast;
152
153 // find the bin where this key would live
154 bin = (*(p->fHash))(key, p->nBins);
155
156 // search for key
157 pLast = &(p->pArray[bin]);
158 pEntry = p->pArray[bin];
159 while(pEntry) {
160 if (pEntry->key == key) {
161 pEntry->data = data;
162 return;
163 }
164 pLast = &(pEntry->pNext);
165 pEntry = pEntry->pNext;
166 }
167
168 // this key does not currently exist
169 // create a new entry and add to bin
170 p->nSize++;
171 (*pLast) = pEntry = ABC_ALLOC( Hash_Int_Entry_t, 1 );
172 pEntry->pNext = NULL;
173 pEntry->key = key;
174 pEntry->data = data;
175
176 return;
177}
178
179
191static inline int Hash_IntEntry( Hash_Int_t *p, int key, int fCreate )
192{
193 int bin;
194 Hash_Int_Entry_t *pEntry, **pLast;
195
196 // find the bin where this key would live
197 bin = (*(p->fHash))(key, p->nBins);
198
199 // search for key
200 pLast = &(p->pArray[bin]);
201 pEntry = p->pArray[bin];
202 while(pEntry) {
203 if (pEntry->key == key)
204 return pEntry->data;
205 pLast = &(pEntry->pNext);
206 pEntry = pEntry->pNext;
207 }
208
209 // this key does not currently exist
210 if (fCreate) {
211 // create a new entry and add to bin
212 p->nSize++;
213 (*pLast) = pEntry = ABC_ALLOC( Hash_Int_Entry_t, 1 );
214 pEntry->pNext = NULL;
215 pEntry->key = key;
216 pEntry->data = 0;
217 return pEntry->data;
218 }
219
220 return 0;
221}
222
223
235static inline int* Hash_IntEntryPtr( Hash_Int_t *p, int key )
236{
237 int bin;
238 Hash_Int_Entry_t *pEntry, **pLast;
239
240 // find the bin where this key would live
241 bin = (*(p->fHash))(key, p->nBins);
242
243 // search for key
244 pLast = &(p->pArray[bin]);
245 pEntry = p->pArray[bin];
246 while(pEntry) {
247 if (pEntry->key == key)
248 return &(pEntry->data);
249 pLast = &(pEntry->pNext);
250 pEntry = pEntry->pNext;
251 }
252
253 // this key does not currently exist
254 // create a new entry and add to bin
255 p->nSize++;
256 (*pLast) = pEntry = ABC_ALLOC( Hash_Int_Entry_t, 1 );
257 pEntry->pNext = NULL;
258 pEntry->key = key;
259 pEntry->data = 0;
260
261 return &(pEntry->data);
262}
263
275static inline void Hash_IntFree( Hash_Int_t *p ) {
276 int bin;
277 Hash_Int_Entry_t *pEntry, *pTemp;
278
279 // free bins
280 for(bin = 0; bin < p->nBins; bin++) {
281 pEntry = p->pArray[bin];
282 while(pEntry) {
283 pTemp = pEntry;
284 pEntry = pEntry->pNext;
285 ABC_FREE( pTemp );
286 }
287 }
288
289 // free hash
290 ABC_FREE( p->pArray );
291 ABC_FREE( p );
292}
293
297
298
299
301
302#endif
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
Cube * p
Definition exorList.c:222
ABC_NAMESPACE_HEADER_START int Hash_DefaultHashFunc(int key, int nBins)
INCLUDES ///.
Definition hash.h:57
struct Hash_Int_Entry_t_ Hash_Int_Entry_t
Definition hashInt.h:46
struct Hash_Int_t_ Hash_Int_t
PARAMETERS ///.
Definition hashInt.h:45
ABC_NAMESPACE_HEADER_START int Hash_DefaultHashFunc(int key, int nBins)
INCLUDES ///.
Definition hash.h:57
enum keys key
Definition main.h:25
Definition hashInt.h:49
struct Hash_Int_Entry_t_ * pNext
Definition hashInt.h:52
int key
Definition hashInt.h:50
int data
Definition hashInt.h:51
int(* fHash)(int key, int nBins)
Definition hashInt.h:59
int nSize
Definition hashInt.h:57
int nBins
Definition hashInt.h:58
Hash_Int_Entry_t ** pArray
Definition hashInt.h:60
#define assert(ex)
Definition util_old.h:213