SystemC 3.0.0
Accellera SystemC proof-of-concept library
sc_hash.h
Go to the documentation of this file.
1/*****************************************************************************
2
3 Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
4 more contributor license agreements. See the NOTICE file distributed
5 with this work for additional information regarding copyright ownership.
6 Accellera licenses this file to you under the Apache License, Version 2.0
7 (the "License"); you may not use this file except in compliance with the
8 License. You may obtain a copy of the License at
9
10 http://www.apache.org/licenses/LICENSE-2.0
11
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15 implied. See the License for the specific language governing
16 permissions and limitations under the License.
17
18 *****************************************************************************/
19
20/*****************************************************************************
21
22 sc_hash.cpp -- Implementation of a chained hash table with MTF
23 (move-to-front).
24
25 Original Author: Stan Y. Liao, Synopsys, Inc.
26
27 CHANGE LOG AT END OF FILE
28 *****************************************************************************/
29
30#ifndef SC_HASH_H
31#define SC_HASH_H
32
34
35namespace sc_core {
36
37extern SC_API unsigned default_int_hash_fn(const void*);
38extern SC_API unsigned default_ptr_hash_fn(const void*);
39extern SC_API unsigned default_str_hash_fn(const void*);
40
41class sc_phash_elem;
43template<class K, class C> //template class
44class sc_pdhash_iter; //decl. -- Amit
45
48extern SC_API const double PHASH_DEFAULT_GROW_FACTOR;
50
52 friend class sc_phash_base_iter;
53
55
56public:
57 typedef unsigned (*hash_fn_t)(const void*);
58 typedef int (*cmpr_fn_t)(const void*, const void*);
59
60protected:
67
68 sc_phash_elem** bins;
69
70 hash_fn_t hash;
71 cmpr_fn_t cmpr;
72
73 void rehash();
74 unsigned do_hash(const void* key) const { return (*hash)(key) % num_bins; }
75
76 sc_phash_elem* add_direct(void* key, void* contents, unsigned hash_val);
77 sc_phash_elem* find_entry_c(unsigned hv, const void* k, sc_phash_elem*** plast);
78 sc_phash_elem* find_entry_q(unsigned hv, const void* k, sc_phash_elem*** plast);
79 sc_phash_elem* find_entry(unsigned hv, const void* k, sc_phash_elem*** plast=0) const
80 {
81 /* Got rid of member func. pointer and replaced with if-else */
82 /* Amit (5/14/99) */
83 if( cmpr == 0 )
84 return ((sc_phash_base*)this)->find_entry_q( hv, k, plast );
85 else
86 return ((sc_phash_base*)this)->find_entry_c( hv, k, plast );
87 }
88
89public:
90 sc_phash_base( void* def = 0,
92 int density = PHASH_DEFAULT_MAX_DENSITY,
93 double grow = PHASH_DEFAULT_GROW_FACTOR,
94 bool reorder = PHASH_DEFAULT_REORDER_FLAG,
95 hash_fn_t hash_fn = default_ptr_hash_fn,
96 cmpr_fn_t cmpr_fn = 0 );
98
99 void set_cmpr_fn(cmpr_fn_t);
100 void set_hash_fn(hash_fn_t);
101
102 bool empty() const { return (num_entries == 0); }
103 unsigned count() const { return num_entries; }
104
105 void erase();
106 void erase(void (*kfree)(void*));
107 void copy( const sc_phash_base* );
108 void copy( const sc_phash_base& b ) { copy(&b); }
109 void copy( const sc_phash_base& b, void* (*kdup)(const void*), void (*kfree)(void*));
110 int insert( void* k, void* c );
111 int insert( void* k ) { return insert(k, default_value); }
112 int insert( void* k, void* c, void* (*kdup)(const void*) );
113 int insert_if_not_exists(void* k, void* c);
114 int insert_if_not_exists(void* k) { return insert_if_not_exists(k, default_value); }
115 int insert_if_not_exists(void* k, void* c, void* (*kdup)(const void*));
116 int remove(const void* k);
117 int remove(const void* k, void** pk, void** pc);
118 int remove(const void* k, void (*kfree)(void*));
119 int remove_by_contents(const void* c);
120 int remove_by_contents(bool (*predicate)(const void*, void*), void* arg);
121 int remove_by_contents(const void* c, void (*kfree)(void*));
122 int remove_by_contents(bool (*predicate)(const void*, void*), void* arg, void (*kfree)(void*));
123 int lookup(const void* k, void** pc) const;
124 bool contains(const void* k) const { return (lookup(k, 0) != 0); }
125 void* operator[](const void* key) const;
126};
127
129protected:
131 sc_phash_elem* entry;
132 sc_phash_elem* next;
133 sc_phash_elem** last;
134 int index;
135
136public:
138 void reset(sc_phash_base& t) { reset(&t); }
139
141 : table(t), entry(0), next(0), last(0), index(0)
142 { reset(t); }
144 : table(&t), entry(0), next(0), last(0), index(0)
145 { reset(t); }
147
148 bool empty() const;
149 void step();
150 void operator++(int) { step(); }
151 void remove();
152 void remove(void (*kfree)(void*));
153 void* key() const;
154 void* contents() const;
155 void* set_contents(void* c);
156};
157
158template< class K, class C >
159class sc_phash_iter;
160
161template< class K, class C >
162class sc_phash : public sc_phash_base {
163 friend class sc_phash_iter<K,C>;
164
165public:
167
168 sc_phash( C def = (C) 0,
170 int density = PHASH_DEFAULT_MAX_DENSITY,
171 double grow = PHASH_DEFAULT_GROW_FACTOR,
172 bool reorder = PHASH_DEFAULT_REORDER_FLAG,
174 cmpr_fn_t cmpr_fn = 0 )
175 : sc_phash_base((void*) def, size, density, grow, reorder, hash_fn, cmpr_fn) { }
177
180 void copy(const sc_phash<K,C>& b, void* (*kdup)(const void*), void (*kfree)(void*)) { sc_phash_base::copy(b, kdup, kfree); }
181
182 int insert(K k, C c) { return sc_phash_base::insert((void*) k, (void*) c); }
183 int insert(K k) { return sc_phash_base::insert((void*) k, default_value); }
184 int insert(K k, C c, void* (*kdup)(const void*)) { return sc_phash_base::insert((void*) k, (void*) c, kdup); }
186 {
187 return sc_phash_base::insert_if_not_exists((void*) k, (void*) c);
188 }
190 {
192 }
193 int insert_if_not_exists(K k, C c, void* (*kdup)(const void*))
194 {
195 return sc_phash_base::insert_if_not_exists((void*) k, (void*) c, kdup);
196 }
197 int remove(K k) { return sc_phash_base::remove((const void*) k); }
198 int remove(K k, K* pk, C* pc)
199 {
200 return sc_phash_base::remove((const void*) k, (void**) pk, (void**) pc);
201 }
202 int remove(K k, void (*kfree)(void*))
203 {
204 return sc_phash_base::remove((const void*) k, kfree);
205 }
207 {
208 return sc_phash_base::remove_by_contents((const void*) c);
209 }
210 int remove_by_contents(bool (*predicate)(const void*, void*), void* arg)
211 {
212 return sc_phash_base::remove_by_contents(predicate, arg);
213 }
214 int remove_by_contents(const void* c, void (*kfree)(void*))
215 {
216 return sc_phash_base::remove_by_contents(c, kfree);
217 }
218 int remove_by_contents(bool (*predicate)(const void*, void*), void* arg, void (*kfree)(void*))
219 {
220 return sc_phash_base::remove_by_contents(predicate, arg, kfree);
221 }
222 int lookup(K k, C* pc) const
223 {
224 return sc_phash_base::lookup((const void*) k, (void**) pc);
225 }
226 bool contains(K k) const
227 {
228 return sc_phash_base::contains((const void*) k);
229 }
230 C operator[](K k) const
231 {
232 return (C) sc_phash_base::operator[]((const void*) k);
233 }
234};
235
236
237template< class K, class C >
239public:
243
246
247 K key() const { return (K) sc_phash_base_iter::key(); }
248 C contents() const { return (C) sc_phash_base_iter::contents(); }
250 {
251 return (C) sc_phash_base_iter::set_contents((void*) c);
252 }
253};
254
255
256
257
258
259template< class K, class C >
260class sc_pdhash : public sc_phash_base {
261 friend class sc_pdhash_iter<K,C>;
262
263private:
264 void* (*kdup)(const void*); //eliminated braces around void* -- Amit
265 void (*kfree)(void*);
266
267public:
269 sc_pdhash( C def = (C) 0,
271 int density = PHASH_DEFAULT_MAX_DENSITY,
272 double grow = PHASH_DEFAULT_GROW_FACTOR,
273 bool reorder = PHASH_DEFAULT_REORDER_FLAG,
274 hash_fn_t hash_fn = (hash_fn_t) 0, // defaults added --
275 cmpr_fn_t cmpr_fn = (cmpr_fn_t) 0, // Amit
276 void* (*kdup_fn)(const void*) = 0,
277 void (*kfree_fn)(void*) = 0 )
278 : sc_phash_base((void*) def, size, density, grow, reorder, hash_fn, cmpr_fn)
279 {
280 kdup = kdup_fn;
281 kfree = kfree_fn;
282 }
284 {
285 erase();
286 }
287 void erase()
288 {
290 }
291 void copy(const sc_pdhash<K,C>& b) { sc_phash_base::copy(b, kdup, kfree); }
292 int insert(K k, C c) { return sc_phash_base::insert((void*) k, (void*) c, kdup); }
293 int insert(K k) { return sc_phash_base::insert((void*) k, default_value, kdup); }
295 {
296 return sc_phash_base::insert_if_not_exists((void*) k, (void*) c, kdup);
297 }
299 {
300 return sc_phash_base::insert_if_not_exists((void*) k, default_value, kdup);
301 }
302 int remove(K k) { return sc_phash_base::remove((const void*) k, kfree); }
303 int remove(K k, K* pk, C* pc)
304 {
305 return sc_phash_base::remove((const void*) k, (void**) pk, (void**) pc);
306 }
308 {
309 return sc_phash_base::remove_by_contents((const void*) c, kfree);
310 }
311 int remove_by_contents(bool (*predicate)(const void*, void*), void* arg)
312 {
313 return sc_phash_base::remove_by_contents(predicate, arg, kfree);
314 }
315 int lookup(K k, C* pc) const
316 {
317 return sc_phash_base::lookup((const void*) k, (void**) pc);
318 }
319 bool contains(K k) const
320 {
321 return sc_phash_base::contains((const void*) k);
322 }
323 C operator[](K k) const
324 {
325 return (C) sc_phash_base::operator[]((const void*) k);
326 }
327};
328
329template< class K, class C >
331public:
335
338
340 K key() const { return (K) sc_phash_base_iter::key(); }
341 C contents() const { return (C) sc_phash_base_iter::contents(); }
343 {
344 return (C) sc_phash_base_iter::set_contents((void*) c);
345 }
346};
347
348extern SC_API int sc_strhash_cmp( const void*, const void* );
349extern SC_API void sc_strhash_kfree(void*);
350extern SC_API void* sc_strhash_kdup(const void*);
351
352template< class C > // template class decl.
353class sc_strhash_iter; // --Amit
354
355template< class C >
356class sc_strhash : public sc_phash_base {
357 friend class sc_strhash_iter<C>;
358
359public:
361
362 sc_strhash( C def = (C) 0,
364 int density = PHASH_DEFAULT_MAX_DENSITY,
365 double grow = PHASH_DEFAULT_GROW_FACTOR,
366 bool reorder = PHASH_DEFAULT_REORDER_FLAG,
367 unsigned (*hash_fn)(const void*) = default_str_hash_fn,
368 int (*cmpr_fn)(const void*, const void*) = sc_strhash_cmp )
369 : sc_phash_base((void*) def, size, density, grow, reorder, hash_fn, cmpr_fn)
370 {
371
372 }
374 {
375 erase();
376 }
377
381
382 int insert(char* k, C c) { return sc_phash_base::insert((void*) k, (void*) c, sc_strhash_kdup); }
383 int insert(char* k) { return sc_phash_base::insert((void*) k, default_value, sc_strhash_kdup); }
384 int insert_if_not_exists(char* k, C c)
385 {
386 return sc_phash_base::insert_if_not_exists((void*) k, (void*) c, sc_strhash_kdup);
387 }
389 {
391 }
392 int remove(const char* k) { return sc_phash_base::remove((const void*) k, sc_strhash_kfree); }
393 int remove(const char* k, char** pk, C* pc)
394 {
395 return sc_phash_base::remove((const void*) k, (void**) pk, (void**) pc);
396 }
398 {
400 }
401 int remove_by_contents(bool (*predicate)(const void*, void*), void* arg)
402 {
404 }
405 int lookup(const char* k, C* pc) const
406 {
407 return sc_phash_base::lookup((const void*) k, (void** )pc);
408 }
409 bool contains(const char* k) const
410 {
411 return sc_phash_base::contains((const void*) k);
412 }
413 C operator[](const char* k) const
414 {
415 return (C) sc_phash_base::operator[]((const void*) k);
416 }
417};
418
419template<class C>
421public:
425
428
430 const char* key() { return (const char*) sc_phash_base_iter::key(); }
433 {
434 return (C) sc_phash_base_iter::set_contents((void*) c);
435 }
436};
437
438} // namespace sc_core
439
440// $Log: sc_hash.h,v $
441// Revision 1.5 2011/08/29 18:04:32 acg
442// Philipp A. Hartmann: miscellaneous clean ups.
443//
444// Revision 1.4 2011/08/26 20:46:16 acg
445// Andy Goodrich: moved the modification log to the end of the file to
446// eliminate source line number skew when check-ins are done.
447//
448// Revision 1.3 2011/08/24 22:05:56 acg
449// Torsten Maehne: initialization changes to remove warnings.
450//
451// Revision 1.2 2011/02/18 20:38:43 acg
452// Andy Goodrich: Updated Copyright notice.
453//
454// Revision 1.1.1.1 2006/12/15 20:20:06 acg
455// SystemC 2.3
456//
457// Revision 1.3 2006/01/13 18:53:10 acg
458// Andy Goodrich: Added $Log command so that CVS comments are reproduced in
459// the source.
460
461#endif
#define SC_API
Definition: sc_cmnhdr.h:148
const int PHASH_DEFAULT_MAX_DENSITY
Definition: sc_hash.h:46
SC_API unsigned default_int_hash_fn(const void *)
const int PHASH_DEFAULT_INIT_TABLE_SIZE
Definition: sc_hash.h:47
SC_API unsigned default_ptr_hash_fn(const void *)
SC_API void * sc_strhash_kdup(const void *)
SC_API unsigned default_str_hash_fn(const void *)
SC_API const double PHASH_DEFAULT_GROW_FACTOR
SC_API int sc_strhash_cmp(const void *, const void *)
SC_API void sc_strhash_kfree(void *)
const bool PHASH_DEFAULT_REORDER_FLAG
Definition: sc_hash.h:49
uint64 const sc_uint_base int b
Definition: sc_fxval.h:955
void reset(sc_pdhash< K, C > &t)
Definition: sc_hash.h:337
sc_pdhash_iter(sc_pdhash< K, C > &t)
Definition: sc_hash.h:333
void reset(sc_pdhash< K, C > *t)
Definition: sc_hash.h:336
sc_pdhash_iter(sc_pdhash< K, C > *t)
Definition: sc_hash.h:332
int insert(void *k, void *c)
void copy(const sc_phash_base &b)
Definition: sc_hash.h:108
int remove_by_contents(bool(*predicate)(const void *, void *), void *arg)
sc_phash_base(void *def=0, int size=PHASH_DEFAULT_INIT_TABLE_SIZE, int density=PHASH_DEFAULT_MAX_DENSITY, double grow=PHASH_DEFAULT_GROW_FACTOR, bool reorder=PHASH_DEFAULT_REORDER_FLAG, hash_fn_t hash_fn=default_ptr_hash_fn, cmpr_fn_t cmpr_fn=0)
sc_phash_elem * add_direct(void *key, void *contents, unsigned hash_val)
int remove(const void *k)
bool empty() const
Definition: sc_hash.h:102
unsigned(* hash_fn_t)(const void *)
Definition: sc_hash.h:57
int lookup(const void *k, void **pc) const
void copy(const sc_phash_base &b, void *(*kdup)(const void *), void(*kfree)(void *))
void * operator[](const void *key) const
int insert(void *k, void *c, void *(*kdup)(const void *))
sc_phash_elem * find_entry(unsigned hv, const void *k, sc_phash_elem ***plast=0) const
Definition: sc_hash.h:79
sc_phash_elem * find_entry_q(unsigned hv, const void *k, sc_phash_elem ***plast)
bool contains(const void *k) const
Definition: sc_hash.h:124
void set_cmpr_fn(cmpr_fn_t)
unsigned do_hash(const void *key) const
Definition: sc_hash.h:74
int remove(const void *k, void **pk, void **pc)
int remove_by_contents(const void *c)
void erase(void(*kfree)(void *))
int(* cmpr_fn_t)(const void *, const void *)
Definition: sc_hash.h:58
int insert_if_not_exists(void *k)
Definition: sc_hash.h:114
int insert_if_not_exists(void *k, void *c, void *(*kdup)(const void *))
sc_phash_elem ** bins
Definition: sc_hash.h:68
int remove_by_contents(const void *c, void(*kfree)(void *))
int remove_by_contents(bool(*predicate)(const void *, void *), void *arg, void(*kfree)(void *))
int insert_if_not_exists(void *k, void *c)
unsigned count() const
Definition: sc_hash.h:103
sc_phash_elem * find_entry_c(unsigned hv, const void *k, sc_phash_elem ***plast)
int remove(const void *k, void(*kfree)(void *))
int insert(void *k)
Definition: sc_hash.h:111
void set_hash_fn(hash_fn_t)
void copy(const sc_phash_base *)
sc_phash_elem * next
Definition: sc_hash.h:132
sc_phash_elem * entry
Definition: sc_hash.h:131
sc_phash_base_iter(sc_phash_base *t)
Definition: sc_hash.h:140
sc_phash_base_iter(sc_phash_base &t)
Definition: sc_hash.h:143
void * set_contents(void *c)
void remove(void(*kfree)(void *))
sc_phash_base * table
Definition: sc_hash.h:130
void reset(sc_phash_base *t)
sc_phash_elem ** last
Definition: sc_hash.h:133
void reset(sc_phash_base &t)
Definition: sc_hash.h:138
C contents() const
Definition: sc_hash.h:248
void reset(sc_phash< K, C > *t)
Definition: sc_hash.h:244
sc_phash_iter(sc_phash< K, C > *t)
Definition: sc_hash.h:240
void reset(sc_phash< K, C > &t)
Definition: sc_hash.h:245
sc_phash_iter(sc_phash< K, C > &t)
Definition: sc_hash.h:241
int remove_by_contents(C c)
Definition: sc_hash.h:206
void copy(const sc_phash< K, C > *b)
Definition: sc_hash.h:178
void copy(const sc_phash< K, C > &b, void *(*kdup)(const void *), void(*kfree)(void *))
Definition: sc_hash.h:180
int remove_by_contents(const void *c, void(*kfree)(void *))
Definition: sc_hash.h:214
int insert_if_not_exists(K k)
Definition: sc_hash.h:189
int remove_by_contents(bool(*predicate)(const void *, void *), void *arg)
Definition: sc_hash.h:210
void copy(const sc_phash< K, C > &b)
Definition: sc_hash.h:179
int insert_if_not_exists(K k, C c, void *(*kdup)(const void *))
Definition: sc_hash.h:193
C operator[](K k) const
Definition: sc_hash.h:230
bool contains(K k) const
Definition: sc_hash.h:226
int remove(K k, K *pk, C *pc)
Definition: sc_hash.h:198
int lookup(K k, C *pc) const
Definition: sc_hash.h:222
int remove(K k, void(*kfree)(void *))
Definition: sc_hash.h:202
int remove_by_contents(bool(*predicate)(const void *, void *), void *arg, void(*kfree)(void *))
Definition: sc_hash.h:218
int insert_if_not_exists(K k, C c)
Definition: sc_hash.h:185
sc_phash(C def=(C) 0, int size=PHASH_DEFAULT_INIT_TABLE_SIZE, int density=PHASH_DEFAULT_MAX_DENSITY, double grow=PHASH_DEFAULT_GROW_FACTOR, bool reorder=PHASH_DEFAULT_REORDER_FLAG, hash_fn_t hash_fn=default_ptr_hash_fn, cmpr_fn_t cmpr_fn=0)
Definition: sc_hash.h:168
int insert(K k)
Definition: sc_hash.h:183
sc_phash_iter< K, C > iterator
Definition: sc_hash.h:166
int insert(K k, C c)
Definition: sc_hash.h:182
int remove(K k)
Definition: sc_hash.h:197
int insert(K k, C c, void *(*kdup)(const void *))
Definition: sc_hash.h:184
int remove(K k, K *pk, C *pc)
Definition: sc_hash.h:303
int insert(K k)
Definition: sc_hash.h:293
int remove_by_contents(C c)
Definition: sc_hash.h:307
C operator[](K k) const
Definition: sc_hash.h:323
int remove(K k)
Definition: sc_hash.h:302
int lookup(K k, C *pc) const
Definition: sc_hash.h:315
int remove_by_contents(bool(*predicate)(const void *, void *), void *arg)
Definition: sc_hash.h:311
sc_pdhash_iter< K, C > iterator
Definition: sc_hash.h:268
int insert_if_not_exists(K k, C c)
Definition: sc_hash.h:294
void copy(const sc_pdhash< K, C > &b)
Definition: sc_hash.h:291
int insert_if_not_exists(K k)
Definition: sc_hash.h:298
bool contains(K k) const
Definition: sc_hash.h:319
int insert(K k, C c)
Definition: sc_hash.h:292
sc_pdhash(C def=(C) 0, int size=PHASH_DEFAULT_INIT_TABLE_SIZE, int density=PHASH_DEFAULT_MAX_DENSITY, double grow=PHASH_DEFAULT_GROW_FACTOR, bool reorder=PHASH_DEFAULT_REORDER_FLAG, hash_fn_t hash_fn=(hash_fn_t) 0, cmpr_fn_t cmpr_fn=(cmpr_fn_t) 0, void *(*kdup_fn)(const void *)=0, void(*kfree_fn)(void *)=0)
Definition: sc_hash.h:269
sc_strhash_iter(sc_strhash< C > *t)
Definition: sc_hash.h:422
const char * key()
Definition: sc_hash.h:430
void reset(sc_strhash< C > *t)
Definition: sc_hash.h:426
sc_strhash_iter(sc_strhash< C > &t)
Definition: sc_hash.h:423
void reset(sc_strhash< C > &t)
Definition: sc_hash.h:427
sc_strhash_iter< C > iterator
Definition: sc_hash.h:360
int insert_if_not_exists(char *k)
Definition: sc_hash.h:388
C operator[](const char *k) const
Definition: sc_hash.h:413
bool contains(const char *k) const
Definition: sc_hash.h:409
int remove_by_contents(C c)
Definition: sc_hash.h:397
void copy(const sc_strhash< C > *b)
Definition: sc_hash.h:379
int lookup(const char *k, C *pc) const
Definition: sc_hash.h:405
int remove(const char *k)
Definition: sc_hash.h:392
int remove_by_contents(bool(*predicate)(const void *, void *), void *arg)
Definition: sc_hash.h:401
int insert(char *k)
Definition: sc_hash.h:383
sc_strhash(C def=(C) 0, int size=PHASH_DEFAULT_INIT_TABLE_SIZE, int density=PHASH_DEFAULT_MAX_DENSITY, double grow=PHASH_DEFAULT_GROW_FACTOR, bool reorder=PHASH_DEFAULT_REORDER_FLAG, unsigned(*hash_fn)(const void *)=default_str_hash_fn, int(*cmpr_fn)(const void *, const void *)=sc_strhash_cmp)
Definition: sc_hash.h:362
void copy(const sc_strhash< C > &b)
Definition: sc_hash.h:380
int insert_if_not_exists(char *k, C c)
Definition: sc_hash.h:384
int remove(const char *k, char **pk, C *pc)
Definition: sc_hash.h:393
int insert(char *k, C c)
Definition: sc_hash.h:382