35 typedef std::pair<const KEY, VAL> value_type;
36 typedef VAL mapped_type;
38 typedef PRED key_equal;
39 typedef ALLOC allocator_type;
41 typedef typename std::vector<value_type>::pointer pointer;
42 typedef typename std::vector<value_type>::const_pointer const_pointer;
43 typedef typename std::vector<value_type>::reference reference;
44 typedef typename std::vector<value_type>::const_reference const_reference;
48 explicit hvec_map(
size_t icap = 0,
const hasher &hf = hasher(),
49 const key_equal &eql = key_equal(),
50 const allocator_type &a = allocator_type())
57 if (
this != std::addressof(that)) {
62 data.reserve(that.size());
63 insert(that.begin(), that.end());
71 hvec_map(ITER begin, ITER end,
const hasher &hf = hasher(),
const key_equal &eql = key_equal(),
72 const allocator_type &a = allocator_type())
74 data.reserve(end - begin);
75 for (
auto it = begin; it != end; ++it) insert(*it);
77 hvec_map(std::initializer_list<value_type> il,
const hasher &hf = hasher(),
78 const key_equal &eql = key_equal(),
const allocator_type &a = allocator_type())
80 data.reserve(il.size());
81 for (
auto &i : il) insert(i);
85 template <
class HVM,
class VT>
91 _iter(HVM &s,
size_t i) : self(&s), idx(i) {}
94 using value_type = VT;
95 using difference_type = ssize_t;
96 using pointer =
typename HVM::pointer;
97 using reference =
typename HVM::reference;
98 using iterator_category = std::bidirectional_iterator_tag;
99 _iter(
const _iter &) =
default;
100 _iter &operator=(
const _iter &a) {
105 value_type &operator*()
const {
return self->data[idx]; }
106 value_type *operator->()
const {
return &self->data[idx]; }
107 _iter &operator++() {
110 }
while (self->erased[idx]);
113 _iter &operator--() {
116 }
while (self->erased[idx]);
119 _iter operator++(
int) {
124 _iter operator--(
int) {
129 bool operator==(
const _iter &a)
const {
return self == a.self && idx == a.idx; }
130 bool operator!=(
const _iter &a)
const {
return self != a.self || idx != a.idx; }
131 operator _iter<const HVM, const VT>()
const {
132 return _iter<const HVM, const VT>(*self, idx);
137 typedef _iter<hvec_map, value_type> iterator;
138 typedef _iter<const hvec_map, const value_type> const_iterator;
139 iterator begin() {
return iterator(*
this, erased.ffz()); }
140 iterator end() {
return iterator(*
this, data.size()); }
141 const_iterator begin()
const {
return const_iterator(*
this, erased.ffz()); }
142 const_iterator end()
const {
return const_iterator(*
this, data.size()); }
143 const_iterator cbegin()
const {
return const_iterator(*
this, erased.ffz()); }
144 const_iterator cend()
const {
return const_iterator(*
this, data.size()); }
146 bool empty()
const {
return inuse == 0; }
147 size_t size()
const {
return inuse; }
148 size_t max_size()
const {
return UINT32_MAX; }
149 bool operator==(
const hvec_map &a)
const {
150 if (inuse != a.inuse)
return false;
153 if (el != *it++)
return false;
156 bool operator!=(
const hvec_map &a)
const {
return !(*
this == a); }
158 hash_vector_base::clear();
162 iterator find(
const KEY &k) {
164 size_t idx = hash_vector_base::find(&k, &cache);
165 return idx ? iterator(*
this, idx - 1) : end();
167 const_iterator find(
const KEY &k)
const {
169 size_t idx = hash_vector_base::find(&k, &cache);
170 return idx ? const_iterator(*
this, idx - 1) : end();
172 size_t count(
const KEY &k)
const {
174 size_t idx = hash_vector_base::find(&k, &cache);
179 VAL &operator[](
const KEY &k) {
180 size_t idx = hv_insert(&k);
181 if (idx >= data.size()) {
182 data.emplace_back(k, VAL());
183 return data.back().second;
187 const_cast<KEY &
>(data[idx].first) = k;
188 data[idx].second = VAL();
190 return data[idx].second;
193 VAL &operator[](KEY &&k) {
194 size_t idx = hv_insert(&k);
195 if (idx >= data.size()) {
196 data.emplace_back(std::move(k), VAL());
197 return data.back().second;
201 const_cast<KEY &
>(data[idx].first) = std::move(k);
202 data[idx].second = VAL();
204 return data[idx].second;
209 template <
typename... VV>
210 std::pair<iterator, bool> emplace(
const KEY &k, VV &&...v) {
211 bool new_key =
false;
212 size_t idx = hv_insert(&k);
213 if (idx >= data.size()) {
215 data.emplace_back(std::piecewise_construct_t(), std::forward_as_tuple(k),
216 std::forward_as_tuple(std::forward<VV>(v)...));
219 if ((new_key = erased[idx])) {
221 const_cast<KEY &
>(data[idx].first) = k;
222 data[idx].second = VAL(std::forward<VV>(v)...);
224 data[idx].second = VAL(std::forward<VV>(v)...);
227 return std::make_pair(iterator(*
this, idx), new_key);
229 template <
typename... VV>
230 std::pair<iterator, bool> emplace(KEY &&k, VV &&...v) {
231 bool new_key =
false;
232 size_t idx = hv_insert(&k);
233 if (idx >= data.size()) {
235 data.emplace_back(std::piecewise_construct_t(), std::forward_as_tuple(std::move(k)),
236 std::forward_as_tuple(std::forward<VV>(v)...));
238 }
else if ((new_key = erased[idx])) {
240 const_cast<KEY &
>(data[idx].first) = std::move(k);
241 data[idx].second = VAL(std::forward<VV>(v)...);
243 return std::make_pair(iterator(*
this, idx), new_key);
245 std::pair<iterator, bool> insert(
const value_type &v) {
246 bool new_key =
false;
247 size_t idx = hv_insert(&v.first);
248 if (idx >= data.size()) {
252 }
else if ((new_key = erased[idx])) {
254 const_cast<KEY &
>(data[idx].first) = v.first;
255 data[idx].second = v.second;
257 return std::make_pair(iterator(*
this, idx), new_key);
259 template <
typename InputIterator>
260 void insert(InputIterator first, InputIterator last) {
261 for (; first != last; ++first) insert(*first);
263 void insert(std::initializer_list<value_type> vl) {
return insert(vl.begin(), vl.end()); }
264 template <
class HVM,
class VT>
265 _iter<HVM, VT> erase(_iter<HVM, VT> it) {
266 BUG_CHECK(
this == it.self,
"incorrect iterator for hvec_map::erase");
271 const_cast<KEY &
>(data[it.idx].first) = KEY();
272 data[it.idx].second = VAL();
277 size_t erase(
const KEY &k) {
278 size_t idx = remove(&k);
279 if (idx + 1 == 0)
return 0;
280 if (idx < data.size()) {
281 const_cast<KEY &
>(data[idx].first) = KEY();
282 data[idx].second = VAL();
287 using hash_vector_base::dump;
291 std::vector<value_type, ALLOC> data;
292 size_t hashfn(
const void *a)
const override {
return hf(*
static_cast<const KEY *
>(a)); }
293 bool cmpfn(
const void *a,
const void *b)
const override {
294 return eql(*
static_cast<const KEY *
>(a), *
static_cast<const KEY *
>(b));
296 bool cmpfn(
const void *a,
size_t b)
const override {
297 return eql(*
static_cast<const KEY *
>(a), data[b].first);
299 const void *getkey(uint32_t i)
const override {
return &data[i].first; }
300 void *getval(uint32_t i)
override {
return &data[i].second; }
301 uint32_t limit()
override {
return data.size(); }
302 void resizedata(
size_t sz)
override { data.resize(sz); }
303 void moveentry(
size_t to,
size_t from)
override {
305 data[to].~value_type();
306 new (&data[to]) value_type(std::move(data[from]));