34 #if defined(__STDC__) || defined(__ANSI_CPP__) 35 #define __Table2Entry(Table2) Table2##_Entry 36 #define Table2Entry(Table2) __Table2Entry(Table2) 37 #define __Table2Iterator(Table2) Table2##_Iterator 38 #define Table2Iterator(Table2) __Table2Iterator(Table2) 40 #define __Table2Entry(Table2) Table2_Entry
41 #define Table2Entry(Table2) __Table2Entry(Table2) 42 #define __Table2Iterator(Table2) Table2_Iterator
43 #define Table2Iterator(Table2) __Table2Iterator(Table2) 46 #define declareTable2(Table2,Key1,Key2,Value) \ 47 struct Table2Entry(Table2); \ 54 void insert(Key1, Key2, Value); \ 55 bool find(Value&, Key1, Key2); \ 56 void remove(Key1, Key2); \ 58 friend class Table2Iterator(Table2); \ 61 Table2Entry(Table2)** first_; \ 62 Table2Entry(Table2)** last_; \ 64 Table2Entry(Table2)*& probe(Key1, Key2); \ 67 struct Table2Entry(Table2) { \ 69 friend class Table2; \ 70 friend class Table2Iterator(Table2); \ 75 Table2Entry(Table2)* chain_; \ 78 class Table2Iterator(Table2) { \ 80 Table2Iterator(Table2)(Table2&); \ 88 Table2Entry(Table2)* cur_; \ 89 Table2Entry(Table2)** entry_; \ 90 Table2Entry(Table2)** last_; \ 93 inline Key1& Table2Iterator(Table2)::cur_key1() { return cur_->key1_; } \ 94 inline Key2& Table2Iterator(Table2)::cur_key2() { return cur_->key2_; } \ 95 inline Value& Table2Iterator(Table2)::cur_value() { return cur_->value_; } \ 96 inline bool Table2Iterator(Table2)::more() { return entry_ <= last_; } 104 inline unsigned long key_to_hash(
const void*
k) {
return (
unsigned long)
k; }
111 #define implementTable2(Table2,Key1,Key2,Value) \ 112 Table2::Table2(int n) { \ 113 for (size_ = 32; size_ < n; size_ <<= 1); \ 114 first_ = new Table2Entry(Table2)*[size_]; \ 116 last_ = &first_[size_]; \ 117 for (Table2Entry(Table2)** e = first_; e <= last_; e++) { \ 122 Table2::~Table2() { \ 126 inline Table2Entry(Table2)*& Table2::probe(Key1 k1, Key2 k2) { \ 127 return first_[(key_to_hash(k1) ^ key_to_hash(k2)) & size_]; \ 130 void Table2::insert(Key1 k1, Key2 k2, Value v) { \ 131 Table2Entry(Table2)* e = new Table2Entry(Table2); \ 135 Table2Entry(Table2)** a = &probe(k1, k2); \ 140 bool Table2::find(Value& v, Key1 k1, Key2 k2) { \ 142 Table2Entry(Table2)* e = probe(k1, k2); \ 146 if (e->key1_ == k1 && e->key2_ == k2) { \ 154 void Table2::remove(Key1 k1, Key2 k2) { \ 155 Table2Entry(Table2)** a = &probe(k1, k2); \ 156 Table2Entry(Table2)* e = *a; \ 158 if (e->key1_ == k1 && e->key2_ == k2) { \ 162 Table2Entry(Table2)* prev; \ 166 } while (e != nil && (e->key1_ != k1 || e->key2_ != k2)); \ 168 prev->chain_ = e->chain_; \ 175 Table2Iterator(Table2)::Table2Iterator(Table2)(Table2& t) { \ 177 for (entry_ = t.first_; entry_ <= last_; entry_++) { \ 185 bool Table2Iterator(Table2)::next() { \ 186 cur_ = cur_->chain_; \ 190 for (++entry_; entry_ <= last_; entry_++) { \ unsigned long key_to_hash(long k)
static philox4x32_key_t k