SystemC  2.3.2
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 
35 namespace sc_core {
36 
37 extern SC_API unsigned default_int_hash_fn(const void*);
38 extern SC_API unsigned default_ptr_hash_fn(const void*);
39 extern SC_API unsigned default_str_hash_fn(const void*);
40 
41 class sc_phash_elem;
42 class sc_phash_base_iter;
43 template<class K, class C> //template class
44 class sc_pdhash_iter; //decl. -- Amit
45 
48 extern SC_API const double PHASH_DEFAULT_GROW_FACTOR;
49 const bool PHASH_DEFAULT_REORDER_FLAG = true;
50 
52  friend class sc_phash_base_iter;
53 
55 
56 public:
57  typedef unsigned (*hash_fn_t)(const void*);
58  typedef int (*cmpr_fn_t)(const void*, const void*);
59 
60 protected:
62  int num_bins;
66  double grow_factor;
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 
89 public:
90  sc_phash_base( void* def = 0,
91  int size = PHASH_DEFAULT_INIT_TABLE_SIZE,
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 );
97  ~sc_phash_base();
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 
129 protected:
131  sc_phash_elem* entry;
132  sc_phash_elem* next;
133  sc_phash_elem** last;
134  int index;
135 
136 public:
137  void reset(sc_phash_base* t);
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 
158 template< class K, class C >
160 
161 template< class K, class C >
162 class sc_phash : public sc_phash_base {
163  friend class sc_phash_iter<K,C>;
164 
165 public:
167 
168  sc_phash( C def = (C) 0,
169  int size = PHASH_DEFAULT_INIT_TABLE_SIZE,
170  int density = PHASH_DEFAULT_MAX_DENSITY,
171  double grow = PHASH_DEFAULT_GROW_FACTOR,
172  bool reorder = PHASH_DEFAULT_REORDER_FLAG,
173  hash_fn_t hash_fn = default_ptr_hash_fn,
174  cmpr_fn_t cmpr_fn = 0 )
175  : sc_phash_base((void*) def, size, density, grow, reorder, hash_fn, cmpr_fn) { }
176  ~sc_phash() { }
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); }
185  int insert_if_not_exists(K k, C c)
186  {
187  return sc_phash_base::insert_if_not_exists((void*) k, (void*) c);
188  }
190  {
191  return sc_phash_base::insert_if_not_exists((void*) k, default_value);
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 
237 template< class K, class C >
238 class sc_phash_iter : public sc_phash_base_iter {
239 public:
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 
259 template< class K, class C >
260 class sc_pdhash : public sc_phash_base {
261  friend class sc_pdhash_iter<K,C>;
262 
263 private:
264  void* (*kdup)(const void*); //eliminated braces around void* -- Amit
265  void (*kfree)(void*);
266 
267 public:
269  sc_pdhash( C def = (C) 0,
270  int size = PHASH_DEFAULT_INIT_TABLE_SIZE,
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  {
289  sc_phash_base::erase(kfree);
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); }
294  int insert_if_not_exists(K k, C c)
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 
329 template< class K, class C >
330 class sc_pdhash_iter : public sc_phash_base_iter {
331 public:
335 
338 
339  void remove() { sc_phash_base_iter::remove(((sc_pdhash<K,C>*) table)->kfree); }
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 
348 extern SC_API int sc_strhash_cmp( const void*, const void* );
349 extern SC_API void sc_strhash_kfree(void*);
350 extern SC_API void* sc_strhash_kdup(const void*);
351 
352 template< class C > // template class decl.
353 class sc_strhash_iter; // --Amit
354 
355 template< class C >
356 class sc_strhash : public sc_phash_base {
357  friend class sc_strhash_iter<C>;
358 
359 public:
361 
362  sc_strhash( C def = (C) 0,
363  int size = PHASH_DEFAULT_INIT_TABLE_SIZE,
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 
378  void erase() { sc_phash_base::erase(sc_strhash_kfree); }
379  void copy(const sc_strhash<C>* b) { sc_phash_base::copy(*b, sc_strhash_kdup, sc_strhash_kfree); }
380  void copy(const sc_strhash<C>& b) { sc_phash_base::copy(b, sc_strhash_kdup, sc_strhash_kfree); }
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  }
388  int insert_if_not_exists(char* k)
389  {
390  return sc_phash_base::insert_if_not_exists((void*) k, default_value, sc_strhash_kdup);
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  {
399  return sc_phash_base::remove_by_contents((const void*) c, sc_strhash_kfree);
400  }
401  int remove_by_contents(bool (*predicate)(const void*, void*), void* arg)
402  {
403  return sc_phash_base::remove_by_contents(predicate, arg, sc_strhash_kfree);
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 
419 template<class C>
420 class sc_strhash_iter : public sc_phash_base_iter {
421 public:
425 
428 
429  void remove() { sc_phash_base_iter::remove(sc_strhash_kfree); }
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
const bool PHASH_DEFAULT_REORDER_FLAG
Definition: sc_hash.h:49
sc_phash_iter(sc_phash< K, C > *t)
Definition: sc_hash.h:240
void copy(const sc_phash_base &b)
Definition: sc_hash.h:108
SC_API void * sc_strhash_kdup(const void *)
int insert_if_not_exists(char *k, C c)
Definition: sc_hash.h:384
int insert_if_not_exists(void *k, void *c)
bool empty() const
Definition: sc_hash.h:102
int insert_if_not_exists(K k, C c, void *(*kdup)(const void *))
Definition: sc_hash.h:193
void copy(const sc_phash< K, C > *b)
Definition: sc_hash.h:178
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 lookup(const char *k, C *pc) const
Definition: sc_hash.h:405
int insert(K k, C c)
Definition: sc_hash.h:182
int lookup(K k, C *pc) const
Definition: sc_hash.h:222
void reset(sc_phash< K, C > &t)
Definition: sc_hash.h:245
int remove_by_contents(C c)
Definition: sc_hash.h:206
int insert_if_not_exists(K k)
Definition: sc_hash.h:298
sc_pdhash_iter< K, C > iterator
Definition: sc_hash.h:268
int remove_by_contents(const void *c, void(*kfree)(void *))
Definition: sc_hash.h:214
sc_strhash_iter(sc_strhash< C > *t)
Definition: sc_hash.h:422
sc_pdhash_iter(sc_pdhash< K, C > &t)
Definition: sc_hash.h:333
int insert(K k)
Definition: sc_hash.h:293
void reset(sc_phash_base &t)
Definition: sc_hash.h:138
int insert(char *k)
Definition: sc_hash.h:383
const int PHASH_DEFAULT_INIT_TABLE_SIZE
Definition: sc_hash.h:47
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
C contents() const
Definition: sc_hash.h:248
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
bool contains(K k) const
Definition: sc_hash.h:226
uint64 const sc_uint_base int b
Definition: sc_fxval.h:1005
sc_phash_base * table
Definition: sc_hash.h:130
void copy(const sc_phash_base *)
int insert_if_not_exists(K k, C c)
Definition: sc_hash.h:185
int insert_if_not_exists(void *k)
Definition: sc_hash.h:114
void copy(const sc_strhash< C > &b)
Definition: sc_hash.h:380
SC_API int sc_strhash_cmp(const void *, const void *)
sc_phash_iter< K, C > iterator
Definition: sc_hash.h:166
sc_phash_base_iter(sc_phash_base *t)
Definition: sc_hash.h:140
void copy(const sc_pdhash< K, C > &b)
Definition: sc_hash.h:291
C operator[](K k) const
Definition: sc_hash.h:323
C operator[](const char *k) const
Definition: sc_hash.h:413
C operator[](K k) const
Definition: sc_hash.h:230
int insert(K k, C c, void *(*kdup)(const void *))
Definition: sc_hash.h:184
void reset(sc_pdhash< K, C > &t)
Definition: sc_hash.h:337
sc_phash_elem ** last
Definition: sc_hash.h:133
int insert_if_not_exists(char *k)
Definition: sc_hash.h:388
int remove(const void *k)
sc_phash_elem * entry
Definition: sc_hash.h:131
int remove_by_contents(bool(*predicate)(const void *, void *), void *arg)
Definition: sc_hash.h:311
void reset(sc_strhash< C > *t)
Definition: sc_hash.h:426
int insert(void *k, void *c)
int insert(char *k, C c)
Definition: sc_hash.h:382
sc_phash_elem ** bins
Definition: sc_hash.h:68
SC_API unsigned default_ptr_hash_fn(const void *)
sc_strhash_iter(sc_strhash< C > &t)
Definition: sc_hash.h:423
void copy(const sc_strhash< C > *b)
Definition: sc_hash.h:379
SC_API unsigned default_str_hash_fn(const void *)
unsigned do_hash(const void *key) const
Definition: sc_hash.h:74
void * set_contents(void *c)
sc_phash_elem * next
Definition: sc_hash.h:132
int insert_if_not_exists(K k, C c)
Definition: sc_hash.h:294
int insert(K k, C c)
Definition: sc_hash.h:292
void reset(sc_phash< K, C > *t)
Definition: sc_hash.h:244
Definition of the simulation context class.
sc_strhash_iter< C > iterator
Definition: sc_hash.h:360
int insert(K k)
Definition: sc_hash.h:183
int lookup(K k, C *pc) const
Definition: sc_hash.h:315
int insert(void *k)
Definition: sc_hash.h:111
SC_API const double PHASH_DEFAULT_GROW_FACTOR
int remove_by_contents(C c)
Definition: sc_hash.h:397
SC_API void sc_strhash_kfree(void *)
bool contains(K k) const
Definition: sc_hash.h:319
void reset(sc_phash_base *t)
void reset(sc_pdhash< K, C > *t)
Definition: sc_hash.h:336
sc_phash_iter(sc_phash< K, C > &t)
Definition: sc_hash.h:241
void copy(const sc_phash< K, C > &b, void *(*kdup)(const void *), void(*kfree)(void *))
Definition: sc_hash.h:180
void reset(sc_strhash< C > &t)
Definition: sc_hash.h:427
int lookup(const void *k, void **pc) const
sc_phash_elem * find_entry(unsigned hv, const void *k, sc_phash_elem ***plast=0) const
Definition: sc_hash.h:79
sc_pdhash_iter(sc_pdhash< K, C > *t)
Definition: sc_hash.h:332
int remove_by_contents(C c)
Definition: sc_hash.h:307
void copy(const sc_phash< K, C > &b)
Definition: sc_hash.h:179
int remove_by_contents(const void *c)
int remove_by_contents(bool(*predicate)(const void *, void *), void *arg)
Definition: sc_hash.h:401
const int PHASH_DEFAULT_MAX_DENSITY
Definition: sc_hash.h:46
bool contains(const char *k) const
Definition: sc_hash.h:409
SC_API unsigned default_int_hash_fn(const void *)
int remove_by_contents(bool(*predicate)(const void *, void *), void *arg, void(*kfree)(void *))
Definition: sc_hash.h:218
sc_phash_base_iter(sc_phash_base &t)
Definition: sc_hash.h:143
int insert_if_not_exists(K k)
Definition: sc_hash.h:189
#define SC_API
Definition: sc_cmnhdr.h:168
int remove_by_contents(bool(*predicate)(const void *, void *), void *arg)
Definition: sc_hash.h:210
bool contains(const void *k) const
Definition: sc_hash.h:124
void * operator[](const void *key) const
const char * key()
Definition: sc_hash.h:430
unsigned count() const
Definition: sc_hash.h:103