24 #ifndef TSL_ROBIN_HASH_H 25 #define TSL_ROBIN_HASH_H 39 #include <type_traits> 45 namespace detail_robin_hash {
66 template <std::
size_t GrowthFactor>
122 template <
typename ValueType,
bool StoreHash>
146 std::is_nothrow_copy_constructible<value_type>::value)
150 if (!other.empty()) {
162 std::is_nothrow_move_constructible<value_type>::value)
167 if (!other.empty()) {
168 ::new (static_cast<void *>(std::addressof(
m_value)))
value_type(std::move(other.value()));
174 std::is_nothrow_copy_constructible<value_type>::value)
176 if (
this != &other) {
179 bucket_hash::operator=(other);
180 if (!other.empty()) {
226 template <
typename... Args>
233 ::new (static_cast<void *>(std::addressof(
m_value)))
234 value_type(std::forward<Args>(value_type_args)...);
247 swap(value_, this->
value());
268 value().~value_type();
272 using storage =
typename std::aligned_storage<sizeof(value_type), alignof(value_type)>::type;
300 template <
class ValueType,
class KeySelect,
class ValueSelect,
class Hash,
class KeyEqual,
301 class Allocator,
bool StoreHash,
class GrowthPolicy>
302 class robin_hash :
private Hash,
private KeyEqual,
private GrowthPolicy
305 template <
typename U>
306 using has_mapped_type =
typename std::integral_constant<bool, !std::is_same<U, void>::value>;
308 static_assert(noexcept(std::declval<GrowthPolicy>().
bucket_for_hash(std::size_t(0))),
309 "GrowthPolicy::bucket_for_hash must be noexcept.");
310 static_assert(noexcept(std::declval<GrowthPolicy>().
clear()),
311 "GrowthPolicy::clear must be noexcept.");
342 (!std::is_arithmetic<key_type>::value ||
343 !std::is_same<Hash, std::hash<key_type>>::value));
365 return (
bucket_count - 1) <= std::numeric_limits<truncated_hash_type>::max();
376 typename std::allocator_traits<allocator_type>::template rebind_alloc<bucket_entry>;
391 template <
bool IsConst>
class robin_iterator
397 typename std::conditional<IsConst,
typename buckets_container_type::const_iterator,
398 typename buckets_container_type::iterator>::type;
420 template <
class U = ValueSelect,
421 typename std::enable_if<has_mapped_type<U>::value && IsConst>::type * =
nullptr>
422 const typename U::value_type &
value()
const 427 template <
class U = ValueSelect,
428 typename std::enable_if<has_mapped_type<U>::value && !IsConst>::type * =
nullptr>
463 return lhs.m_iterator == rhs.m_iterator;
468 return !(lhs == rhs);
477 const Allocator &alloc,
float max_load_factor_)
478 : Hash(hash), KeyEqual(equal), GrowthPolicy(bucket_count_),
m_buckets(alloc),
516 std::is_nothrow_move_constructible<Hash>::value &&std::is_nothrow_move_constructible<
517 KeyEqual>::value &&std::is_nothrow_move_constructible<GrowthPolicy>::value
518 && std::is_nothrow_move_constructible<buckets_container_type>::value)
519 : Hash(std::move(static_cast<Hash &>(other))),
520 KeyEqual(std::move(static_cast<KeyEqual &>(other))),
521 GrowthPolicy(std::move(static_cast<GrowthPolicy &>(other))),
529 other.GrowthPolicy::clear();
530 other.m_buckets.clear();
532 other.m_bucket_count = 0;
533 other.m_nb_elements = 0;
534 other.m_load_threshold = 0;
535 other.m_grow_on_next_insert =
false;
540 if (&other !=
this) {
541 Hash:: operator=(other);
542 KeyEqual:: operator=(other);
543 GrowthPolicy::operator=(other);
574 while (begin_ !=
m_buckets.end() && begin_->empty()) {
586 while (begin_ !=
m_buckets.cend() && begin_->empty()) {
621 template <
typename P> std::pair<iterator, bool>
insert(P &&value)
623 return insert_impl(KeySelect()(value), std::forward<P>(value));
628 if (hint !=
cend() &&
compare_keys(KeySelect()(*hint), KeySelect()(value))) {
632 return insert(std::forward<P>(value)).first;
635 template <
class InputIt>
void insert(InputIt first, InputIt last)
637 if (std::is_base_of<std::forward_iterator_tag,
638 typename std::iterator_traits<InputIt>::iterator_category>::value) {
639 const auto nb_elements_insert = std::distance(first, last);
643 if (nb_elements_insert > 0 && nb_free_buckets <
size_type(nb_elements_insert)) {
648 for (; first != last; ++first) {
655 auto it =
try_emplace(std::forward<K>(key), std::forward<M>(obj));
657 it.first.value() = std::forward<M>(obj);
667 it.value() = std::forward<M>(obj);
675 template <
class... Args> std::pair<iterator, bool>
emplace(Args &&... args)
685 template <
class K,
class... Args>
689 std::forward_as_tuple(std::forward<K>(key)),
690 std::forward_as_tuple(std::forward<Args>(args)...));
693 template <
class K,
class... Args>
700 return try_emplace(std::forward<K>(key), std::forward<Args>(args)...).first;
715 if (pos.m_iterator->empty()) {
732 for (
auto it = first_mutable.m_iterator; it != last_mutable.m_iterator; ++it) {
739 if (last_mutable ==
end()) {
747 std::size_t icloser_bucket =
748 std::size_t(std::distance(
m_buckets.begin(), first_mutable.m_iterator));
749 std::size_t ito_move_closer_value =
750 std::size_t(std::distance(
m_buckets.begin(), last_mutable.m_iterator));
751 tsl_assert(ito_move_closer_value > icloser_bucket);
753 const std::size_t ireturn_bucket =
754 ito_move_closer_value -
755 std::min(ito_move_closer_value - icloser_bucket,
756 std::size_t(
m_buckets[ito_move_closer_value].dist_from_ideal_bucket()));
758 while (ito_move_closer_value <
m_buckets.size() &&
759 m_buckets[ito_move_closer_value].dist_from_ideal_bucket() > 0) {
761 ito_move_closer_value -
762 std::min(ito_move_closer_value - icloser_bucket,
763 std::size_t(
m_buckets[ito_move_closer_value].dist_from_ideal_bucket()));
768 (ito_move_closer_value - icloser_bucket));
769 m_buckets[icloser_bucket].set_value_of_empty_bucket(
770 new_distance,
m_buckets[ito_move_closer_value].truncated_hash(),
771 std::move(
m_buckets[ito_move_closer_value].value()));
772 m_buckets[ito_move_closer_value].clear();
775 ++ito_move_closer_value;
785 auto it =
find(key, hash);
800 swap(static_cast<Hash &>(*
this), static_cast<Hash &>(other));
801 swap(static_cast<KeyEqual &>(*
this), static_cast<KeyEqual &>(other));
802 swap(static_cast<GrowthPolicy &>(*
this), static_cast<GrowthPolicy &>(other));
815 template <
class K,
class U = ValueSelect,
816 typename std::enable_if<has_mapped_type<U>::value>::type * =
nullptr>
817 typename U::value_type &
at(
const K &key)
822 template <
class K,
class U = ValueSelect,
823 typename std::enable_if<has_mapped_type<U>::value>::type * =
nullptr>
824 typename U::value_type &
at(
const K &key, std::size_t hash)
826 return const_cast<typename U::value_type &
>(
830 template <
class K,
class U = ValueSelect,
831 typename std::enable_if<has_mapped_type<U>::value>::type * =
nullptr>
832 const typename U::value_type &
at(
const K &key)
const 837 template <
class K,
class U = ValueSelect,
838 typename std::enable_if<has_mapped_type<U>::value>::type * =
nullptr>
839 const typename U::value_type &
at(
const K &key, std::size_t hash)
const 841 auto it =
find(key, hash);
850 template <
class K,
class U = ValueSelect,
851 typename std::enable_if<has_mapped_type<U>::value>::type * =
nullptr>
854 return try_emplace(std::forward<K>(key)).first.value();
886 template <
class K> std::pair<iterator, iterator>
equal_range(
const K &key)
891 template <
class K> std::pair<iterator, iterator>
equal_range(
const K &key, std::size_t hash)
894 return std::make_pair(it, (it ==
end()) ? it : std::next(it));
897 template <
class K> std::pair<const_iterator, const_iterator>
equal_range(
const K &key)
const 903 std::pair<const_iterator, const_iterator>
equal_range(
const K &key, std::size_t hash)
const 906 return std::make_pair(it, (it ==
cend()) ? it : std::next(it));
916 return std::min(GrowthPolicy::max_bucket_count(),
m_buckets.max_size());
966 template <
class K> std::size_t
hash_key(
const K &key)
const {
return Hash::operator()(key); }
968 template <
class K1,
class K2>
bool compare_keys(
const K1 &key1,
const K2 &key2)
const 970 return KeyEqual::operator()(key1, key2);
975 const std::size_t bucket = GrowthPolicy::bucket_for_hash(hash);
981 template <
class U = GrowthPolicy,
982 typename std::enable_if<is_power_of_two_policy<U>::value>::type * =
nullptr>
987 return (index + 1) & this->m_mask;
990 template <
class U = GrowthPolicy,
991 typename std::enable_if<!is_power_of_two_policy<U>::value>::type * =
nullptr>
1010 while (dist_from_ideal_bucket_ <=
1020 dist_from_ideal_bucket_++;
1028 pos.m_iterator->clear();
1038 std::size_t previous_ibucket =
1039 std::size_t(std::distance(
m_buckets.begin(), pos.m_iterator));
1040 std::size_t ibucket =
next_bucket(previous_ibucket);
1042 while (
m_buckets[ibucket].dist_from_ideal_bucket() > 0) {
1047 m_buckets[previous_ibucket].set_value_of_empty_bucket(
1048 new_distance,
m_buckets[ibucket].truncated_hash(),
1052 previous_ibucket = ibucket;
1057 template <
class K,
class... Args>
1058 std::pair<iterator, bool>
insert_impl(
const K &key, Args &&... value_type_args)
1060 const std::size_t hash =
hash_key(key);
1065 while (dist_from_ideal_bucket_ <=
1074 dist_from_ideal_bucket_++;
1079 dist_from_ideal_bucket_ = 0;
1081 while (dist_from_ideal_bucket_ <=
1084 dist_from_ideal_bucket_++;
1090 ->set_value_of_empty_bucket(dist_from_ideal_bucket_,
1092 std::forward<Args>(value_type_args)...);
1096 std::forward<Args>(value_type_args)...);
1107 template <
class... Args>
1112 value_type(std::forward<Args>(value_type_args)...));
1118 m_buckets[ibucket].swap_with_value_in_bucket(dist_from_ideal_bucket_, hash, value);
1120 dist_from_ideal_bucket_++;
1123 if (dist_from_ideal_bucket_ >
m_buckets[ibucket].dist_from_ideal_bucket()) {
1133 m_buckets[ibucket].swap_with_value_in_bucket(dist_from_ideal_bucket_, hash, value);
1137 dist_from_ideal_bucket_++;
1140 m_buckets[ibucket].set_value_of_empty_bucket(dist_from_ideal_bucket_, hash,
1146 robin_hash new_table(count_, static_cast<Hash &>(*
this), static_cast<KeyEqual &>(*
this),
1151 if (bucket.empty()) {
1155 const std::size_t hash = use_stored_hash
1156 ? bucket.truncated_hash()
1157 : new_table.
hash_key(KeySelect()(bucket.value()));
1161 std::move(bucket.value()));
1165 new_table.
swap(*
this);
1172 if (dist_from_ideal_bucket_ >
m_buckets[ibucket].dist_from_ideal_bucket()) {
1174 m_buckets[ibucket].set_value_of_empty_bucket(dist_from_ideal_bucket_, hash,
1179 m_buckets[ibucket].swap_with_value_in_bucket(dist_from_ideal_bucket_, hash, value);
1183 dist_from_ideal_bucket_++;
1217 return &empty_bucket;
robin_iterator(const robin_iterator< false > &other) noexcept
Definition: robin_hash.h:411
std::pair< iterator, iterator > equal_range(const K &key)
Definition: robin_hash.h:886
value_type & reference
Definition: robin_hash.h:323
iterator end() noexcept
Definition: robin_hash.h:593
std::int_least16_t distance_type
Definition: robin_hash.h:129
size_type m_nb_elements
Definition: robin_hash.h:1235
truncated_hash_type m_hash
Definition: robin_hash.h:102
std::size_t size_type
Definition: robin_hash.h:318
robin_hash & operator=(robin_hash &&other)
Definition: robin_hash.h:558
void insert_value(std::size_t ibucket, distance_type dist_from_ideal_bucket_, truncated_hash_type hash, Args &&... value_type_args)
Definition: robin_hash.h:1108
friend bool operator!=(const robin_iterator &lhs, const robin_iterator &rhs)
Definition: robin_hash.h:466
std::vector< bucket_entry, buckets_allocator > buckets_container_type
Definition: robin_hash.h:377
friend bool operator==(const robin_iterator &lhs, const robin_iterator &rhs)
Definition: robin_hash.h:461
size_type bucket_count() const
Definition: robin_hash.h:912
size_type m_bucket_count
Definition: robin_hash.h:1233
bucket_entry & operator=(const bucket_entry &other) noexcept(std::is_nothrow_copy_constructible< value_type >::value)
Definition: robin_hash.h:173
size_type max_bucket_count() const
Definition: robin_hash.h:914
iterator find_impl(const K &key, std::size_t hash)
Definition: robin_hash.h:1000
std::pair< iterator, bool > try_emplace(K &&key, Args &&... args)
Definition: robin_hash.h:686
static const distance_type REHASH_ON_HIGH_NB_PROBES__NPROBES
Definition: robin_hash.h:1208
const_iterator find(const K &key) const
Definition: robin_hash.h:876
bool bucket_hash_equal(std::size_t hash) const noexcept
Definition: robin_hash.h:91
void swap_with_value_in_bucket(distance_type &dist_from_ideal_bucket_, truncated_hash_type &hash, value_type &value_)
Definition: robin_hash.h:241
const value_type & value() const noexcept
Definition: robin_hash.h:214
void erase_from_bucket(iterator pos)
Definition: robin_hash.h:1026
iterator try_emplace(const_iterator hint, K &&key, Args &&... args)
Definition: robin_hash.h:694
const value_type & const_reference
Definition: robin_hash.h:324
static const distance_type EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET
Definition: robin_hash.h:274
Definition: robin_hash.h:314
std::pair< iterator, bool > insert(P &&value)
Definition: robin_hash.h:621
float load_factor() const
Definition: robin_hash.h:922
typename KeySelect::key_type key_type
Definition: robin_hash.h:316
iterator find(const K &key, std::size_t hash)
Definition: robin_hash.h:871
Definition: hopscotch_growth_policy.h:37
const robin_hash::key_type & key() const
Definition: robin_hash.h:415
const_iterator find_impl(const K &key, std::size_t hash) const
Definition: robin_hash.h:1005
robin_hash(size_type bucket_count_, const Hash &hash, const KeyEqual &equal, const Allocator &alloc, float max_load_factor_)
Definition: robin_hash.h:476
U::value_type & value()
Definition: robin_hash.h:429
std::size_t hash_key(const K &key) const
Definition: robin_hash.h:966
typename std::conditional< IsConst, typename buckets_container_type::const_iterator, typename buckets_container_type::iterator >::type iterator_bucket
Definition: robin_hash.h:398
#define TSL_THROW_OR_TERMINATE(ex, msg)
Definition: robin_growth_policy.h:59
value_type & value() noexcept
Definition: robin_hash.h:208
std::pair< Key, T > value_type
Definition: robin_hash.h:317
bucket_entry * m_first_or_empty_bucket
Definition: robin_hash.h:1228
size_type m_load_threshold
Definition: robin_hash.h:1237
iterator begin() noexcept
Definition: robin_hash.h:571
iterator erase(const_iterator pos)
Definition: robin_hash.h:722
const U::value_type & at(const K &key) const
Definition: robin_hash.h:832
size_type count(const K &key) const
Definition: robin_hash.h:857
typename std::integral_constant< bool, !std::is_same< U, void >::value > has_mapped_type
Definition: robin_hash.h:306
void clear() noexcept
Definition: robin_hash.h:611
void insert(InputIt first, InputIt last)
Definition: robin_hash.h:635
const value_type * const_pointer
Definition: robin_hash.h:326
pointer operator->() const
Definition: robin_hash.h:436
std::pair< const_iterator, const_iterator > equal_range(const K &key) const
Definition: robin_hash.h:897
const U::value_type & at(const K &key, std::size_t hash) const
Definition: robin_hash.h:839
void destroy_value() noexcept
Definition: robin_hash.h:265
robin_iterator operator++(int)
Definition: robin_hash.h:453
iterator erase(iterator pos)
Definition: robin_hash.h:707
std::size_t bucket_for_hash(std::size_t hash) const
Definition: robin_hash.h:973
const_iterator cbegin() const noexcept
Definition: robin_hash.h:583
size_type size() const noexcept
Definition: robin_hash.h:604
bool empty() const noexcept
Definition: robin_hash.h:203
std::forward_iterator_tag iterator_category
Definition: robin_hash.h:403
std::uint_least32_t truncated_hash_type
Definition: robin_hash.h:72
std::size_t next_bucket(std::size_t index) const noexcept
Definition: robin_hash.h:983
robin_hash(const robin_hash &other)
Definition: robin_hash.h:505
const_iterator cend() const noexcept
Definition: robin_hash.h:597
KeyEqual key_equal
Definition: robin_hash.h:321
void set_hash(truncated_hash_type hash) noexcept
Definition: robin_hash.h:99
void set_as_last_bucket() noexcept
Definition: robin_hash.h:224
void rehash_impl(size_type count_)
Definition: robin_hash.h:1144
std::pair< iterator, bool > insert_or_assign(K &&key, M &&obj)
Definition: robin_hash.h:653
static constexpr bool STORE_HASH
Definition: robin_hash.h:336
bucket_entry(bucket_entry &&other) noexcept(std::is_nothrow_move_constructible< value_type >::value)
Definition: robin_hash.h:161
bucket_entry_hash< StoreHash > bucket_hash
Definition: robin_hash.h:125
reference operator*() const
Definition: robin_hash.h:434
iterator mutable_iterator(const_iterator pos)
Definition: robin_hash.h:960
void set_value_of_empty_bucket(distance_type dist_from_ideal_bucket_, truncated_hash_type hash, Args &&... value_type_args)
Definition: robin_hash.h:227
bool grow_on_high_load()
Definition: robin_hash.h:1191
size_type count(const K &key, std::size_t hash) const
Definition: robin_hash.h:859
iterator emplace_hint(const_iterator hint, Args &&... args)
Definition: robin_hash.h:680
bool compare_keys(const K1 &key1, const K2 &key2) const
Definition: robin_hash.h:968
static bool USE_STORED_HASH_ON_REHASH(size_type bucket_count)
Definition: robin_hash.h:357
ValueType value_type
Definition: robin_hash.h:128
const typename robin_hash::value_type value_type
Definition: robin_hash.h:404
robin_iterator(iterator_bucket it) noexcept
Definition: robin_hash.h:400
size_type max_size() const noexcept
Definition: robin_hash.h:606
Definition: robin_hash.h:62
bool m_grow_on_next_insert
Definition: robin_hash.h:1240
bucket_entry * static_empty_bucket_ptr()
Definition: robin_hash.h:1214
robin_iterator< true > const_iterator
Definition: robin_hash.h:328
void swap(robin_hash &other)
Definition: robin_hash.h:796
const U::value_type & value() const
Definition: robin_hash.h:422
distance_type dist_from_ideal_bucket() const noexcept
Definition: robin_hash.h:220
std::pair< const_iterator, const_iterator > equal_range(const K &key, std::size_t hash) const
Definition: robin_hash.h:903
truncated_hash_type truncated_hash() const noexcept
Definition: robin_hash.h:82
const_iterator begin() const noexcept
Definition: robin_hash.h:581
distance_type m_dist_from_ideal_bucket
Definition: robin_hash.h:276
void clear() noexcept
Definition: robin_hash.h:195
Definition: robin_hash.h:47
static constexpr float REHASH_ON_HIGH_NB_PROBES__MIN_LOAD_FACTOR
Definition: robin_hash.h:1209
void max_load_factor(float ml)
Definition: robin_hash.h:933
Allocator allocator_type
Definition: robin_hash.h:322
iterator erase(const_iterator first, const_iterator last)
Definition: robin_hash.h:724
const_iterator find(const K &key, std::size_t hash) const
Definition: robin_hash.h:881
U::value_type & at(const K &key)
Definition: robin_hash.h:817
bucket_entry(const bucket_entry &other) noexcept(std::is_nothrow_copy_constructible< value_type >::value)
Definition: robin_hash.h:145
iterator find(const K &key)
Definition: robin_hash.h:869
bool m_last_bucket
Definition: robin_hash.h:277
std::pair< iterator, bool > insert_impl(const K &key, Args &&... value_type_args)
Definition: robin_hash.h:1058
truncated_hash_type truncated_hash() const noexcept
Definition: robin_hash.h:96
robin_hash & operator=(const robin_hash &other)
Definition: robin_hash.h:538
Definition: robin_hash.h:52
void rehash(size_type count_)
Definition: robin_hash.h:939
typename std::aligned_storage< sizeof(value_type), alignof(value_type)>::type storage
Definition: robin_hash.h:272
iterator_bucket m_iterator
Definition: robin_hash.h:472
bool bucket_hash_equal(std::size_t) const noexcept
Definition: robin_hash.h:80
std::pair< iterator, iterator > equal_range(const K &key, std::size_t hash)
Definition: robin_hash.h:891
#define TSL_LIKELY(exp)
Definition: robin_growth_policy.h:72
iterator insert(const_iterator hint, P &&value)
Definition: robin_hash.h:626
void insert_value_on_rehash(std::size_t ibucket, distance_type dist_from_ideal_bucket_, truncated_hash_type hash, value_type &&value)
Definition: robin_hash.h:1168
void set_hash(truncated_hash_type) noexcept
Definition: robin_hash.h:85
std::ptrdiff_t difference_type
Definition: robin_hash.h:405
Definition: robin_hash.h:123
key_equal key_eq() const
Definition: robin_hash.h:955
value_type * pointer
Definition: robin_hash.h:407
std::vector< char > data
Definition: cth_pressure_map.C:73
U::value_type & operator[](K &&key)
Definition: robin_hash.h:852
robin_iterator() noexcept
Definition: robin_hash.h:409
static const size_type DEFAULT_INIT_BUCKETS_SIZE
Definition: robin_hash.h:1204
Hash hasher
Definition: robin_hash.h:320
bucket_entry() noexcept
Definition: robin_hash.h:131
storage m_value
Definition: robin_hash.h:278
float m_max_load_factor
Definition: robin_hash.h:1238
void reserve(size_type count_)
Definition: robin_hash.h:945
bucket_entry(bool last_bucket_) noexcept
Definition: robin_hash.h:138
static constexpr float DEFAULT_MAX_LOAD_FACTOR
Definition: robin_hash.h:1205
hasher hash_function() const
Definition: robin_hash.h:953
robin_iterator< false > iterator
Definition: robin_hash.h:327
robin_hash(robin_hash &&other) noexcept(std::is_nothrow_move_constructible< Hash >::value &&std::is_nothrow_move_constructible< KeyEqual >::value &&std::is_nothrow_move_constructible< GrowthPolicy >::value &&std::is_nothrow_move_constructible< buckets_container_type >::value)
Definition: robin_hash.h:515
std::pair< iterator, bool > emplace(Args &&... args)
Definition: robin_hash.h:675
~bucket_entry() noexcept
Definition: robin_hash.h:193
Definition: robin_hash.h:302
iterator insert_or_assign(const_iterator hint, K &&key, M &&obj)
Definition: robin_hash.h:663
typename bucket_entry::distance_type distance_type
Definition: robin_hash.h:373
size_type erase(const K &key)
Definition: robin_hash.h:781
static truncated_hash_type truncate_hash(std::size_t hash) noexcept
Definition: robin_hash.h:259
buckets_container_type m_buckets
Definition: robin_hash.h:1221
bool last_bucket() const noexcept
Definition: robin_hash.h:222
typename std::allocator_traits< allocator_type >::template rebind_alloc< bucket_entry > buckets_allocator
Definition: robin_hash.h:376
std::ptrdiff_t difference_type
Definition: robin_hash.h:319
value_type & reference
Definition: robin_hash.h:406
float max_load_factor() const
Definition: robin_hash.h:931
const_iterator end() const noexcept
Definition: robin_hash.h:595
Definition: robin_growth_policy.h:86
robin_iterator & operator++()
Definition: robin_hash.h:438
bool empty() const noexcept
Definition: robin_hash.h:602
void insert_value(std::size_t ibucket, distance_type dist_from_ideal_bucket_, truncated_hash_type hash, value_type &&value)
Definition: robin_hash.h:1115
static constexpr bool USE_STORED_HASH_ON_LOOKUP
Definition: robin_hash.h:349
#define tsl_assert(expr)
Definition: robin_growth_policy.h:41
void type
Definition: robin_hash.h:49
value_type * pointer
Definition: robin_hash.h:325
allocator_type get_allocator() const
Definition: robin_hash.h:566
Definition: robin_hash.h:77
size_type erase(const K &key, std::size_t hash)
Definition: robin_hash.h:783
U::value_type & at(const K &key, std::size_t hash)
Definition: robin_hash.h:824