112027Sjungma@eit.uni-kl.de/***************************************************************************** 212027Sjungma@eit.uni-kl.de 312027Sjungma@eit.uni-kl.de Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412027Sjungma@eit.uni-kl.de more contributor license agreements. See the NOTICE file distributed 512027Sjungma@eit.uni-kl.de with this work for additional information regarding copyright ownership. 612027Sjungma@eit.uni-kl.de Accellera licenses this file to you under the Apache License, Version 2.0 712027Sjungma@eit.uni-kl.de (the "License"); you may not use this file except in compliance with the 812027Sjungma@eit.uni-kl.de License. You may obtain a copy of the License at 912027Sjungma@eit.uni-kl.de 1012027Sjungma@eit.uni-kl.de http://www.apache.org/licenses/LICENSE-2.0 1112027Sjungma@eit.uni-kl.de 1212027Sjungma@eit.uni-kl.de Unless required by applicable law or agreed to in writing, software 1312027Sjungma@eit.uni-kl.de distributed under the License is distributed on an "AS IS" BASIS, 1412027Sjungma@eit.uni-kl.de WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512027Sjungma@eit.uni-kl.de implied. See the License for the specific language governing 1612027Sjungma@eit.uni-kl.de permissions and limitations under the License. 1712027Sjungma@eit.uni-kl.de 1812027Sjungma@eit.uni-kl.de *****************************************************************************/ 1912027Sjungma@eit.uni-kl.de 2012027Sjungma@eit.uni-kl.de/***************************************************************************** 2112027Sjungma@eit.uni-kl.de 2212027Sjungma@eit.uni-kl.de sc_hash.cpp -- Implementation of a chained hash table with MTF 2312027Sjungma@eit.uni-kl.de (move-to-front). 2412027Sjungma@eit.uni-kl.de 2512027Sjungma@eit.uni-kl.de Original Author: Stan Y. Liao, Synopsys, Inc. 2612027Sjungma@eit.uni-kl.de 2712027Sjungma@eit.uni-kl.de CHANGE LOG AT END OF FILE 2812027Sjungma@eit.uni-kl.de *****************************************************************************/ 2912027Sjungma@eit.uni-kl.de 3012027Sjungma@eit.uni-kl.de#ifndef SC_HASH_H 3112027Sjungma@eit.uni-kl.de#define SC_HASH_H 3212027Sjungma@eit.uni-kl.de 3312027Sjungma@eit.uni-kl.de 3412027Sjungma@eit.uni-kl.denamespace sc_core { 3512027Sjungma@eit.uni-kl.de 3612027Sjungma@eit.uni-kl.deextern unsigned default_int_hash_fn(const void*); 3712027Sjungma@eit.uni-kl.deextern unsigned default_ptr_hash_fn(const void*); 3812027Sjungma@eit.uni-kl.deextern unsigned default_str_hash_fn(const void*); 3912027Sjungma@eit.uni-kl.de 4012027Sjungma@eit.uni-kl.declass sc_phash_elem; 4112027Sjungma@eit.uni-kl.declass sc_phash_base_iter; 4212027Sjungma@eit.uni-kl.detemplate<class K, class C> //template class 4312027Sjungma@eit.uni-kl.declass sc_pdhash_iter; //decl. -- Amit 4412027Sjungma@eit.uni-kl.de 4512027Sjungma@eit.uni-kl.deconst int PHASH_DEFAULT_MAX_DENSITY = 5; 4612027Sjungma@eit.uni-kl.deconst int PHASH_DEFAULT_INIT_TABLE_SIZE = 11; 4712027Sjungma@eit.uni-kl.deextern const double PHASH_DEFAULT_GROW_FACTOR; 4812027Sjungma@eit.uni-kl.deconst bool PHASH_DEFAULT_REORDER_FLAG = true; 4912027Sjungma@eit.uni-kl.de 5012027Sjungma@eit.uni-kl.declass sc_phash_base { 5112027Sjungma@eit.uni-kl.de friend class sc_phash_base_iter; 5212027Sjungma@eit.uni-kl.de 5312027Sjungma@eit.uni-kl.de typedef sc_phash_base_iter iterator; 5412027Sjungma@eit.uni-kl.de 5512027Sjungma@eit.uni-kl.depublic: 5612027Sjungma@eit.uni-kl.de typedef unsigned (*hash_fn_t)(const void*); 5712027Sjungma@eit.uni-kl.de typedef int (*cmpr_fn_t)(const void*, const void*); 5812027Sjungma@eit.uni-kl.de 5912027Sjungma@eit.uni-kl.deprotected: 6012027Sjungma@eit.uni-kl.de void* default_value; 6112027Sjungma@eit.uni-kl.de int num_bins; 6212027Sjungma@eit.uni-kl.de int num_entries; 6312027Sjungma@eit.uni-kl.de int max_density; 6412027Sjungma@eit.uni-kl.de int reorder_flag; 6512027Sjungma@eit.uni-kl.de double grow_factor; 6612027Sjungma@eit.uni-kl.de 6712027Sjungma@eit.uni-kl.de sc_phash_elem** bins; 6812027Sjungma@eit.uni-kl.de 6912027Sjungma@eit.uni-kl.de hash_fn_t hash; 7012027Sjungma@eit.uni-kl.de cmpr_fn_t cmpr; 7112027Sjungma@eit.uni-kl.de 7212027Sjungma@eit.uni-kl.de void rehash(); 7312027Sjungma@eit.uni-kl.de unsigned do_hash(const void* key) const { return (*hash)(key) % num_bins; } 7412027Sjungma@eit.uni-kl.de 7512027Sjungma@eit.uni-kl.de sc_phash_elem* add_direct(void* key, void* contents, unsigned hash_val); 7612027Sjungma@eit.uni-kl.de sc_phash_elem* find_entry_c(unsigned hv, const void* k, sc_phash_elem*** plast); 7712027Sjungma@eit.uni-kl.de sc_phash_elem* find_entry_q(unsigned hv, const void* k, sc_phash_elem*** plast); 7812027Sjungma@eit.uni-kl.de sc_phash_elem* find_entry(unsigned hv, const void* k, sc_phash_elem*** plast=0) const 7912027Sjungma@eit.uni-kl.de { 8012027Sjungma@eit.uni-kl.de /* Got rid of member func. pointer and replaced with if-else */ 8112027Sjungma@eit.uni-kl.de /* Amit (5/14/99) */ 8212027Sjungma@eit.uni-kl.de if( cmpr == 0 ) 8312027Sjungma@eit.uni-kl.de return ((sc_phash_base*)this)->find_entry_q( hv, k, plast ); 8412027Sjungma@eit.uni-kl.de else 8512027Sjungma@eit.uni-kl.de return ((sc_phash_base*)this)->find_entry_c( hv, k, plast ); 8612027Sjungma@eit.uni-kl.de } 8712027Sjungma@eit.uni-kl.de 8812027Sjungma@eit.uni-kl.depublic: 8912027Sjungma@eit.uni-kl.de sc_phash_base( void* def = 0, 9012027Sjungma@eit.uni-kl.de int size = PHASH_DEFAULT_INIT_TABLE_SIZE, 9112027Sjungma@eit.uni-kl.de int density = PHASH_DEFAULT_MAX_DENSITY, 9212027Sjungma@eit.uni-kl.de double grow = PHASH_DEFAULT_GROW_FACTOR, 9312027Sjungma@eit.uni-kl.de bool reorder = PHASH_DEFAULT_REORDER_FLAG, 9412027Sjungma@eit.uni-kl.de hash_fn_t hash_fn = default_ptr_hash_fn, 9512027Sjungma@eit.uni-kl.de cmpr_fn_t cmpr_fn = 0 ); 9612027Sjungma@eit.uni-kl.de ~sc_phash_base(); 9712027Sjungma@eit.uni-kl.de 9812027Sjungma@eit.uni-kl.de void set_cmpr_fn(cmpr_fn_t); 9912027Sjungma@eit.uni-kl.de void set_hash_fn(hash_fn_t); 10012027Sjungma@eit.uni-kl.de 10112027Sjungma@eit.uni-kl.de bool empty() const { return (num_entries == 0); } 10212027Sjungma@eit.uni-kl.de unsigned count() const { return num_entries; } 10312027Sjungma@eit.uni-kl.de 10412027Sjungma@eit.uni-kl.de void erase(); 10512027Sjungma@eit.uni-kl.de void erase(void (*kfree)(void*)); 10612027Sjungma@eit.uni-kl.de void copy( const sc_phash_base* ); 10712027Sjungma@eit.uni-kl.de void copy( const sc_phash_base& b ) { copy(&b); } 10812027Sjungma@eit.uni-kl.de void copy( const sc_phash_base& b, void* (*kdup)(const void*), void (*kfree)(void*)); 10912027Sjungma@eit.uni-kl.de int insert( void* k, void* c ); 11012027Sjungma@eit.uni-kl.de int insert( void* k ) { return insert(k, default_value); } 11112027Sjungma@eit.uni-kl.de int insert( void* k, void* c, void* (*kdup)(const void*) ); 11212027Sjungma@eit.uni-kl.de int insert_if_not_exists(void* k, void* c); 11312027Sjungma@eit.uni-kl.de int insert_if_not_exists(void* k) { return insert_if_not_exists(k, default_value); } 11412027Sjungma@eit.uni-kl.de int insert_if_not_exists(void* k, void* c, void* (*kdup)(const void*)); 11512027Sjungma@eit.uni-kl.de int remove(const void* k); 11612027Sjungma@eit.uni-kl.de int remove(const void* k, void** pk, void** pc); 11712027Sjungma@eit.uni-kl.de int remove(const void* k, void (*kfree)(void*)); 11812027Sjungma@eit.uni-kl.de int remove_by_contents(const void* c); 11912027Sjungma@eit.uni-kl.de int remove_by_contents(bool (*predicate)(const void*, void*), void* arg); 12012027Sjungma@eit.uni-kl.de int remove_by_contents(const void* c, void (*kfree)(void*)); 12112027Sjungma@eit.uni-kl.de int remove_by_contents(bool (*predicate)(const void*, void*), void* arg, void (*kfree)(void*)); 12212027Sjungma@eit.uni-kl.de int lookup(const void* k, void** pc) const; 12312027Sjungma@eit.uni-kl.de bool contains(const void* k) const { return (lookup(k, 0) != 0); } 12412027Sjungma@eit.uni-kl.de void* operator[](const void* key) const; 12512027Sjungma@eit.uni-kl.de}; 12612027Sjungma@eit.uni-kl.de 12712027Sjungma@eit.uni-kl.declass sc_phash_base_iter { 12812027Sjungma@eit.uni-kl.deprotected: 12912027Sjungma@eit.uni-kl.de sc_phash_base* table; 13012027Sjungma@eit.uni-kl.de sc_phash_elem* entry; 13112027Sjungma@eit.uni-kl.de sc_phash_elem* next; 13212027Sjungma@eit.uni-kl.de sc_phash_elem** last; 13312027Sjungma@eit.uni-kl.de int index; 13412027Sjungma@eit.uni-kl.de 13512027Sjungma@eit.uni-kl.depublic: 13612027Sjungma@eit.uni-kl.de void reset(sc_phash_base* t); 13712027Sjungma@eit.uni-kl.de void reset(sc_phash_base& t) { reset(&t); } 13812027Sjungma@eit.uni-kl.de 13912027Sjungma@eit.uni-kl.de sc_phash_base_iter(sc_phash_base* t) 14012027Sjungma@eit.uni-kl.de : table(t), entry(0), next(0), last(0), index(0) 14112027Sjungma@eit.uni-kl.de { reset(t); } 14212027Sjungma@eit.uni-kl.de sc_phash_base_iter(sc_phash_base& t) 14312027Sjungma@eit.uni-kl.de : table(&t), entry(0), next(0), last(0), index(0) 14412027Sjungma@eit.uni-kl.de { reset(t); } 14512027Sjungma@eit.uni-kl.de ~sc_phash_base_iter() { } 14612027Sjungma@eit.uni-kl.de 14712027Sjungma@eit.uni-kl.de bool empty() const; 14812027Sjungma@eit.uni-kl.de void step(); 14912027Sjungma@eit.uni-kl.de void operator++(int) { step(); } 15012027Sjungma@eit.uni-kl.de void remove(); 15112027Sjungma@eit.uni-kl.de void remove(void (*kfree)(void*)); 15212027Sjungma@eit.uni-kl.de void* key() const; 15312027Sjungma@eit.uni-kl.de void* contents() const; 15412027Sjungma@eit.uni-kl.de void* set_contents(void* c); 15512027Sjungma@eit.uni-kl.de}; 15612027Sjungma@eit.uni-kl.de 15712027Sjungma@eit.uni-kl.detemplate< class K, class C > 15812027Sjungma@eit.uni-kl.declass sc_phash_iter; 15912027Sjungma@eit.uni-kl.de 16012027Sjungma@eit.uni-kl.detemplate< class K, class C > 16112027Sjungma@eit.uni-kl.declass sc_phash : public sc_phash_base { 16212027Sjungma@eit.uni-kl.de friend class sc_phash_iter<K,C>; 16312027Sjungma@eit.uni-kl.de 16412027Sjungma@eit.uni-kl.depublic: 16512027Sjungma@eit.uni-kl.de typedef sc_phash_iter<K,C> iterator; 16612027Sjungma@eit.uni-kl.de 16712027Sjungma@eit.uni-kl.de sc_phash( C def = (C) 0, 16812027Sjungma@eit.uni-kl.de int size = PHASH_DEFAULT_INIT_TABLE_SIZE, 16912027Sjungma@eit.uni-kl.de int density = PHASH_DEFAULT_MAX_DENSITY, 17012027Sjungma@eit.uni-kl.de double grow = PHASH_DEFAULT_GROW_FACTOR, 17112027Sjungma@eit.uni-kl.de bool reorder = PHASH_DEFAULT_REORDER_FLAG, 17212027Sjungma@eit.uni-kl.de hash_fn_t hash_fn = default_ptr_hash_fn, 17312027Sjungma@eit.uni-kl.de cmpr_fn_t cmpr_fn = 0 ) 17412027Sjungma@eit.uni-kl.de : sc_phash_base((void*) def, size, density, grow, reorder, hash_fn, cmpr_fn) { } 17512027Sjungma@eit.uni-kl.de ~sc_phash() { } 17612027Sjungma@eit.uni-kl.de 17712027Sjungma@eit.uni-kl.de void copy(const sc_phash<K,C>* b) { sc_phash_base::copy(b); } 17812027Sjungma@eit.uni-kl.de void copy(const sc_phash<K,C>& b) { sc_phash_base::copy(b); } 17912027Sjungma@eit.uni-kl.de void copy(const sc_phash<K,C>& b, void* (*kdup)(const void*), void (*kfree)(void*)) { sc_phash_base::copy(b, kdup, kfree); } 18012027Sjungma@eit.uni-kl.de 18112027Sjungma@eit.uni-kl.de int insert(K k, C c) { return sc_phash_base::insert((void*) k, (void*) c); } 18212027Sjungma@eit.uni-kl.de int insert(K k) { return sc_phash_base::insert((void*) k, default_value); } 18312027Sjungma@eit.uni-kl.de int insert(K k, C c, void* (*kdup)(const void*)) { return sc_phash_base::insert((void*) k, (void*) c, kdup); } 18412027Sjungma@eit.uni-kl.de int insert_if_not_exists(K k, C c) 18512027Sjungma@eit.uni-kl.de { 18612027Sjungma@eit.uni-kl.de return sc_phash_base::insert_if_not_exists((void*) k, (void*) c); 18712027Sjungma@eit.uni-kl.de } 18812027Sjungma@eit.uni-kl.de int insert_if_not_exists(K k) 18912027Sjungma@eit.uni-kl.de { 19012027Sjungma@eit.uni-kl.de return sc_phash_base::insert_if_not_exists((void*) k, default_value); 19112027Sjungma@eit.uni-kl.de } 19212027Sjungma@eit.uni-kl.de int insert_if_not_exists(K k, C c, void* (*kdup)(const void*)) 19312027Sjungma@eit.uni-kl.de { 19412027Sjungma@eit.uni-kl.de return sc_phash_base::insert_if_not_exists((void*) k, (void*) c, kdup); 19512027Sjungma@eit.uni-kl.de } 19612027Sjungma@eit.uni-kl.de int remove(K k) { return sc_phash_base::remove((const void*) k); } 19712027Sjungma@eit.uni-kl.de int remove(K k, K* pk, C* pc) 19812027Sjungma@eit.uni-kl.de { 19912027Sjungma@eit.uni-kl.de return sc_phash_base::remove((const void*) k, (void**) pk, (void**) pc); 20012027Sjungma@eit.uni-kl.de } 20112027Sjungma@eit.uni-kl.de int remove(K k, void (*kfree)(void*)) 20212027Sjungma@eit.uni-kl.de { 20312027Sjungma@eit.uni-kl.de return sc_phash_base::remove((const void*) k, kfree); 20412027Sjungma@eit.uni-kl.de } 20512027Sjungma@eit.uni-kl.de int remove_by_contents(C c) 20612027Sjungma@eit.uni-kl.de { 20712027Sjungma@eit.uni-kl.de return sc_phash_base::remove_by_contents((const void*) c); 20812027Sjungma@eit.uni-kl.de } 20912027Sjungma@eit.uni-kl.de int remove_by_contents(bool (*predicate)(const void*, void*), void* arg) 21012027Sjungma@eit.uni-kl.de { 21112027Sjungma@eit.uni-kl.de return sc_phash_base::remove_by_contents(predicate, arg); 21212027Sjungma@eit.uni-kl.de } 21312027Sjungma@eit.uni-kl.de int remove_by_contents(const void* c, void (*kfree)(void*)) 21412027Sjungma@eit.uni-kl.de { 21512027Sjungma@eit.uni-kl.de return sc_phash_base::remove_by_contents(c, kfree); 21612027Sjungma@eit.uni-kl.de } 21712027Sjungma@eit.uni-kl.de int remove_by_contents(bool (*predicate)(const void*, void*), void* arg, void (*kfree)(void*)) 21812027Sjungma@eit.uni-kl.de { 21912027Sjungma@eit.uni-kl.de return sc_phash_base::remove_by_contents(predicate, arg, kfree); 22012027Sjungma@eit.uni-kl.de } 22112027Sjungma@eit.uni-kl.de int lookup(K k, C* pc) const 22212027Sjungma@eit.uni-kl.de { 22312027Sjungma@eit.uni-kl.de return sc_phash_base::lookup((const void*) k, (void**) pc); 22412027Sjungma@eit.uni-kl.de } 22512027Sjungma@eit.uni-kl.de bool contains(K k) const 22612027Sjungma@eit.uni-kl.de { 22712027Sjungma@eit.uni-kl.de return sc_phash_base::contains((const void*) k); 22812027Sjungma@eit.uni-kl.de } 22912027Sjungma@eit.uni-kl.de C operator[](K k) const 23012027Sjungma@eit.uni-kl.de { 23112027Sjungma@eit.uni-kl.de return (C) sc_phash_base::operator[]((const void*) k); 23212027Sjungma@eit.uni-kl.de } 23312027Sjungma@eit.uni-kl.de}; 23412027Sjungma@eit.uni-kl.de 23512027Sjungma@eit.uni-kl.de 23612027Sjungma@eit.uni-kl.detemplate< class K, class C > 23712027Sjungma@eit.uni-kl.declass sc_phash_iter : public sc_phash_base_iter { 23812027Sjungma@eit.uni-kl.depublic: 23912027Sjungma@eit.uni-kl.de sc_phash_iter(sc_phash<K,C>* t) : sc_phash_base_iter(t) { } 24012027Sjungma@eit.uni-kl.de sc_phash_iter(sc_phash<K,C>& t) : sc_phash_base_iter(t) { } 24112027Sjungma@eit.uni-kl.de ~sc_phash_iter() { } 24212027Sjungma@eit.uni-kl.de 24312027Sjungma@eit.uni-kl.de void reset(sc_phash<K,C>* t) { sc_phash_base_iter::reset(t); } 24412027Sjungma@eit.uni-kl.de void reset(sc_phash<K,C>& t) { sc_phash_base_iter::reset(t); } 24512027Sjungma@eit.uni-kl.de 24612027Sjungma@eit.uni-kl.de K key() const { return (K) sc_phash_base_iter::key(); } 24712027Sjungma@eit.uni-kl.de C contents() const { return (C) sc_phash_base_iter::contents(); } 24812027Sjungma@eit.uni-kl.de C set_contents(C c) 24912027Sjungma@eit.uni-kl.de { 25012027Sjungma@eit.uni-kl.de return (C) sc_phash_base_iter::set_contents((void*) c); 25112027Sjungma@eit.uni-kl.de } 25212027Sjungma@eit.uni-kl.de}; 25312027Sjungma@eit.uni-kl.de 25412027Sjungma@eit.uni-kl.de 25512027Sjungma@eit.uni-kl.de 25612027Sjungma@eit.uni-kl.de 25712027Sjungma@eit.uni-kl.de 25812027Sjungma@eit.uni-kl.detemplate< class K, class C > 25912027Sjungma@eit.uni-kl.declass sc_pdhash : public sc_phash_base { 26012027Sjungma@eit.uni-kl.de friend class sc_pdhash_iter<K,C>; 26112027Sjungma@eit.uni-kl.de 26212027Sjungma@eit.uni-kl.deprivate: 26312027Sjungma@eit.uni-kl.de void* (*kdup)(const void*); //eliminated braces around void* -- Amit 26412027Sjungma@eit.uni-kl.de void (*kfree)(void*); 26512027Sjungma@eit.uni-kl.de 26612027Sjungma@eit.uni-kl.depublic: 26712027Sjungma@eit.uni-kl.de typedef sc_pdhash_iter<K,C> iterator; 26812027Sjungma@eit.uni-kl.de sc_pdhash( C def = (C) 0, 26912027Sjungma@eit.uni-kl.de int size = PHASH_DEFAULT_INIT_TABLE_SIZE, 27012027Sjungma@eit.uni-kl.de int density = PHASH_DEFAULT_MAX_DENSITY, 27112027Sjungma@eit.uni-kl.de double grow = PHASH_DEFAULT_GROW_FACTOR, 27212027Sjungma@eit.uni-kl.de bool reorder = PHASH_DEFAULT_REORDER_FLAG, 27312027Sjungma@eit.uni-kl.de hash_fn_t hash_fn = (hash_fn_t) 0, // defaults added -- 27412027Sjungma@eit.uni-kl.de cmpr_fn_t cmpr_fn = (cmpr_fn_t) 0, // Amit 27512027Sjungma@eit.uni-kl.de void* (*kdup_fn)(const void*) = 0, 27612027Sjungma@eit.uni-kl.de void (*kfree_fn)(void*) = 0 ) 27712027Sjungma@eit.uni-kl.de : sc_phash_base((void*) def, size, density, grow, reorder, hash_fn, cmpr_fn) 27812027Sjungma@eit.uni-kl.de { 27912027Sjungma@eit.uni-kl.de kdup = kdup_fn; 28012027Sjungma@eit.uni-kl.de kfree = kfree_fn; 28112027Sjungma@eit.uni-kl.de } 28212027Sjungma@eit.uni-kl.de ~sc_pdhash() 28312027Sjungma@eit.uni-kl.de { 28412027Sjungma@eit.uni-kl.de erase(); 28512027Sjungma@eit.uni-kl.de } 28612027Sjungma@eit.uni-kl.de void erase() 28712027Sjungma@eit.uni-kl.de { 28812027Sjungma@eit.uni-kl.de sc_phash_base::erase(kfree); 28912027Sjungma@eit.uni-kl.de } 29012027Sjungma@eit.uni-kl.de void copy(const sc_pdhash<K,C>& b) { sc_phash_base::copy(b, kdup, kfree); } 29112027Sjungma@eit.uni-kl.de int insert(K k, C c) { return sc_phash_base::insert((void*) k, (void*) c, kdup); } 29212027Sjungma@eit.uni-kl.de int insert(K k) { return sc_phash_base::insert((void*) k, default_value, kdup); } 29312027Sjungma@eit.uni-kl.de int insert_if_not_exists(K k, C c) 29412027Sjungma@eit.uni-kl.de { 29512027Sjungma@eit.uni-kl.de return sc_phash_base::insert_if_not_exists((void*) k, (void*) c, kdup); 29612027Sjungma@eit.uni-kl.de } 29712027Sjungma@eit.uni-kl.de int insert_if_not_exists(K k) 29812027Sjungma@eit.uni-kl.de { 29912027Sjungma@eit.uni-kl.de return sc_phash_base::insert_if_not_exists((void*) k, default_value, kdup); 30012027Sjungma@eit.uni-kl.de } 30112027Sjungma@eit.uni-kl.de int remove(K k) { return sc_phash_base::remove((const void*) k, kfree); } 30212027Sjungma@eit.uni-kl.de int remove(K k, K* pk, C* pc) 30312027Sjungma@eit.uni-kl.de { 30412027Sjungma@eit.uni-kl.de return sc_phash_base::remove((const void*) k, (void**) pk, (void**) pc); 30512027Sjungma@eit.uni-kl.de } 30612027Sjungma@eit.uni-kl.de int remove_by_contents(C c) 30712027Sjungma@eit.uni-kl.de { 30812027Sjungma@eit.uni-kl.de return sc_phash_base::remove_by_contents((const void*) c, kfree); 30912027Sjungma@eit.uni-kl.de } 31012027Sjungma@eit.uni-kl.de int remove_by_contents(bool (*predicate)(const void*, void*), void* arg) 31112027Sjungma@eit.uni-kl.de { 31212027Sjungma@eit.uni-kl.de return sc_phash_base::remove_by_contents(predicate, arg, kfree); 31312027Sjungma@eit.uni-kl.de } 31412027Sjungma@eit.uni-kl.de int lookup(K k, C* pc) const 31512027Sjungma@eit.uni-kl.de { 31612027Sjungma@eit.uni-kl.de return sc_phash_base::lookup((const void*) k, (void**) pc); 31712027Sjungma@eit.uni-kl.de } 31812027Sjungma@eit.uni-kl.de bool contains(K k) const 31912027Sjungma@eit.uni-kl.de { 32012027Sjungma@eit.uni-kl.de return sc_phash_base::contains((const void*) k); 32112027Sjungma@eit.uni-kl.de } 32212027Sjungma@eit.uni-kl.de C operator[](K k) const 32312027Sjungma@eit.uni-kl.de { 32412027Sjungma@eit.uni-kl.de return (C) sc_phash_base::operator[]((const void*) k); 32512027Sjungma@eit.uni-kl.de } 32612027Sjungma@eit.uni-kl.de}; 32712027Sjungma@eit.uni-kl.de 32812027Sjungma@eit.uni-kl.detemplate< class K, class C > 32912027Sjungma@eit.uni-kl.declass sc_pdhash_iter : public sc_phash_base_iter { 33012027Sjungma@eit.uni-kl.depublic: 33112027Sjungma@eit.uni-kl.de sc_pdhash_iter(sc_pdhash<K,C>* t) : sc_phash_base_iter(t) { } 33212027Sjungma@eit.uni-kl.de sc_pdhash_iter(sc_pdhash<K,C>& t) : sc_phash_base_iter(t) { } 33312027Sjungma@eit.uni-kl.de ~sc_pdhash_iter() { } 33412027Sjungma@eit.uni-kl.de 33512027Sjungma@eit.uni-kl.de void reset(sc_pdhash<K,C>* t) { sc_phash_base_iter::reset(t); } 33612027Sjungma@eit.uni-kl.de void reset(sc_pdhash<K,C>& t) { sc_phash_base_iter::reset(t); } 33712027Sjungma@eit.uni-kl.de 33812027Sjungma@eit.uni-kl.de void remove() { sc_phash_base_iter::remove(((sc_pdhash<K,C>*) table)->kfree); } 33912027Sjungma@eit.uni-kl.de K key() const { return (K) sc_phash_base_iter::key(); } 34012027Sjungma@eit.uni-kl.de C contents() const { return (C) sc_phash_base_iter::contents(); } 34112027Sjungma@eit.uni-kl.de C set_contents(C c) 34212027Sjungma@eit.uni-kl.de { 34312027Sjungma@eit.uni-kl.de return (C) sc_phash_base_iter::set_contents((void*) c); 34412027Sjungma@eit.uni-kl.de } 34512027Sjungma@eit.uni-kl.de}; 34612027Sjungma@eit.uni-kl.de 34712027Sjungma@eit.uni-kl.deextern int sc_strhash_cmp( const void*, const void* ); 34812027Sjungma@eit.uni-kl.deextern void sc_strhash_kfree(void*); 34912027Sjungma@eit.uni-kl.deextern void* sc_strhash_kdup(const void*); 35012027Sjungma@eit.uni-kl.de 35112027Sjungma@eit.uni-kl.detemplate< class C > // template class decl. 35212027Sjungma@eit.uni-kl.declass sc_strhash_iter; // --Amit 35312027Sjungma@eit.uni-kl.de 35412027Sjungma@eit.uni-kl.detemplate< class C > 35512027Sjungma@eit.uni-kl.declass sc_strhash : public sc_phash_base { 35612027Sjungma@eit.uni-kl.de friend class sc_strhash_iter<C>; 35712027Sjungma@eit.uni-kl.de 35812027Sjungma@eit.uni-kl.depublic: 35912027Sjungma@eit.uni-kl.de typedef sc_strhash_iter<C> iterator; 36012027Sjungma@eit.uni-kl.de 36112027Sjungma@eit.uni-kl.de sc_strhash( C def = (C) 0, 36212027Sjungma@eit.uni-kl.de int size = PHASH_DEFAULT_INIT_TABLE_SIZE, 36312027Sjungma@eit.uni-kl.de int density = PHASH_DEFAULT_MAX_DENSITY, 36412027Sjungma@eit.uni-kl.de double grow = PHASH_DEFAULT_GROW_FACTOR, 36512027Sjungma@eit.uni-kl.de bool reorder = PHASH_DEFAULT_REORDER_FLAG, 36612027Sjungma@eit.uni-kl.de unsigned (*hash_fn)(const void*) = default_str_hash_fn, 36712027Sjungma@eit.uni-kl.de int (*cmpr_fn)(const void*, const void*) = sc_strhash_cmp ) 36812027Sjungma@eit.uni-kl.de : sc_phash_base((void*) def, size, density, grow, reorder, hash_fn, cmpr_fn) 36912027Sjungma@eit.uni-kl.de { 37012027Sjungma@eit.uni-kl.de 37112027Sjungma@eit.uni-kl.de } 37212027Sjungma@eit.uni-kl.de ~sc_strhash() 37312027Sjungma@eit.uni-kl.de { 37412027Sjungma@eit.uni-kl.de erase(); 37512027Sjungma@eit.uni-kl.de } 37612027Sjungma@eit.uni-kl.de 37712027Sjungma@eit.uni-kl.de void erase() { sc_phash_base::erase(sc_strhash_kfree); } 37812027Sjungma@eit.uni-kl.de void copy(const sc_strhash<C>* b) { sc_phash_base::copy(*b, sc_strhash_kdup, sc_strhash_kfree); } 37912027Sjungma@eit.uni-kl.de void copy(const sc_strhash<C>& b) { sc_phash_base::copy(b, sc_strhash_kdup, sc_strhash_kfree); } 38012027Sjungma@eit.uni-kl.de 38112027Sjungma@eit.uni-kl.de int insert(char* k, C c) { return sc_phash_base::insert((void*) k, (void*) c, sc_strhash_kdup); } 38212027Sjungma@eit.uni-kl.de int insert(char* k) { return sc_phash_base::insert((void*) k, default_value, sc_strhash_kdup); } 38312027Sjungma@eit.uni-kl.de int insert_if_not_exists(char* k, C c) 38412027Sjungma@eit.uni-kl.de { 38512027Sjungma@eit.uni-kl.de return sc_phash_base::insert_if_not_exists((void*) k, (void*) c, sc_strhash_kdup); 38612027Sjungma@eit.uni-kl.de } 38712027Sjungma@eit.uni-kl.de int insert_if_not_exists(char* k) 38812027Sjungma@eit.uni-kl.de { 38912027Sjungma@eit.uni-kl.de return sc_phash_base::insert_if_not_exists((void*) k, default_value, sc_strhash_kdup); 39012027Sjungma@eit.uni-kl.de } 39112027Sjungma@eit.uni-kl.de int remove(const char* k) { return sc_phash_base::remove((const void*) k, sc_strhash_kfree); } 39212027Sjungma@eit.uni-kl.de int remove(const char* k, char** pk, C* pc) 39312027Sjungma@eit.uni-kl.de { 39412027Sjungma@eit.uni-kl.de return sc_phash_base::remove((const void*) k, (void**) pk, (void**) pc); 39512027Sjungma@eit.uni-kl.de } 39612027Sjungma@eit.uni-kl.de int remove_by_contents(C c) 39712027Sjungma@eit.uni-kl.de { 39812027Sjungma@eit.uni-kl.de return sc_phash_base::remove_by_contents((const void*) c, sc_strhash_kfree); 39912027Sjungma@eit.uni-kl.de } 40012027Sjungma@eit.uni-kl.de int remove_by_contents(bool (*predicate)(const void*, void*), void* arg) 40112027Sjungma@eit.uni-kl.de { 40212027Sjungma@eit.uni-kl.de return sc_phash_base::remove_by_contents(predicate, arg, sc_strhash_kfree); 40312027Sjungma@eit.uni-kl.de } 40412027Sjungma@eit.uni-kl.de int lookup(const char* k, C* pc) const 40512027Sjungma@eit.uni-kl.de { 40612027Sjungma@eit.uni-kl.de return sc_phash_base::lookup((const void*) k, (void** )pc); 40712027Sjungma@eit.uni-kl.de } 40812027Sjungma@eit.uni-kl.de bool contains(const char* k) const 40912027Sjungma@eit.uni-kl.de { 41012027Sjungma@eit.uni-kl.de return sc_phash_base::contains((const void*) k); 41112027Sjungma@eit.uni-kl.de } 41212027Sjungma@eit.uni-kl.de C operator[](const char* k) const 41312027Sjungma@eit.uni-kl.de { 41412027Sjungma@eit.uni-kl.de return (C) sc_phash_base::operator[]((const void*) k); 41512027Sjungma@eit.uni-kl.de } 41612027Sjungma@eit.uni-kl.de}; 41712027Sjungma@eit.uni-kl.de 41812027Sjungma@eit.uni-kl.detemplate<class C> 41912027Sjungma@eit.uni-kl.declass sc_strhash_iter : public sc_phash_base_iter { 42012027Sjungma@eit.uni-kl.depublic: 42112027Sjungma@eit.uni-kl.de sc_strhash_iter ( sc_strhash<C>* t ) : sc_phash_base_iter(t) { } 42212027Sjungma@eit.uni-kl.de sc_strhash_iter ( sc_strhash<C>& t ) : sc_phash_base_iter(t) { } 42312027Sjungma@eit.uni-kl.de ~sc_strhash_iter() { } 42412027Sjungma@eit.uni-kl.de 42512027Sjungma@eit.uni-kl.de void reset ( sc_strhash<C>* t ) { sc_phash_base_iter::reset(t); } 42612027Sjungma@eit.uni-kl.de void reset ( sc_strhash<C>& t ) { sc_phash_base_iter::reset(t); } 42712027Sjungma@eit.uni-kl.de 42812027Sjungma@eit.uni-kl.de void remove() { sc_phash_base_iter::remove(sc_strhash_kfree); } 42912027Sjungma@eit.uni-kl.de const char* key() { return (const char*) sc_phash_base_iter::key(); } 43012027Sjungma@eit.uni-kl.de C contents() { return (C) sc_phash_base_iter::contents(); } 43112027Sjungma@eit.uni-kl.de C set_contents(C c) 43212027Sjungma@eit.uni-kl.de { 43312027Sjungma@eit.uni-kl.de return (C) sc_phash_base_iter::set_contents((void*) c); 43412027Sjungma@eit.uni-kl.de } 43512027Sjungma@eit.uni-kl.de}; 43612027Sjungma@eit.uni-kl.de 43712027Sjungma@eit.uni-kl.de} // namespace sc_core 43812027Sjungma@eit.uni-kl.de 43912027Sjungma@eit.uni-kl.de// $Log: sc_hash.h,v $ 44012027Sjungma@eit.uni-kl.de// Revision 1.5 2011/08/29 18:04:32 acg 44112027Sjungma@eit.uni-kl.de// Philipp A. Hartmann: miscellaneous clean ups. 44212027Sjungma@eit.uni-kl.de// 44312027Sjungma@eit.uni-kl.de// Revision 1.4 2011/08/26 20:46:16 acg 44412027Sjungma@eit.uni-kl.de// Andy Goodrich: moved the modification log to the end of the file to 44512027Sjungma@eit.uni-kl.de// eliminate source line number skew when check-ins are done. 44612027Sjungma@eit.uni-kl.de// 44712027Sjungma@eit.uni-kl.de// Revision 1.3 2011/08/24 22:05:56 acg 44812027Sjungma@eit.uni-kl.de// Torsten Maehne: initialization changes to remove warnings. 44912027Sjungma@eit.uni-kl.de// 45012027Sjungma@eit.uni-kl.de// Revision 1.2 2011/02/18 20:38:43 acg 45112027Sjungma@eit.uni-kl.de// Andy Goodrich: Updated Copyright notice. 45212027Sjungma@eit.uni-kl.de// 45312027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:06 acg 45412027Sjungma@eit.uni-kl.de// SystemC 2.3 45512027Sjungma@eit.uni-kl.de// 45612027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:53:10 acg 45712027Sjungma@eit.uni-kl.de// Andy Goodrich: Added $Log command so that CVS comments are reproduced in 45812027Sjungma@eit.uni-kl.de// the source. 45912027Sjungma@eit.uni-kl.de 46012027Sjungma@eit.uni-kl.de#endif 461