222 ocean_assert(size_ <= elements_.size());
223 ocean_assert(isConsistent());
226 if (extendCapacity && size_ >= elements_.size() * 80 / 100)
228 *
this =
HashSet<T>(max(
size_t(32), elements_.size() * 2), std::move(*
this));
229 ocean_assert(size_ < elements_.size() * 80 / 100);
232 if (size_ == elements_.size())
240 for (
size_t n = 0; n < elements_.size(); ++n)
242 const size_t value = (function_(element) + n) % elements_.size();
245 if (elements_[value].first.first == 0)
247 elements_[value].first.first = 1;
248 elements_[value].first.second = n;
249 elements_[value].second = element;
254 else if (elements_[value].second == element)
257 const size_t startIndex = function_(element);
259 for (
size_t i = 0; i < n; ++i)
261 elements_[(startIndex + i) % elements_.size()].first.first--;
268 elements_[value].first.first++;
275 for (
size_t n = 0; n < elements_.size(); ++n)
277 const size_t value = (function_(element) + n) % elements_.size();
280 if (elements_[value].first.first == 0)
282 elements_[value].first.first = 1;
283 elements_[value].first.second = n;
284 elements_[value].second = element;
291 elements_[value].first.first++;
296 ocean_assert(
false &&
"This must never happen!");
303 ocean_assert(size_ <= elements_.size());
304 ocean_assert(isConsistent());
307 if (extendCapacity && size_ >= elements_.size() * 80 / 100)
309 *
this =
HashSet<T>(max(
size_t(32), elements_.size() * 2), std::move(*
this));
310 ocean_assert(size_ < elements_.size() * 80 / 100);
313 if (size_ == elements_.size())
321 for (
size_t n = 0; n < elements_.size(); ++n)
323 const size_t value = (function_(element) + n) % elements_.size();
326 if (elements_[value].first.first == 0)
328 elements_[value].first.first = 1;
329 elements_[value].first.second = n;
330 elements_[value].second = std::move(element);
335 else if (elements_[value].second == element)
338 const size_t startIndex = function_(element);
340 for (
size_t i = 0; i < n; ++i)
342 elements_[(startIndex + i) % elements_.size()].first.first--;
349 elements_[value].first.first++;
356 for (
size_t n = 0; n < elements_.size(); ++n)
358 const size_t value = (function_(element) + n) % elements_.size();
361 if (elements_[value].first.first == 0)
363 elements_[value].first.first = 1;
364 elements_[value].first.second = n;
365 elements_[value].second = std::move(element);
372 elements_[value].first.first++;
377 ocean_assert(
false &&
"This must never happen!");
384 ocean_assert(size_ <= elements_.size());
385 ocean_assert(isConsistent());
388 for (
size_t n = 0; n < elements_.size(); ++n)
390 const size_t value = (function_(element) + n) % elements_.size();
393 if (elements_[value].first.first == 0)
399 if (elements_[value].first.first == 1)
401 if (elements_[value].second == element)
404 const size_t startIndex = function_(element);
406 for (
size_t i = 0; i < n; ++i)
408 elements_[(startIndex + i) % elements_.size()].first.first--;
411 elements_[value].first.first = 0;
412 elements_[value].second = T();
415 ocean_assert(isConsistent());
424 ocean_assert(elements_[value].first.first > 1);
426 size_t elementOffset = 0u;
428 if (elements_[value].second == element)
432 size_t localValue = value;
433 size_t endLocation = elements_.size();
437 size_t lastOffset = 0;
440 for (
size_t i = 1; i < endLocation; ++i)
442 const size_t testValue = (localValue + i) % elements_.size();
444 if (elements_[testValue].first.first >= 1)
446 if (elements_[testValue].first.second >= i)
452 if (elements_[testValue].first.first <= 1)
463 ocean_assert(endLocation >= lastOffset);
464 endLocation -= lastOffset;
466 elementOffset += lastOffset;
468 const size_t lastValue = (localValue + lastOffset) % elements_.size();
473 elements_[localValue].first.second = elements_[lastValue].first.second - lastOffset;
474 elements_[localValue].second = elements_[lastValue].second;
476 localValue = lastValue;
478 if (elements_[lastValue].first.first == 1)
485 const size_t startIndex = function_(element);
487 for (
size_t i = 0u; i < elementOffset + n; ++i)
488 elements_[(startIndex + i) % elements_.size()].first.first--;
490 elements_[(value + elementOffset) % elements_.size()].first.first = 0;
491 elements_[(value + elementOffset) % elements_.size()].second = T();
494 ocean_assert(isConsistent());
500 ocean_assert(
false &&
"This must never happen!");
507 ocean_assert(size_ <= elements_.size());
508 ocean_assert(isConsistent());
511 for (
size_t n = 0; n < elements_.size(); ++n)
513 const size_t value = (function_(element) + n) % elements_.size();
516 if (elements_[value].first.first == 0)
522 if (elements_[value].second == element)
528 if (elements_[value].first.first == 1)
610 size_t slotCounters = 0;
611 size_t probeSequenceLengths = 0;
613 for (
const Element& element : elements_)
615 slotCounters += element.first.first;
617 if (element.first.first != 0)
620 probeSequenceLengths += element.first.second + 1;
624 return count == size_ && slotCounters == probeSequenceLengths;
bool insert(const T &element, const bool oneOnly=true, const bool extendCapacity=true)
Adds a new element to this hash set.
Definition HashSet.h:220
typename std::pair< std::pair< size_t, size_t >, T > Element
Definition of a pair combining a counter states and an object.
Definition HashSet.h:31