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 initial_hash = initial_hash % sz;
68 i = (initial_hash + j*j) % sz;
70 if (dict_arr_[i].free_b_)
73 if (dict_arr_[i].key_ == s)
83 /// remove #s# from the hash table.
84 V remove (K s, unsigned int initial_hash)
92 Hash table with sliding sizes.
94 template<class K, class V>
97 Fixed_size_hash_table<K,V> * fixed_p_;
98 /// set size to next prime, and copy contents
101 Fixed_size_hash_table<K,V> *f = new Fixed_size_hash_table<K,V> (fixed_p_->size_idx_ +1);
103 for (int i=0; i < fixed_p_->dict_arr_.size(); i++)
105 if (fixed_p_->dict_arr_[i].free_b_)
108 K nm (fixed_p_->dict_arr_[i].key_);
109 unsigned int h = (*hash_func_)(nm);
110 int nl = f->lookup (nm, h);
112 f->dict_arr_[nl] = Hash_table_entry<K,V> (nm, fixed_p_->dict_arr_[i].value_);
121 fixed_p_ = new Fixed_size_hash_table<K,V> (0);
127 void operator = (Hash_table<K,V> const &src)
133 fixed_p_ = new Fixed_size_hash_table<K,V> (*src.fixed_p_);
134 hash_func_ = src.hash_func_;
136 Hash_table (Hash_table<K,V> const &src)
138 fixed_p_ = new Fixed_size_hash_table<K,V> (*src.fixed_p_);
139 hash_func_ = src.hash_func_;
144 int i= fixed_p_->size_idx_;
146 fixed_p_ = new Fixed_size_hash_table<K,V> (i);
148 bool elem_b (K s) const
150 int l = fixed_p_->lookup (s, (*hash_func_)(s));
152 return (l >= 0 && !fixed_p_->dict_arr_[l].free_b_) ;
156 Find and return element. If #s# is not in the table, create an
157 entry in the table, and init */
161 unsigned int h = (*hash_func_)(s);
162 while ((l= fixed_p_->lookup (s,h)) <0)
167 fixed_p_->dict_arr_[l].free_b_ = false;
168 fixed_p_->dict_arr_[l].key_ = s;
169 return fixed_p_->dict_arr_[l].value_;
171 bool try_retrieve (K k, V *v)
173 int l = fixed_p_->lookup (k, (*hash_func_)(k));
174 if (l < 0 || fixed_p_->dict_arr_[l].free_b_)
178 *v = fixed_p_->dict_arr_[l].value_;
184 return const_elem (s);
186 V const_elem (K k) const
190 retval = ((Hash_table<K,V>*)this)->elem (k);
198 V operator [] (K k) const
200 return const_elem (k);
205 return fixed_p_->remove (s, (*hash_func_)(s));
207 friend class Hash_table_iter<K,V>;
209 unsigned int (*hash_func_)(K);
213 #endif /* HASH_TABLE_HH */