34 #if 1 || defined(__STDC__) || defined(__ANSI_CPP__) 35 #define __TableEntry(Table) Table##_Entry 36 #define TableEntry(Table) __TableEntry(Table) 37 #define __TableIterator(Table) Table##_Iterator 38 #define TableIterator(Table) __TableIterator(Table) 40 #define __TableEntry(Table) Table_Entry
41 #define TableEntry(Table) __TableEntry(Table) 42 #define __TableIterator(Table) Table_Iterator
43 #define TableIterator(Table) __TableIterator(Table) 46 #define declareTable(Table,Key,Value) \ 47 struct TableEntry(Table); \ 54 void insert(Key, Value); \ 55 bool find(Value&, Key); \ 56 bool find_and_remove(Value&, Key); \ 59 friend class TableIterator(Table); \ 62 TableEntry(Table)** first_; \ 63 TableEntry(Table)** last_; \ 65 TableEntry(Table)*& probe(Key); \ 68 struct TableEntry(Table) { \ 71 friend class TableIterator(Table); \ 75 TableEntry(Table)* chain_; \ 78 class TableIterator(Table) { \ 80 TableIterator(Table)(Table&); \ 87 TableEntry(Table)* cur_; \ 88 TableEntry(Table)** entry_; \ 89 TableEntry(Table)** last_; \ 92 inline Key& TableIterator(Table)::cur_key() { return cur_->key_; } \ 93 inline Value& TableIterator(Table)::cur_value() { return cur_->value_; } \ 94 inline bool TableIterator(Table)::more() { return entry_ <= last_; } 102 #if defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ > __SIZEOF_LONG__ 103 inline unsigned long key_to_hash(
const void*
k) {
return (
unsigned long)((
unsigned long long)k); }
105 inline unsigned long key_to_hash(
const void*
k) {
return (
unsigned long)
k; }
113 #define implementTable(Table,Key,Value) \ 114 Table::Table(int n) { \ 115 for (size_ = 32; size_ < n; size_ <<= 1); \ 116 first_ = new TableEntry(Table)*[size_]; \ 118 last_ = &first_[size_]; \ 119 for (TableEntry(Table)** e = first_; e <= last_; e++) { \ 125 for (TableEntry(Table)** e = first_; e <= last_; e++) { \ 126 TableEntry(Table)* t = *e; \ 127 for (TableEntry(Table)* i = t; i; i = t) { \ 135 inline TableEntry(Table)*& Table::probe(Key i) { \ 136 return first_[key_to_hash(i) & size_]; \ 139 void Table::insert(Key k, Value v) { \ 140 TableEntry(Table)* e = new TableEntry(Table); \ 143 TableEntry(Table)** a = &probe(k); \ 148 bool Table::find(Value& v, Key k) { \ 149 for (TableEntry(Table)* e = probe(k); e != nil; e = e->chain_) { \ 150 if (e->key_ == k) { \ 158 bool Table::find_and_remove(Value& v, Key k) { \ 159 TableEntry(Table)** a = &probe(k); \ 160 TableEntry(Table)* e = *a; \ 162 if (e->key_ == k) { \ 168 TableEntry(Table)* prev; \ 172 } while (e != nil && e->key_ != k); \ 175 prev->chain_ = e->chain_; \ 184 void Table::remove(Key k) { \ 185 TableEntry(Table)** a = &probe(k); \ 186 TableEntry(Table)* e = *a; \ 188 if (e->key_ == k) { \ 192 TableEntry(Table)* prev; \ 196 } while (e != nil && e->key_ != k); \ 198 prev->chain_ = e->chain_; \ 205 TableIterator(Table)::TableIterator(Table)(Table& t) { \ 207 for (entry_ = t.first_; entry_ <= last_; entry_++) { \ 215 bool TableIterator(Table)::next() { \ 216 cur_ = cur_->chain_; \ 220 for (++entry_; entry_ <= last_; entry_++) { \ static philox4x32_key_t k
unsigned long key_to_hash(long k)