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
32
ABC_NAMESPACE_HEADER_START
33
34
35
extern
int
Hash_DefaultHashFunc
(
int
key
,
int
nBins);
36
40
44
45
typedef
struct
Hash_Flt_t_
Hash_Flt_t
;
46
typedef
struct
Hash_Flt_Entry_t_
Hash_Flt_Entry_t
;
47
48
struct
Hash_Flt_Entry_t_
49
{
50
int
key
;
51
float
data
;
52
struct
Hash_Flt_Entry_t_
*
pNext
;
53
};
54
55
struct
Hash_Flt_t_
56
{
57
int
nSize
;
58
int
nBins
;
59
int (*
fHash
)(
int
key
,
int
nBins
);
60
Hash_Flt_Entry_t
**
pArray
;
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
88
static
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
115
static
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
148
static
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
191
static
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
235
static
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
275
static
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
312
static
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
337
ABC_NAMESPACE_HEADER_END
338
339
#endif
ABC_ALLOC
#define ABC_ALLOC(type, num)
Definition
abc_global.h:264
ABC_FREE
#define ABC_FREE(obj)
Definition
abc_global.h:267
ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_END
Definition
abc_namespaces.h:51
ABC_NAMESPACE_HEADER_START
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
Definition
abc_namespaces.h:50
p
Cube * p
Definition
exorList.c:222
extra.h
Hash_DefaultHashFunc
ABC_NAMESPACE_HEADER_START int Hash_DefaultHashFunc(int key, int nBins)
INCLUDES ///.
Definition
hash.h:57
Hash_Flt_t
struct Hash_Flt_t_ Hash_Flt_t
PARAMETERS ///.
Definition
hashFlt.h:45
Hash_Flt_Entry_t
struct Hash_Flt_Entry_t_ Hash_Flt_Entry_t
Definition
hashFlt.h:46
Hash_DefaultHashFunc
ABC_NAMESPACE_HEADER_START int Hash_DefaultHashFunc(int key, int nBins)
INCLUDES ///.
Definition
hash.h:57
key
enum keys key
Definition
main.h:25
Hash_Flt_Entry_t_
Definition
hashFlt.h:49
Hash_Flt_Entry_t_::data
float data
Definition
hashFlt.h:51
Hash_Flt_Entry_t_::pNext
struct Hash_Flt_Entry_t_ * pNext
Definition
hashFlt.h:52
Hash_Flt_Entry_t_::key
int key
Definition
hashFlt.h:50
Hash_Flt_t_
Definition
hashFlt.h:56
Hash_Flt_t_::nSize
int nSize
Definition
hashFlt.h:57
Hash_Flt_t_::nBins
int nBins
Definition
hashFlt.h:58
Hash_Flt_t_::fHash
int(* fHash)(int key, int nBins)
Definition
hashFlt.h:59
Hash_Flt_t_::pArray
Hash_Flt_Entry_t ** pArray
Definition
hashFlt.h:60
assert
#define assert(ex)
Definition
util_old.h:213
src
misc
hash
hashFlt.h
Generated by Doxygen 1.13.2 © 2025 EPTansuo. All rights reserved.
鲁ICP备2021046540号