1 ///////////////////////////////////////////////////////////////////////////////
2 // A very simple hash table class.
3 ///////////////////////////////////////////////////////////////////////////////
7 #include <AD/generic/generic.h>
10 HashTable(const HashTable
&); // no copy constructor
11 void operator = (const HashTable
&); // no assignment
14 ////////////////////////////////////////////////////////////////////////////
16 ////////////////////////////////////////////////////////////////////////////
17 typedef const void * Key
;
18 typedef const void * Value
;
19 typedef unsigned int (*HashFunction
)(Key
);
20 typedef Bool (*Equality
)(Key
, Key
);
21 struct Entry
{ Key k
; Value v
; long hash_val
; };
25 ////////////////////////////////////////////////////////////////////////////
27 ////////////////////////////////////////////////////////////////////////////
28 HashFunction hash
; // hash function
29 Equality eq
; // equality function
30 int count
; // number of elements
31 int growth_limit
; // expand when this limit is reached
32 int capacity
; // capacity of the table
33 Entry
* table
; // the hash table itself.
37 ////////////////////////////////////////////////////////////////////////////
38 // Constructor and destructor
39 ////////////////////////////////////////////////////////////////////////////
40 HashTable(HashFunction
, Equality
, int = 32);
43 ////////////////////////////////////////////////////////////////////////////
45 ////////////////////////////////////////////////////////////////////////////
46 inline int size() const { return count
; }
47 inline Bool
is_empty() const { return count
== 0; }
48 inline Key
key (const Entry
* e
) const { return e
->k
; }
49 inline Value
value(const Entry
* e
) const { return e
->v
; }
50 inline Value
operator [] (Key k
) const { return lookup(k
)->v
; }
51 Bool
contains (Key key
) const;
52 Entry
* lookup (Key key
) const;
54 void insert (Key key
, Value value
);
55 Entry
* first () const;
56 Entry
* next (Entry
*) const;
59 const Entry
* private_lookup (unsigned int h
, Key key
) const;
62 ///////////////////////////////////////////////////////////////////////////////
64 ///////////////////////////////////////////////////////////////////////////////
65 #define foreach_entry(i,h) \
66 for (HashTable::Entry * i = (h).first(); i; i = (h).next(i))
67 #define key_of(T,h,i) (T)(long)((h).key(i))
68 #define value_of(T,h,i) (T)(long)((h).value(i))
70 ///////////////////////////////////////////////////////////////////////////////
71 // Some common hashing and equality functions.
72 ///////////////////////////////////////////////////////////////////////////////
73 unsigned int string_hash (HashTable::Key
);
74 Bool
string_equal (HashTable::Key
, HashTable::Key
);
75 unsigned int integer_hash (HashTable::Key
);
76 Bool
integer_equal (HashTable::Key
, HashTable::Key
);