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