2 hash-table.hh -- declare Hash_table_entry, Hash_table
4 source file of the Flower Library
6 (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
13 unsigned int int_hash (int);
14 unsigned long prime_list (int idx);
15 template<class K, class V> struct Hash_table_iter;
21 return int_hash ((unsigned int) p);
24 template<class K, class V>
25 struct Hash_table_entry
34 Hash_table_entry (K s, V v)
43 A hash table of prime size.
45 We use quadratic probing.
47 template<class K, class V>
48 class Fixed_size_hash_table
51 Array<Hash_table_entry<K,V> > dict_arr_;
53 Fixed_size_hash_table (int size_idx)
56 int sz = prime_list(size_idx_);
57 dict_arr_.set_size (sz);
60 /// find #s#, or find first empty entry corresponding to #s#
61 int lookup (K s, unsigned int initial_hash)
63 int sz =dict_arr_.size ();
64 int i = initial_hash % sz;
67 if (dict_arr_[i].free_b_)
70 if (dict_arr_[i].key_ == s)
81 /// remove #s# from the hash table.
82 V remove (K s, unsigned int initial_hash)
90 Hash table with sliding sizes.
92 template<class K, class V>
95 Fixed_size_hash_table<K,V> * fixed_p_;
96 /// set size to next prime, and copy contents
99 Fixed_size_hash_table<K,V> *f = new Fixed_size_hash_table<K,V> (fixed_p_->size_idx_ +1);
101 for (int i=0; i < fixed_p_->dict_arr_.size(); i++)
103 if (fixed_p_->dict_arr_[i].free_b_)
106 K nm (fixed_p_->dict_arr_[i].key_);
107 unsigned int h = (*hash_func_)(nm);
108 int nl = f->lookup (nm, h);
110 f->dict_arr_[nl] = Hash_table_entry<K,V> (nm, fixed_p_->dict_arr_[i].value_);
119 fixed_p_ = new Fixed_size_hash_table<K,V> (0);
125 void operator = (Hash_table<K,V> const &src)
131 fixed_p_ = new Fixed_size_hash_table<K,V> (*src.fixed_p_);
132 hash_func_ = src.hash_func_;
134 Hash_table (Hash_table<K,V> const &src)
136 fixed_p_ = new Fixed_size_hash_table<K,V> (*src.fixed_p_);
137 hash_func_ = src.hash_func_;
142 int i= fixed_p_->size_idx_;
144 fixed_p_ = new Fixed_size_hash_table<K,V> (i);
146 bool elem_b (K s) const
148 int l = fixed_p_->lookup (s, (*hash_func_)(s));
150 return (l >= 0 && !fixed_p_->dict_arr_[l].free_b_) ;
154 Find and return element. If #s# is not in the table, create an entry in the table, and init
159 unsigned int h = (*hash_func_)(s);
160 while ((l= fixed_p_->lookup (s,h)) <0)
165 fixed_p_->dict_arr_[l].free_b_ = false;
166 fixed_p_->dict_arr_[l].key_ = s;
167 return fixed_p_->dict_arr_[l].value_;
171 return const_elem (s);
173 V const_elem (K k) const
177 retval = ((Hash_table<K,V>*)this)->elem (k);
185 V operator [] (K k) const
187 return const_elem (k);
192 return fixed_p_->remove (s, (*hash_func_)(s));
194 friend class Hash_table_iter<K,V>;
196 unsigned int (*hash_func_)(K);
200 #endif /* HASH_TABLE_HH */