ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
hashFlt.h
Go to the documentation of this file.
1
20
21#ifndef ABC__misc__hash__hashFlt_h
22#define ABC__misc__hash__hashFlt_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_Flt_t_ Hash_Flt_t;
47
49{
50 int key;
51 float 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_FltForEachEntry( 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_Flt_t * Hash_FltAlloc( int nBins )
89{
90 Hash_Flt_t * p;
91 int i;
92 assert(nBins > 0);
93 p = ABC_ALLOC( Hash_Flt_t, 1);
94 p->nBins = nBins;
95 p->fHash = Hash_DefaultHashFunc;
96 p->nSize = 0;
97 p->pArray = ABC_ALLOC( Hash_Flt_Entry_t *, nBins );
98 for(i=0; i<nBins; i++)
99 p->pArray[i] = NULL;
100
101 return p;
102}
103
115static inline int Hash_FltExists( Hash_Flt_t *p, int key )
116{
117 int bin;
118 Hash_Flt_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_FltWriteEntry( Hash_Flt_t *p, int key, float data )
149{
150 int bin;
151 Hash_Flt_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_Flt_Entry_t, 1 );
172 pEntry->pNext = NULL;
173 pEntry->key = key;
174 pEntry->data = data;
175
176 return;
177}
178
179
191static inline float Hash_FltEntry( Hash_Flt_t *p, int key, int fCreate )
192{
193 int bin;
194 Hash_Flt_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_Flt_Entry_t, 1 );
214 pEntry->pNext = NULL;
215 pEntry->key = key;
216 pEntry->data = 0.0;
217 return pEntry->data;
218 }
219
220 return 0.0;
221}
222
223
235static inline float* Hash_FltEntryPtr( Hash_Flt_t *p, int key )
236{
237 int bin;
238 Hash_Flt_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_Flt_Entry_t, 1 );
257 pEntry->pNext = NULL;
258 pEntry->key = key;
259 pEntry->data = 0.0;
260
261 return &(pEntry->data);
262}
263
275static inline void Hash_FltRemove( Hash_Flt_t *p, int key )
276{
277 int bin;
278 Hash_Flt_Entry_t *pEntry, **pLast;
279
280 // find the bin where this key would live
281 bin = (*(p->fHash))(key, p->nBins);
282
283 // search for key
284 pLast = &(p->pArray[bin]);
285 pEntry = p->pArray[bin];
286 while(pEntry) {
287 if (pEntry->key == key) {
288 p->nSize--;
289 *pLast = pEntry->pNext;
290 ABC_FREE( pEntry );
291 return;
292 }
293 pLast = &(pEntry->pNext);
294 pEntry = pEntry->pNext;
295 }
296
297 // could not find key
298 return;
299}
300
312static inline void Hash_FltFree( Hash_Flt_t *p ) {
313 int bin;
314 Hash_Flt_Entry_t *pEntry, *pTemp;
315
316 // free bins
317 for(bin = 0; bin < p->nBins; bin++) {
318 pEntry = p->pArray[bin];
319 while(pEntry) {
320 pTemp = pEntry;
321 pEntry = pEntry->pNext;
322 ABC_FREE( pTemp );
323 }
324 }
325
326 // free hash
327 ABC_FREE( p->pArray );
328 ABC_FREE( p );
329}
330
334
335
336
338
339#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_Flt_t_ Hash_Flt_t
PARAMETERS ///.
Definition hashFlt.h:45
struct Hash_Flt_Entry_t_ Hash_Flt_Entry_t
Definition hashFlt.h:46
ABC_NAMESPACE_HEADER_START int Hash_DefaultHashFunc(int key, int nBins)
INCLUDES ///.
Definition hash.h:57
enum keys key
Definition main.h:25
Definition hashFlt.h:49
float data
Definition hashFlt.h:51
struct Hash_Flt_Entry_t_ * pNext
Definition hashFlt.h:52
int key
Definition hashFlt.h:50
int nSize
Definition hashFlt.h:57
int nBins
Definition hashFlt.h:58
int(* fHash)(int key, int nBins)
Definition hashFlt.h:59
Hash_Flt_Entry_t ** pArray
Definition hashFlt.h:60
#define assert(ex)
Definition util_old.h:213