223 function_(hashMap.function_)
225 ocean_assert(
capacity >= hashMap.size());
227 for (
Element& hashMapElement : hashMap.elements_)
229 if (hashMapElement.first.first != 0)
231 TKey& key = hashMapElement.second.first;
232 T&
element = hashMapElement.second.second;
239 ocean_assert(
size() == hashMap.size());
248 ocean_assert(size_ <= elements_.size());
249 ocean_assert(isConsistent());
252 if (extendCapacity && size_ >= elements_.size() * 80 / 100)
254 *
this =
HashMap<TKey, T>(max(
size_t(32), elements_.size() * 2), std::move(*
this));
255 ocean_assert(size_ < elements_.size() * 80 / 100);
258 if (size_ == elements_.size())
266 for (
size_t n = 0; n < elements_.size(); ++n)
268 const size_t value = (function_(key) + n) % elements_.size();
271 if (elements_[value].first.first == 0)
273 elements_[value].first.first = 1;
274 elements_[value].first.second = n;
275 elements_[value].second.first = key;
276 elements_[value].second.second = element;
281 else if (elements_[value].second.first == key)
284 const size_t startIndex = function_(key);
286 for (
size_t i = 0; i < n; ++i)
288 elements_[(startIndex + i) % elements_.size()].first.first--;
295 elements_[value].first.first++;
302 for (
size_t n = 0; n < elements_.size(); ++n)
304 const size_t value = (function_(key) + n) % elements_.size();
307 if (elements_[value].first.first == 0)
309 elements_[value].first.first = 1;
310 elements_[value].first.second = n;
311 elements_[value].second.first = key;
312 elements_[value].second.second = element;
319 elements_[value].first.first++;
324 ocean_assert(
false &&
"This must never happen!");
331 ocean_assert(size_ <= elements_.size());
332 ocean_assert(isConsistent());
335 if (extendCapacity && size_ >= elements_.size() * 80 / 100)
337 *
this =
HashMap<TKey, T>(max(
size_t(32), elements_.size() * 2), std::move(*
this));
338 ocean_assert(size_ < elements_.size() * 80 / 100);
341 if (size_ == elements_.size())
349 for (
size_t n = 0; n < elements_.size(); ++n)
351 const size_t value = (function_(key) + n) % elements_.size();
354 if (elements_[value].first.first == 0)
356 elements_[value].first.first = 1;
357 elements_[value].first.second = n;
358 elements_[value].second.first = std::move(key);
359 elements_[value].second.second = std::move(element);
364 else if (elements_[value].second.first == key)
367 const size_t startIndex = function_(key);
369 for (
size_t i = 0; i < n; ++i)
371 elements_[(startIndex + i) % elements_.size()].first.first--;
378 elements_[value].first.first++;
385 for (
size_t n = 0; n < elements_.size(); ++n)
387 const size_t value = (function_(key) + n) % elements_.size();
390 if (elements_[value].first.first == 0)
392 elements_[value].first.first = 1;
393 elements_[value].first.second = n;
394 elements_[value].second.first = std::move(key);
395 elements_[value].second.second = std::move(element);
402 elements_[value].first.first++;
407 ocean_assert(
false &&
"This must never happen!");
414 ocean_assert(size_ <= elements_.size());
415 ocean_assert(isConsistent());
418 for (
size_t n = 0; n < elements_.size(); ++n)
420 const size_t value = (function_(key) + n) % elements_.size();
423 if (elements_[value].first.first == 0)
429 if (elements_[value].first.first == 1)
431 if (elements_[value].second.first == key)
434 const size_t startIndex = function_(key);
436 for (
size_t i = 0; i < n; ++i)
438 elements_[(startIndex + i) % elements_.size()].first.first--;
441 elements_[value].first.first = 0;
442 elements_[value].second.first = TKey();
443 elements_[value].second.second = T();
446 ocean_assert(isConsistent());
455 ocean_assert(elements_[value].first.first > 1);
457 size_t elementOffset = 0u;
459 if (elements_[value].second.first == key)
463 size_t localValue = value;
464 size_t endLocation = elements_.size();
468 size_t lastOffset = 0;
471 for (
size_t i = 1; i < endLocation; ++i)
473 const size_t testValue = (localValue + i) % elements_.size();
475 if (elements_[testValue].first.first >= 1)
477 if (elements_[testValue].first.second >= i)
483 if (elements_[testValue].first.first <= 1)
494 ocean_assert(endLocation >= lastOffset);
495 endLocation -= lastOffset;
497 elementOffset += lastOffset;
499 const size_t lastValue = (localValue + lastOffset) % elements_.size();
504 elements_[localValue].first.second = elements_[lastValue].first.second - lastOffset;
505 elements_[localValue].second = elements_[lastValue].second;
507 localValue = lastValue;
509 if (elements_[lastValue].first.first == 1)
516 const size_t startIndex = function_(key);
518 for (
size_t i = 0u; i < elementOffset + n; ++i)
520 elements_[(startIndex + i) % elements_.size()].first.first--;
523 elements_[(value + elementOffset) % elements_.size()].first.first = 0;
524 elements_[(value + elementOffset) % elements_.size()].second.first = TKey();
525 elements_[(value + elementOffset) % elements_.size()].second.second = T();
528 ocean_assert(isConsistent());
534 ocean_assert(
false &&
"This must never happen!");
541 ocean_assert(size_ <= elements_.size());
542 ocean_assert(isConsistent());
545 for (
size_t n = 0; n < elements_.size(); ++n)
547 const size_t value = (function_(key) + n) % elements_.size();
550 if (elements_[value].first.first == 0)
556 if (elements_[value].second.first == key)
562 if (elements_[value].first.first == 1)
574 ocean_assert(size_ <= elements_.size());
575 ocean_assert(isConsistent());
578 for (
size_t n = 0; n < elements_.size(); ++n)
580 const size_t value = (function_(key) + n) % elements_.size();
583 if (elements_[value].first.first == 0)
589 if (elements_[value].second.first == key)
591 element = &elements_[value].second.second;
596 if (elements_[value].first.first == 1)
608 ocean_assert(size_ <= elements_.size());
609 ocean_assert(isConsistent());
612 for (
size_t n = 0; n < elements_.size(); ++n)
614 const size_t value = (function_(key) + n) % elements_.size();
617 if (elements_[value].first.first == 0)
623 if (elements_[value].second.first == key)
625 element = &elements_[value].second.second;
630 if (elements_[value].first.first == 1)
642 ocean_assert(size_ <= elements_.size());
643 ocean_assert(isConsistent());
646 for (
size_t n = 0; n < elements_.size(); ++n)
648 const size_t value = (function_(key) + n) % elements_.size();
651 if (elements_[value].first.first == 0)
657 if (elements_[value].second.first == key)
659 return elements_[value].second.second;
663 if (elements_[value].first.first == 1)
669 ocean_assert(
false &&
"Invalid key!");
670 return elements_.cbegin()->second.second;
typename std::pair< std::pair< size_t, size_t >, std::pair< TKey, T > > Element
Definition of a pair combining a counter states and an object.
Definition HashMap.h:30
bool insert(const TKey &key, const T &element, const bool oneOnly=true, const bool extendCapacity=true)
Adds a new element to this hash map.
Definition HashMap.h:246