Go to the documentation of this file.
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>
73 template <
class T>
const T &
clamp(
const T &v,
const T &lo,
const T &hi)
75 return std::min(hi, std::max(lo, v));
78 template <
typename T,
typename U>
81 T ret = static_cast<T>(value);
82 if (static_cast<U>(ret) != value) {
86 const bool is_same_signedness = (std::is_unsigned<T>::value && std::is_unsigned<U>::value) ||
87 (std::is_signed<T>::value && std::is_signed<U>::value);
88 if (!is_same_signedness && (ret < T{}) != (value < U{})) {
145 template <
typename ValueType,
bool StoreHash>
169 std::is_nothrow_copy_constructible<value_type>::value)
173 if (!other.empty()) {
185 std::is_nothrow_move_constructible<value_type>::value)
190 if (!other.empty()) {
191 ::new (static_cast<void *>(std::addressof(
m_value)))
value_type(std::move(other.value()));
197 std::is_nothrow_copy_constructible<value_type>::value)
199 if (
this != &other) {
202 bucket_hash::operator=(other);
203 if (!other.empty()) {
234 return *reinterpret_cast<value_type *>(std::addressof(
m_value));
240 return *reinterpret_cast<const value_type *>(std::addressof(
m_value));
249 template <
typename... Args>
251 Args &&... value_type_args)
256 ::new (static_cast<void *>(std::addressof(
m_value)))
257 value_type(std::forward<Args>(value_type_args)...);
270 swap(my_value, this->
value());
291 value().~value_type();
323 template <
class ValueType,
class KeySelect,
class ValueSelect,
class Hash,
class KeyEqual,
324 class Allocator,
bool StoreHash,
class GrowthPolicy>
325 class robin_hash :
private Hash,
private KeyEqual,
private GrowthPolicy
328 template <
typename U>
329 using has_mapped_type =
typename std::integral_constant<bool, !std::is_same<U, void>::value>;
331 static_assert(noexcept(std::declval<GrowthPolicy>().
bucket_for_hash(std::size_t(0))),
332 "GrowthPolicy::bucket_for_hash must be noexcept.");
333 static_assert(noexcept(std::declval<GrowthPolicy>().
clear()),
334 "GrowthPolicy::clear must be noexcept.");
365 (!std::is_arithmetic<key_type>::value ||
366 !std::is_same<Hash, std::hash<key_type>>::value));
382 (void)my_bucket_count;
388 return (my_bucket_count - 1) <= std::numeric_limits<truncated_hash_type>::max();
399 typename std::allocator_traits<allocator_type>::template rebind_alloc<bucket_entry>;
414 template <
bool IsConst>
class robin_iterator
420 typename std::conditional<IsConst, const bucket_entry *, bucket_entry *>::type;
434 template <bool TIsConst = IsConst, typename std::enable_if<TIsConst>::type * =
nullptr>
446 template <
class U = ValueSelect,
447 typename std::enable_if<has_mapped_type<U>::value && IsConst>::type * =
nullptr>
448 const typename U::value_type &
value()
const
453 template <
class U = ValueSelect,
454 typename std::enable_if<has_mapped_type<U>::value && !IsConst>::type * =
nullptr>
489 return lhs.m_bucket == rhs.m_bucket;
494 return !(lhs == rhs);
502 #if defined(__cplusplus) && __cplusplus >= 201402L
506 : Hash(hash), KeyEqual(equal), GrowthPolicy(my_bucket_count),
511 "The map exceeds its maximum bucket count.");
514 return my_bucket_count;
542 : Hash(my_hash), KeyEqual(equal), GrowthPolicy(my_bucket_count),
m_buckets_data(alloc),
548 "The map exceeds its maxmimum bucket count.");
576 std::is_nothrow_move_constructible<Hash>::value &&std::is_nothrow_move_constructible<
577 KeyEqual>::value &&std::is_nothrow_move_constructible<GrowthPolicy>::value
578 && std::is_nothrow_move_constructible<buckets_container_type>::value)
579 : Hash(std::move(static_cast<Hash &>(other))),
580 KeyEqual(std::move(static_cast<KeyEqual &>(other))),
581 GrowthPolicy(std::move(static_cast<GrowthPolicy &>(other))),
590 other.GrowthPolicy::clear();
591 other.m_buckets_data.clear();
593 other.m_bucket_count = 0;
594 other.m_nb_elements = 0;
595 other.m_load_threshold = 0;
596 other.m_grow_on_next_insert =
false;
597 other.m_try_skrink_on_next_insert =
false;
602 if (&other !=
this) {
603 Hash:: operator=(other);
604 KeyEqual:: operator=(other);
605 GrowthPolicy::operator=(other);
686 template <
typename P> std::pair<iterator, bool>
insert(P &&value)
688 return insert_impl(KeySelect()(value), std::forward<P>(value));
693 if (hint !=
cend() &&
compare_keys(KeySelect()(*hint), KeySelect()(value))) {
697 return insert(std::forward<P>(value)).first;
700 template <
class InputIt>
void insert(InputIt first, InputIt last)
702 if (std::is_base_of<std::forward_iterator_tag,
703 typename std::iterator_traits<InputIt>::iterator_category>::value) {
704 const auto nb_elements_insert = std::distance(first, last);
708 if (nb_elements_insert > 0 && nb_free_buckets <
size_type(nb_elements_insert)) {
713 for (; first != last; ++first) {
720 auto it =
try_emplace(std::forward<K>(key), std::forward<M>(obj));
722 it.first.value() = std::forward<M>(obj);
732 it.value() = std::forward<M>(obj);
740 template <
class... Args> std::pair<iterator, bool>
emplace(Args &&... args)
750 template <
class K,
class... Args>
754 std::forward_as_tuple(std::forward<K>(key)),
755 std::forward_as_tuple(std::forward<Args>(args)...));
758 template <
class K,
class... Args>
765 return try_emplace(std::forward<K>(key), std::forward<Args>(args)...).first;
780 if (pos.m_bucket->empty()) {
799 for (
auto it = first_mutable.m_bucket; it != last_mutable.m_bucket; ++it) {
806 if (last_mutable ==
end()) {
814 std::size_t icloser_bucket = static_cast<std::size_t>(first_mutable.m_bucket -
m_buckets);
815 std::size_t ito_move_closer_value =
816 static_cast<std::size_t>(last_mutable.m_bucket -
m_buckets);
819 const std::size_t ireturn_bucket =
820 ito_move_closer_value -
821 std::min(ito_move_closer_value - icloser_bucket,
822 std::size_t(
m_buckets[ito_move_closer_value].dist_from_ideal_bucket()));
825 m_buckets[ito_move_closer_value].dist_from_ideal_bucket() > 0) {
827 ito_move_closer_value -
828 std::min(ito_move_closer_value - icloser_bucket,
829 std::size_t(
m_buckets[ito_move_closer_value].dist_from_ideal_bucket()));
834 (ito_move_closer_value - icloser_bucket));
836 new_distance,
m_buckets[ito_move_closer_value].truncated_hash(),
837 std::move(
m_buckets[ito_move_closer_value].value()));
841 ++ito_move_closer_value;
853 auto it =
find(key, my_hash);
869 swap(static_cast<Hash &>(*
this), static_cast<Hash &>(other));
870 swap(static_cast<KeyEqual &>(*
this), static_cast<KeyEqual &>(other));
871 swap(static_cast<GrowthPolicy &>(*
this), static_cast<GrowthPolicy &>(other));
886 template <
class K,
class U = ValueSelect,
887 typename std::enable_if<has_mapped_type<U>::value>::type * =
nullptr>
888 typename U::value_type &
at(
const K &key)
893 template <
class K,
class U = ValueSelect,
894 typename std::enable_if<has_mapped_type<U>::value>::type * =
nullptr>
895 typename U::value_type &
at(
const K &key, std::size_t my_hash)
897 return const_cast<typename U::value_type &>(
898 static_cast<const robin_hash *>(
this)->
at(key, my_hash));
901 template <
class K,
class U = ValueSelect,
902 typename std::enable_if<has_mapped_type<U>::value>::type * =
nullptr>
903 const typename U::value_type &
at(
const K &key)
const
908 template <
class K,
class U = ValueSelect,
909 typename std::enable_if<has_mapped_type<U>::value>::type * =
nullptr>
910 const typename U::value_type &
at(
const K &key, std::size_t my_hash)
const
912 auto it =
find(key, my_hash);
921 template <
class K,
class U = ValueSelect,
922 typename std::enable_if<has_mapped_type<U>::value>::type * =
nullptr>
925 return try_emplace(std::forward<K>(key)).first.value();
957 template <
class K> std::pair<iterator, iterator>
equal_range(
const K &key)
963 std::pair<iterator, iterator>
equal_range(
const K &key, std::size_t my_hash)
966 return std::make_pair(it, (it ==
end()) ? it : std::next(it));
969 template <
class K> std::pair<const_iterator, const_iterator>
equal_range(
const K &key)
const
975 std::pair<const_iterator, const_iterator>
equal_range(
const K &key, std::size_t my_hash)
const
978 return std::make_pair(it, (it ==
cend()) ? it : std::next(it));
988 return std::min(GrowthPolicy::max_bucket_count(),
m_buckets_data.max_size());
1043 return iterator(const_cast<bucket_entry *>(pos.m_bucket));
1047 template <
class K> std::size_t
hash_key(
const K &key)
const {
return Hash::operator()(key); }
1049 template <
class K1,
class K2>
bool compare_keys(
const K1 &key1,
const K2 &key2)
const
1051 return KeyEqual::operator()(key1, key2);
1056 const std::size_t bucket = GrowthPolicy::bucket_for_hash(my_hash);
1062 template <
class U = GrowthPolicy,
1063 typename std::enable_if<is_power_of_two_policy<U>::value>::type * =
nullptr>
1068 return (index + 1) & this->m_mask;
1071 template <
class U = GrowthPolicy,
1072 typename std::enable_if<!is_power_of_two_policy<U>::value>::type * =
nullptr>
1091 while (dist_from_ideal_bucket <=
m_buckets[ibucket].dist_from_ideal_bucket()) {
1099 dist_from_ideal_bucket++;
1107 pos.m_bucket->clear();
1117 std::size_t previous_ibucket = static_cast<std::size_t>(pos.m_bucket -
m_buckets);
1118 std::size_t ibucket =
next_bucket(previous_ibucket);
1120 while (
m_buckets[ibucket].dist_from_ideal_bucket() > 0) {
1126 new_distance,
m_buckets[ibucket].truncated_hash(),
1130 previous_ibucket = ibucket;
1135 template <
class K,
class... Args>
1136 std::pair<iterator, bool>
insert_impl(
const K &key, Args &&... value_type_args)
1138 const std::size_t my_hash =
hash_key(key);
1143 while (dist_from_ideal_bucket <=
m_buckets[ibucket].dist_from_ideal_bucket()) {
1150 dist_from_ideal_bucket++;
1155 dist_from_ideal_bucket = 0;
1157 while (dist_from_ideal_bucket <=
m_buckets[ibucket].dist_from_ideal_bucket()) {
1159 dist_from_ideal_bucket++;
1166 std::forward<Args>(value_type_args)...);
1170 std::forward<Args>(value_type_args)...);
1181 template <
class... Args>
1185 value_type value(std::forward<Args>(value_type_args)...);
1207 dist_from_ideal_bucket++;
1210 if (dist_from_ideal_bucket >
m_buckets[ibucket].dist_from_ideal_bucket()) {
1224 dist_from_ideal_bucket++;
1233 robin_hash new_table(new_count, static_cast<Hash &>(*
this), static_cast<KeyEqual &>(*
this),
1238 if (bucket.empty()) {
1242 const std::size_t my_hash = use_stored_hash
1243 ? bucket.truncated_hash()
1244 : new_table.
hash_key(KeySelect()(bucket.value()));
1248 std::move(bucket.value()));
1252 new_table.
swap(*
this);
1259 if (dist_from_ideal_bucket >
m_buckets[ibucket].dist_from_ideal_bucket()) {
1270 ++dist_from_ideal_bucket;
1315 "MINIMUM_MAX_LOAD_FACTOR should be < MAXIMUM_MAX_LOAD_FACTOR");
1317 "MINIMUM_MIN_LOAD_FACTOR should be < MAXIMUM_MIN_LOAD_FACTOR");
1319 "MAXIMUM_MIN_LOAD_FACTOR should be < MINIMUM_MAX_LOAD_FACTOR");
1331 return &empty_bucket;
void insert_value(std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type my_hash, value_type &&value)
Definition: robin_hash.h:1189
bucket_entry(const bucket_entry &other) noexcept(std::is_nothrow_copy_constructible< value_type >::value)
Definition: robin_hash.h:168
std::pair< const_iterator, const_iterator > equal_range(const K &key) const
Definition: robin_hash.h:969
Definition: bhopscotch_map.h:37
size_type erase(const K &key, std::size_t my_hash)
Definition: robin_hash.h:851
Definition: robin_hash.h:62
const_iterator find_impl(const K &key, std::size_t my_hash) const
Definition: robin_hash.h:1086
std::size_t bucket_for_hash(std::size_t my_hash) const
Definition: robin_hash.h:1054
size_type m_load_threshold
Definition: robin_hash.h:1354
hasher hash_function() const
Definition: robin_hash.h:1034
size_type size() const noexcept
Definition: robin_hash.h:669
float max_load_factor() const
Definition: robin_hash.h:1005
const_iterator find(const K &key, std::size_t my_hash) const
Definition: robin_hash.h:952
typename std::aligned_storage< sizeof(value_type), alignof(value_type)>::type storage
Definition: robin_hash.h:295
distance_type dist_from_ideal_bucket() const noexcept
Definition: robin_hash.h:243
static constexpr float DEFAULT_MIN_LOAD_FACTOR
Definition: robin_hash.h:1310
typename std::integral_constant< bool, !std::is_same< U, void >::value > has_mapped_type
Definition: robin_hash.h:329
std::pair< iterator, bool > emplace(Args &&... args)
Definition: robin_hash.h:740
void type
Definition: robin_hash.h:49
Definition: robin_hash.h:47
iterator insert_or_assign(const_iterator hint, K &&key, M &&obj)
Definition: robin_hash.h:728
value_type * pointer
Definition: robin_hash.h:348
U::value_type & value()
Definition: robin_hash.h:455
void set_as_last_bucket() noexcept
Definition: robin_hash.h:247
const T & clamp(const T &v, const T &lo, const T &hi)
Definition: robin_hash.h:73
static constexpr bool STORE_HASH
Definition: robin_hash.h:359
size_type erase(const K &key)
Definition: robin_hash.h:849
robin_iterator(bucket_entry_ptr bucket) noexcept
Definition: robin_hash.h:422
bool last_bucket() const noexcept
Definition: robin_hash.h:245
std::ptrdiff_t difference_type
Definition: robin_hash.h:342
bool bucket_hash_equal(std::size_t) const noexcept
Definition: robin_hash.h:103
storage m_value
Definition: robin_hash.h:301
bucket_entry() noexcept
Definition: robin_hash.h:154
~bucket_entry() noexcept
Definition: robin_hash.h:216
bool empty() const noexcept
Definition: robin_hash.h:667
std::size_t size_type
Definition: robin_hash.h:341
truncated_hash_type m_hash
Definition: robin_hash.h:125
#define TSL_RH_LIKELY(exp)
Definition: robin_growth_policy.h:68
void set_hash(truncated_hash_type) noexcept
Definition: robin_hash.h:108
value_type * pointer
Definition: robin_hash.h:429
bucket_entry * m_buckets
Definition: robin_hash.h:1345
bool m_last_bucket
Definition: robin_hash.h:300
robin_hash(size_type my_bucket_count, const Hash &my_hash, const KeyEqual &equal, const Allocator &alloc, float my_min_load_factor=DEFAULT_MIN_LOAD_FACTOR, float my_max_load_factor=DEFAULT_MAX_LOAD_FACTOR)
Definition: robin_hash.h:539
std::ptrdiff_t difference_type
Definition: robin_hash.h:427
bool m_grow_on_next_insert
Definition: robin_hash.h:1357
robin_iterator(const robin_iterator<!TIsConst > &other) noexcept
Definition: robin_hash.h:435
robin_hash & operator=(robin_hash &&other)
Definition: robin_hash.h:623
std::uint_least32_t truncated_hash_type
Definition: robin_hash.h:95
bool compare_keys(const K1 &key1, const K2 &key2) const
Definition: robin_hash.h:1049
U::value_type & at(const K &key)
Definition: robin_hash.h:888
size_type max_size() const noexcept
Definition: robin_hash.h:671
reference operator*() const
Definition: robin_hash.h:460
std::size_t hash_key(const K &key) const
Definition: robin_hash.h:1047
float m_min_load_factor
Definition: robin_hash.h:1359
void rehash(size_type new_count)
Definition: robin_hash.h:1020
iterator insert_hint(const_iterator hint, P &&value)
Definition: robin_hash.h:691
const_iterator find(const K &key) const
Definition: robin_hash.h:947
ValueType value_type
Definition: robin_hash.h:151
void set_value_of_empty_bucket(distance_type dist_frm_ideal_bucket, truncated_hash_type hash, Args &&... value_type_args)
Definition: robin_hash.h:250
const_iterator begin() const noexcept
Definition: robin_hash.h:646
#define tsl_rh_assert(expr)
Definition: robin_growth_policy.h:40
const value_type & const_reference
Definition: robin_hash.h:347
bool rehash_on_extreme_load()
Definition: robin_hash.h:1282
void erase_from_bucket(iterator pos)
Definition: robin_hash.h:1105
void clear() noexcept
Definition: robin_hash.h:676
static constexpr float REHASH_ON_HIGH_NB_PROBES__MIN_LOAD_FACTOR
Definition: robin_hash.h:1323
static bool USE_STORED_HASH_ON_REHASH(size_type my_bucket_count)
Definition: robin_hash.h:380
Definition: robin_hash.h:337
robin_iterator operator++(int)
Definition: robin_hash.h:479
void reserve(size_type new_count)
Definition: robin_hash.h:1026
std::pair< iterator, iterator > equal_range(const K &key, std::size_t my_hash)
Definition: robin_hash.h:963
distance_type m_dist_from_ideal_bucket
Definition: robin_hash.h:299
typename std::conditional< IsConst, const bucket_entry *, bucket_entry * >::type bucket_entry_ptr
Definition: robin_hash.h:420
std::pair< Key, T > value_type
Definition: robin_hash.h:340
std::pair< const_iterator, const_iterator > equal_range(const K &key, std::size_t my_hash) const
Definition: robin_hash.h:975
const U::value_type & at(const K &key, std::size_t my_hash) const
Definition: robin_hash.h:910
iterator find(const K &key)
Definition: robin_hash.h:940
std::pair< iterator, bool > insert_impl(const K &key, Args &&... value_type_args)
Definition: robin_hash.h:1136
void swap_with_value_in_bucket(distance_type &dist_frm_ideal_bucket, truncated_hash_type &hash, value_type &my_value)
Definition: robin_hash.h:264
const_iterator cbegin() const noexcept
Definition: robin_hash.h:648
bucket_entry_hash< StoreHash > bucket_hash
Definition: robin_hash.h:148
void insert_value(std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type my_hash, Args &&... value_type_args)
Definition: robin_hash.h:1182
U::value_type & operator[](K &&key)
Definition: robin_hash.h:923
size_type count(const K &key) const
Definition: robin_hash.h:928
friend bool operator!=(const robin_iterator &lhs, const robin_iterator &rhs)
Definition: robin_hash.h:492
void insert(InputIt first, InputIt last)
Definition: robin_hash.h:700
static constexpr float MINIMUM_MAX_LOAD_FACTOR
Definition: robin_hash.h:1307
Definition: robin_hash.h:52
static const size_type DEFAULT_INIT_BUCKETS_SIZE
Definition: robin_hash.h:1304
const_iterator cend() const noexcept
Definition: robin_hash.h:662
KeyEqual key_equal
Definition: robin_hash.h:344
const value_type * const_pointer
Definition: robin_hash.h:349
#define TSL_RH_THROW_OR_TERMINATE(ex, msg)
Definition: robin_growth_policy.h:57
Hash hasher
Definition: robin_hash.h:343
float m_max_load_factor
Definition: robin_hash.h:1355
bucket_entry & operator=(const bucket_entry &other) noexcept(std::is_nothrow_copy_constructible< value_type >::value)
Definition: robin_hash.h:196
const typename robin_hash::value_type value_type
Definition: robin_hash.h:426
iterator erase(iterator pos)
Definition: robin_hash.h:772
Definition: robin_hash.h:325
iterator mutable_iterator(const_iterator pos)
Definition: robin_hash.h:1041
iterator emplace_hint(const_iterator hint, Args &&... args)
Definition: robin_hash.h:745
robin_hash(const robin_hash &other)
Definition: robin_hash.h:564
std::size_t next_bucket(std::size_t index) const noexcept
Definition: robin_hash.h:1064
buckets_container_type m_buckets_data
Definition: robin_hash.h:1335
void set_hash(truncated_hash_type hash) noexcept
Definition: robin_hash.h:122
robin_iterator() noexcept
Definition: robin_hash.h:431
const U::value_type & value() const
Definition: robin_hash.h:448
std::int_least16_t distance_type
Definition: robin_hash.h:152
std::pair< iterator, bool > insert_or_assign(K &&key, M &&obj)
Definition: robin_hash.h:718
typename std::allocator_traits< allocator_type >::template rebind_alloc< bucket_entry > buckets_allocator
Definition: robin_hash.h:399
bucket_entry * static_empty_bucket_ptr()
Definition: robin_hash.h:1328
const robin_hash::key_type & key() const
Definition: robin_hash.h:444
static constexpr float DEFAULT_MAX_LOAD_FACTOR
Definition: robin_hash.h:1306
const_iterator end() const noexcept
Definition: robin_hash.h:660
size_type count(const K &key, std::size_t my_hash) const
Definition: robin_hash.h:930
robin_iterator< true > const_iterator
Definition: robin_hash.h:351
void swap(robin_hash &other)
Definition: robin_hash.h:865
static T numeric_cast(U value, const char *error_message="numeric_cast() failed.")
Definition: robin_hash.h:79
static constexpr float MINIMUM_MIN_LOAD_FACTOR
Definition: robin_hash.h:1311
float min_load_factor() const
Definition: robin_hash.h:1003
static constexpr bool USE_STORED_HASH_ON_LOOKUP
Definition: robin_hash.h:372
void clear() noexcept
Definition: robin_hash.h:218
void min_load_factor(float ml)
Definition: robin_hash.h:1007
Allocator allocator_type
Definition: robin_hash.h:345
void max_load_factor(float ml)
Definition: robin_hash.h:1013
typename bucket_entry::distance_type distance_type
Definition: robin_hash.h:396
void error_message(const Ioss::Field &field, Ioss::Field::BasicType requested_type)
Definition: Ioss_Field.C:64
bool empty() const noexcept
Definition: robin_hash.h:226
iterator find_impl(const K &key, std::size_t my_hash)
Definition: robin_hash.h:1081
iterator try_emplace_hint(const_iterator hint, K &&key, Args &&... args)
Definition: robin_hash.h:759
void rehash_impl(size_type new_count)
Definition: robin_hash.h:1231
bucket_entry(bucket_entry &&other) noexcept(std::is_nothrow_move_constructible< value_type >::value)
Definition: robin_hash.h:184
truncated_hash_type truncated_hash() const noexcept
Definition: robin_hash.h:105
Definition: robin_hash.h:100
pointer operator->() const
Definition: robin_hash.h:462
U::value_type & at(const K &key, std::size_t my_hash)
Definition: robin_hash.h:895
iterator end() noexcept
Definition: robin_hash.h:658
const value_type & value() const noexcept
Definition: robin_hash.h:237
std::vector< char > data
Definition: cth_pressure_map.C:74
value_type & reference
Definition: robin_hash.h:428
Definition: robin_growth_policy.h:81
robin_iterator & operator++()
Definition: robin_hash.h:464
static truncated_hash_type truncate_hash(std::size_t hash) noexcept
Definition: robin_hash.h:282
iterator erase(const_iterator first, const_iterator last)
Definition: robin_hash.h:791
robin_iterator & operator=(const robin_iterator &other)=default
std::forward_iterator_tag iterator_category
Definition: robin_hash.h:425
allocator_type get_allocator() const
Definition: robin_hash.h:631
size_type m_bucket_count
Definition: robin_hash.h:1350
static constexpr float MAXIMUM_MAX_LOAD_FACTOR
Definition: robin_hash.h:1308
size_type max_bucket_count() const
Definition: robin_hash.h:986
value_type & value() noexcept
Definition: robin_hash.h:231
bucket_entry_ptr m_bucket
Definition: robin_hash.h:498
std::pair< iterator, iterator > equal_range(const K &key)
Definition: robin_hash.h:957
value_type & reference
Definition: robin_hash.h:346
robin_hash & operator=(const robin_hash &other)
Definition: robin_hash.h:600
static const distance_type EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET
Definition: robin_hash.h:297
size_type m_nb_elements
Definition: robin_hash.h:1352
Definition: robin_hash.h:146
bool m_try_skrink_on_next_insert
Definition: robin_hash.h:1367
typename KeySelect::key_type key_type
Definition: robin_hash.h:339
void destroy_value() noexcept
Definition: robin_hash.h:288
truncated_hash_type truncated_hash() const noexcept
Definition: robin_hash.h:119
std::vector< bucket_entry, buckets_allocator > buckets_container_type
Definition: robin_hash.h:400
iterator find(const K &key, std::size_t my_hash)
Definition: robin_hash.h:942
void insert_value_on_rehash(std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type my_hash, value_type &&value)
Definition: robin_hash.h:1255
size_type bucket_count() const
Definition: robin_hash.h:984
static const distance_type REHASH_ON_HIGH_NB_PROBES__NPROBES
Definition: robin_hash.h:1322
void insert_value_impl(std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type my_hash, value_type &value)
Definition: robin_hash.h:1202
bucket_entry(bool lst_bucket) noexcept
Definition: robin_hash.h:161
std::pair< iterator, bool > try_emplace(K &&key, Args &&... args)
Definition: robin_hash.h:751
bool bucket_hash_equal(std::size_t hash) const noexcept
Definition: robin_hash.h:114
friend bool operator==(const robin_iterator &lhs, const robin_iterator &rhs)
Definition: robin_hash.h:487
static constexpr float MAXIMUM_MIN_LOAD_FACTOR
Definition: robin_hash.h:1312
iterator begin() noexcept
Definition: robin_hash.h:636
iterator erase(const_iterator pos)
Definition: robin_hash.h:789
const U::value_type & at(const K &key) const
Definition: robin_hash.h:903
robin_iterator< false > iterator
Definition: robin_hash.h:350
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:575
key_equal key_eq() const
Definition: robin_hash.h:1036
std::pair< iterator, bool > insert(P &&value)
Definition: robin_hash.h:686
float load_factor() const
Definition: robin_hash.h:994