20 template <
typename KEY,
typename VALUE>
58 typename KEY,
typename VALUE,
unsigned int NUM_BYTES_HASH_TABLE = 1,
59 unsigned int NUM_HAS_TABLE_COLLISIONS_ALLOWED = 5,
60 typename VECTOR_T = std::array<
61 std::array<ts_map_entry<KEY, VALUE>, NUM_HAS_TABLE_COLLISIONS_ALLOWED>,
62 1u << (8 * NUM_BYTES_HASH_TABLE)>>
69 KEY, VALUE, NUM_BYTES_HASH_TABLE, NUM_HAS_TABLE_COLLISIONS_ALLOWED,
72 using value_type = ts_map_entry<KEY, VALUE>;
73 using vec_t = VECTOR_T;
80 :
m_vec(nullptr), m_parent(nullptr), m_idx_outer(0), m_idx_inner(0)
84 const VECTOR_T& vec,
const self_t& parent,
int idx_outer,
86 :
m_vec(const_cast<VECTOR_T*>(&vec)),
87 m_parent(const_cast<self_t*>(&parent)),
88 m_idx_outer(idx_outer),
89 m_idx_inner(idx_inner)
95 m_idx_outer = o.m_idx_outer;
96 m_idx_inner = o.m_idx_inner;
101 return m_vec == o.m_vec && m_idx_outer == o.m_idx_outer &&
102 m_idx_inner == o.m_idx_inner;
107 return (*
m_vec)[m_idx_outer][m_idx_inner];
109 const value_type* operator->()
const
111 return &(*m_vec)[m_idx_outer][m_idx_inner];
128 int m_idx_outer, m_idx_inner;
135 if (++m_idx_inner >= (
int)NUM_HAS_TABLE_COLLISIONS_ALLOWED)
140 }
while (m_idx_outer < (
int)m_parent->m_vec.size() &&
141 !(*
m_vec)[m_idx_outer][m_idx_inner].used);
149 iterator(VECTOR_T& vec, self_t& parent,
int idx_outer,
int idx_inner)
156 [const_iterator::m_idx_inner];
158 value_type* operator->()
160 return &(*const_iterator::m_vec)[const_iterator::m_idx_outer]
161 [const_iterator::m_idx_inner];
171 const_iterator::incr();
191 for (
size_t oi = 0; oi <
m_vec.size(); oi++)
192 for (
size_t ii = 0; ii < NUM_HAS_TABLE_COLLISIONS_ALLOWED; ii++)
193 m_vec[oi][ii] = value_type();
204 std::array<ts_map_entry<KEY, VALUE>, NUM_HAS_TABLE_COLLISIONS_ALLOWED>&
205 match_arr =
m_vec[hash];
206 for (
unsigned int i = 0; i < NUM_HAS_TABLE_COLLISIONS_ALLOWED; i++)
208 if (!match_arr[i].used)
211 match_arr[i].used =
true;
212 match_arr[i].first = key;
213 return match_arr[i].second;
215 if (match_arr[i].
first == key)
return match_arr[i].second;
217 throw std::runtime_error(
"ts_hash_map: too many hash collisions!");
226 match_arr =
m_vec[hash];
227 for (
unsigned int i = 0; i < NUM_HAS_TABLE_COLLISIONS_ALLOWED; i++)
229 if (match_arr[i].used && match_arr[i].
first == key)