Go to the documentation of this file.
24 #ifndef TSL_ROBIN_MAP_H
25 #define TSL_ROBIN_MAP_H
30 #include <initializer_list>
32 #include <type_traits>
79 template <
class Key,
class T,
class Hash = std::hash<Key>,
class KeyEqual = std::equal_to<Key>,
80 class Allocator = std::allocator<std::pair<Key, T>>,
bool StoreHash = false,
81 class GrowthPolicy = tsl::rh::power_of_two_growth_policy<2>>
94 return key_value.first;
107 return key_value.second;
114 KeyEqual, Allocator, StoreHash, GrowthPolicy>;
139 const KeyEqual &equal = KeyEqual(),
const Allocator &alloc = Allocator())
156 template <
class InputIt>
158 const Hash &hash = Hash(),
const KeyEqual &equal = KeyEqual(),
159 const Allocator &alloc = Allocator())
165 template <
class InputIt>
171 template <
class InputIt>
173 const Allocator &alloc)
180 const KeyEqual &equal = KeyEqual(),
const Allocator &alloc = Allocator())
186 const Allocator &alloc)
192 const Allocator &alloc)
234 template <class P, typename std::enable_if<std::is_constructible<value_type, P &&>::value>::type
236 std::pair<iterator, bool>
insert(P &&value)
248 template <class P, typename std::enable_if<std::is_constructible<value_type, P &&>::value>::type
260 template <
class InputIt>
void insert(InputIt first, InputIt last) {
m_ht.
insert(first, last); }
262 void insert(std::initializer_list<value_type> ilist)
293 template <
class... Args> std::pair<iterator, bool>
emplace(Args &&... args)
309 template <
class... Args>
320 template <
class... Args>
326 template <
class... Args>
344 return m_ht.
erase(key, precalculated_hash);
351 template <
class K,
class KE = KeyEqual,
352 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
365 template <
class K,
class KE = KeyEqual,
366 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
369 return m_ht.
erase(key, precalculated_hash);
384 T &
at(
const Key &key, std::size_t precalculated_hash)
386 return m_ht.
at(key, precalculated_hash);
389 const T &
at(
const Key &key)
const {
return m_ht.
at(key); }
394 const T &
at(
const Key &key, std::size_t precalculated_hash)
const
396 return m_ht.
at(key, precalculated_hash);
403 template <
class K,
class KE = KeyEqual,
404 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
417 template <
class K,
class KE = KeyEqual,
418 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
419 T &
at(
const K &key, std::size_t precalculated_hash)
421 return m_ht.
at(key, precalculated_hash);
427 template <
class K,
class KE = KeyEqual,
428 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
429 const T &
at(
const K &key)
const
437 template <
class K,
class KE = KeyEqual,
438 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
439 const T &
at(
const K &key, std::size_t precalculated_hash)
const
441 return m_ht.
at(key, precalculated_hash);
456 return m_ht.
count(key, precalculated_hash);
463 template <
class K,
class KE = KeyEqual,
464 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
477 template <
class K,
class KE = KeyEqual,
478 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
481 return m_ht.
count(key, precalculated_hash);
493 return m_ht.
find(key, precalculated_hash);
503 return m_ht.
find(key, precalculated_hash);
510 template <
class K,
class KE = KeyEqual,
511 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
524 template <
class K,
class KE = KeyEqual,
525 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
528 return m_ht.
find(key, precalculated_hash);
534 template <
class K,
class KE = KeyEqual,
535 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
548 template <
class K,
class KE = KeyEqual,
549 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
552 return m_ht.
find(key, precalculated_hash);
562 std::pair<iterator, iterator>
equal_range(
const Key &key, std::size_t precalculated_hash)
567 std::pair<const_iterator, const_iterator>
equal_range(
const Key &key)
const
575 std::pair<const_iterator, const_iterator>
equal_range(
const Key & key,
576 std::size_t precalculated_hash)
const
585 template <
class K,
class KE = KeyEqual,
586 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
599 template <
class K,
class KE = KeyEqual,
600 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
601 std::pair<iterator, iterator>
equal_range(
const K &key, std::size_t precalculated_hash)
609 template <
class K,
class KE = KeyEqual,
610 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
611 std::pair<const_iterator, const_iterator>
equal_range(
const K &key)
const
619 template <
class K,
class KE = KeyEqual,
620 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
621 std::pair<const_iterator, const_iterator>
equal_range(
const K & key,
622 std::size_t precalculated_hash)
const
676 for (
const auto &element_lhs : lhs) {
677 const auto it_element_rhs = rhs.
find(element_lhs.first);
678 if (it_element_rhs == rhs.
cend() || element_lhs.second != it_element_rhs->second) {
701 template <
class Key,
class T,
class Hash = std::hash<Key>,
class KeyEqual = std::equal_to<Key>,
702 class Allocator = std::allocator<std::pair<Key, T>>,
bool StoreHash = false>
iterator mutable_iterator(const_iterator pos)
Definition: robin_map.h:668
float min_load_factor() const
Definition: robin_map.h:638
Definition: bhopscotch_map.h:37
typename ht::const_reference const_reference
Definition: robin_map.h:126
std::pair< iterator, bool > emplace(Args &&... args)
Definition: robin_map.h:293
iterator find(const K &key, std::size_t precalculated_hash)
Definition: robin_map.h:526
const T & at(const K &key, std::size_t precalculated_hash) const
Definition: robin_map.h:439
std::pair< const_iterator, const_iterator > equal_range(const Key &key) const
Definition: robin_map.h:567
hasher hash_function() const
Definition: robin_hash.h:1034
size_type size() const noexcept
Definition: robin_hash.h:669
Definition: robin_map.h:100
float max_load_factor() const
Definition: robin_hash.h:1005
std::pair< iterator, bool > insert(P &&value)
Definition: robin_map.h:236
robin_map(size_type bucket_count, const Hash &hash=Hash(), const KeyEqual &equal=KeyEqual(), const Allocator &alloc=Allocator())
Definition: robin_map.h:138
T & operator[](const Key &key)
Definition: robin_map.h:444
size_type max_bucket_count() const
Definition: robin_map.h:631
iterator find(const Key &key, std::size_t precalculated_hash)
Definition: robin_map.h:491
typename ht::key_equal key_equal
Definition: robin_map.h:123
std::pair< iterator, bool > emplace(Args &&... args)
Definition: robin_hash.h:740
const T & at(const K &key) const
Definition: robin_map.h:429
iterator end() noexcept
Definition: robin_map.h:216
value_type * pointer
Definition: robin_hash.h:348
hasher hash_function() const
Definition: robin_map.h:658
iterator erase(const_iterator first, const_iterator last)
Definition: robin_map.h:334
std::ptrdiff_t difference_type
Definition: robin_hash.h:342
std::pair< iterator, iterator > equal_range(const Key &key, std::size_t precalculated_hash)
Definition: robin_map.h:562
iterator begin() noexcept
Definition: robin_map.h:212
struct anonymous_namespace{Ioss_SmartAssert.C}::assert_initializer init
T & at(const K &key)
Definition: robin_map.h:405
void swap(robin_map &other)
Definition: robin_map.h:372
value_type & operator()(std::pair< Key, T > &key_value) noexcept
Definition: robin_map.h:110
const_iterator end() const noexcept
Definition: robin_map.h:217
bool empty() const noexcept
Definition: robin_hash.h:667
std::size_t size_type
Definition: robin_hash.h:341
iterator insert(const_iterator hint, value_type &&value)
Definition: robin_map.h:255
size_type erase(const K &key, std::size_t precalculated_hash)
Definition: robin_map.h:367
friend bool operator!=(const robin_map &lhs, const robin_map &rhs)
Definition: robin_map.h:686
size_type count(const K &key) const
Definition: robin_map.h:465
const_iterator find(const Key &key) const
Definition: robin_map.h:496
void insert(InputIt first, InputIt last)
Definition: robin_map.h:260
std::pair< iterator, bool > insert(const value_type &value)
Definition: robin_map.h:232
const_iterator find(const K &key, std::size_t precalculated_hash) const
Definition: robin_map.h:550
void rehash(size_type my_count)
Definition: robin_map.h:652
typename ht::key_type key_type
Definition: robin_map.h:117
const_iterator begin() const noexcept
Definition: robin_map.h:213
void max_load_factor(float ml)
Definition: robin_map.h:650
T & operator[](Key &&key)
Definition: robin_map.h:445
const T & at(const Key &key, std::size_t precalculated_hash) const
Definition: robin_map.h:394
typename ht::hasher hasher
Definition: robin_map.h:122
cgsize_t mapped_type
Definition: robin_map.h:118
std::pair< iterator, bool > insert_or_assign(const key_type &k, M &&obj)
Definition: robin_map.h:267
U::value_type & at(const K &key)
Definition: robin_hash.h:888
size_type max_size() const noexcept
Definition: robin_hash.h:671
size_type bucket_count() const
Definition: robin_map.h:630
bool empty() const noexcept
Definition: robin_map.h:223
void rehash(size_type new_count)
Definition: robin_hash.h:1020
iterator insert_hint(const_iterator hint, P &&value)
Definition: robin_hash.h:691
robin_map & operator=(std::initializer_list< value_type > ilist)
Definition: robin_map.h:197
std::pair< iterator, iterator > equal_range(const Key &key)
Definition: robin_map.h:555
T value_type
Definition: robin_map.h:103
typename ht::allocator_type allocator_type
Definition: robin_map.h:124
const value_type & const_reference
Definition: robin_hash.h:347
void clear() noexcept
Definition: robin_hash.h:676
typename ht::const_pointer const_pointer
Definition: robin_map.h:128
size_type max_size() const noexcept
Definition: robin_map.h:225
robin_map(size_type bucket_count, const Allocator &alloc)
Definition: robin_map.h:144
robin_map()
Definition: robin_map.h:136
iterator try_emplace(const_iterator hint, const key_type &k, Args &&... args)
Definition: robin_map.h:321
void reserve(size_type new_count)
Definition: robin_hash.h:1026
size_type erase(const K &key)
Definition: robin_map.h:353
std::pair< Key, T > value_type
Definition: robin_hash.h:340
iterator find(const K &key)
Definition: robin_hash.h:940
typename ht::value_type value_type
Definition: robin_map.h:119
size_type count(const K &key, std::size_t precalculated_hash) const
Definition: robin_map.h:479
std::pair< iterator, bool > try_emplace(const key_type &k, Args &&... args)
Definition: robin_map.h:310
iterator insert_or_assign(const_iterator hint, const key_type &k, M &&obj)
Definition: robin_map.h:277
const_iterator cbegin() const noexcept
Definition: robin_hash.h:648
key_equal key_eq() const
Definition: robin_map.h:659
void min_load_factor(float ml)
Definition: robin_map.h:649
robin_map(std::initializer_list< value_type > init, size_type bucket_count, const Allocator &alloc)
Definition: robin_map.h:185
size_type count(const K &key) const
Definition: robin_hash.h:928
const T & at(const Key &key) const
Definition: robin_map.h:389
Definition: robin_hash.h:52
std::pair< const_iterator, const_iterator > equal_range(const Key &key, std::size_t precalculated_hash) const
Definition: robin_map.h:575
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
std::pair< iterator, bool > try_emplace(key_type &&k, Args &&... args)
Definition: robin_map.h:315
Hash hasher
Definition: robin_hash.h:343
T & at(const Key &key, std::size_t precalculated_hash)
Definition: robin_map.h:384
iterator insert(const_iterator hint, P &&value)
Definition: robin_map.h:250
iterator erase(iterator pos)
Definition: robin_hash.h:772
ht m_ht
Definition: robin_map.h:694
T & at(const Key &key)
Definition: robin_map.h:377
iterator find(const Key &key)
Definition: robin_map.h:484
Definition: robin_hash.h:325
std::pair< iterator, iterator > equal_range(const K &key, std::size_t precalculated_hash)
Definition: robin_map.h:601
float load_factor() const
Definition: robin_map.h:636
iterator mutable_iterator(const_iterator pos)
Definition: robin_hash.h:1041
iterator erase(const_iterator pos)
Definition: robin_map.h:333
std::pair< const_iterator, const_iterator > equal_range(const K &key) const
Definition: robin_map.h:611
robin_map(InputIt first, InputIt last, size_type bucket_count, const Hash &hash, const Allocator &alloc)
Definition: robin_map.h:172
const_iterator find(const K &key) const
Definition: robin_map.h:536
iterator find(const K &key)
Definition: robin_map.h:512
std::pair< iterator, bool > insert_or_assign(key_type &&k, M &&obj)
Definition: robin_map.h:272
const_iterator find(const Key &key, std::size_t precalculated_hash) const
Definition: robin_map.h:501
iterator emplace_hint(const_iterator hint, Args &&... args)
Definition: robin_hash.h:745
robin_map(InputIt first, InputIt last, size_type bucket_count=ht::DEFAULT_INIT_BUCKETS_SIZE, const Hash &hash=Hash(), const KeyEqual &equal=KeyEqual(), const Allocator &alloc=Allocator())
Definition: robin_map.h:157
typename ht::pointer pointer
Definition: robin_map.h:127
std::pair< iterator, bool > insert_or_assign(K &&key, M &&obj)
Definition: robin_hash.h:718
allocator_type get_allocator() const
Definition: robin_map.h:207
robin_iterator< true > const_iterator
Definition: robin_hash.h:351
robin_map(std::initializer_list< value_type > init, size_type bucket_count=ht::DEFAULT_INIT_BUCKETS_SIZE, const Hash &hash=Hash(), const KeyEqual &equal=KeyEqual(), const Allocator &alloc=Allocator())
Definition: robin_map.h:178
void swap(robin_hash &other)
Definition: robin_hash.h:865
typename ht::iterator iterator
Definition: robin_map.h:129
friend bool operator==(const robin_map &lhs, const robin_map &rhs)
Definition: robin_map.h:670
float min_load_factor() const
Definition: robin_hash.h:1003
iterator emplace_hint(const_iterator hint, Args &&... args)
Definition: robin_map.h:304
Allocator allocator_type
Definition: robin_hash.h:345
size_type count(const Key &key, std::size_t precalculated_hash) const
Definition: robin_map.h:454
const value_type & operator()(const std::pair< Key, T > &key_value) const noexcept
Definition: robin_map.h:105
std::pair< iterator, iterator > equal_range(const K &key)
Definition: robin_map.h:587
const_iterator cbegin() const noexcept
Definition: robin_map.h:214
void reserve(size_type my_count)
Definition: robin_map.h:653
robin_map(std::initializer_list< value_type > init, size_type bucket_count, const Hash &hash, const Allocator &alloc)
Definition: robin_map.h:191
iterator try_emplace_hint(const_iterator hint, K &&key, Args &&... args)
Definition: robin_hash.h:759
robin_map(const Allocator &alloc)
Definition: robin_map.h:154
detail_robin_hash::robin_hash< std::pair< Key, T >, KeySelect, ValueSelect, Hash, KeyEqual, Allocator, StoreHash, GrowthPolicy > ht
Definition: robin_map.h:114
typename ht::reference reference
Definition: robin_map.h:125
void clear() noexcept
Definition: robin_map.h:230
iterator end() noexcept
Definition: robin_hash.h:658
robin_map(InputIt first, InputIt last, size_type bucket_count, const Allocator &alloc)
Definition: robin_map.h:166
size_type count(const Key &key) const
Definition: robin_map.h:447
iterator insert(const_iterator hint, const value_type &value)
Definition: robin_map.h:243
friend void swap(robin_map &lhs, robin_map &rhs)
Definition: robin_map.h:691
typename ht::size_type size_type
Definition: robin_map.h:120
typename ht::difference_type difference_type
Definition: robin_map.h:121
T & at(const K &key, std::size_t precalculated_hash)
Definition: robin_map.h:419
allocator_type get_allocator() const
Definition: robin_hash.h:631
size_type erase(const key_type &key)
Definition: robin_map.h:335
void insert(std::initializer_list< value_type > ilist)
Definition: robin_map.h:262
std::pair< const_iterator, const_iterator > equal_range(const K &key, std::size_t precalculated_hash) const
Definition: robin_map.h:621
std::pair< iterator, bool > insert(value_type &&value)
Definition: robin_map.h:241
size_type max_bucket_count() const
Definition: robin_hash.h:986
Key key_type
Definition: robin_map.h:90
robin_map(size_type bucket_count, const Hash &hash, const Allocator &alloc)
Definition: robin_map.h:149
Definition: robin_map.h:82
std::pair< iterator, iterator > equal_range(const K &key)
Definition: robin_hash.h:957
const key_type & operator()(const std::pair< Key, T > &key_value) const noexcept
Definition: robin_map.h:92
value_type & reference
Definition: robin_hash.h:346
typename KeySelect::key_type key_type
Definition: robin_hash.h:339
size_type erase(const key_type &key, std::size_t precalculated_hash)
Definition: robin_map.h:342
size_type size() const noexcept
Definition: robin_map.h:224
key_type & operator()(std::pair< Key, T > &key_value) noexcept
Definition: robin_map.h:97
Definition: robin_map.h:87
iterator try_emplace(const_iterator hint, key_type &&k, Args &&... args)
Definition: robin_map.h:327
size_type bucket_count() const
Definition: robin_hash.h:984
iterator erase(iterator pos)
Definition: robin_map.h:332
iterator insert_or_assign(const_iterator hint, key_type &&k, M &&obj)
Definition: robin_map.h:282
std::pair< iterator, bool > try_emplace(K &&key, Args &&... args)
Definition: robin_hash.h:751
typename ht::const_iterator const_iterator
Definition: robin_map.h:130
iterator begin() noexcept
Definition: robin_hash.h:636
robin_iterator< false > iterator
Definition: robin_hash.h:350
key_equal key_eq() const
Definition: robin_hash.h:1036
float max_load_factor() const
Definition: robin_map.h:639
std::pair< iterator, bool > insert(P &&value)
Definition: robin_hash.h:686
const_iterator cend() const noexcept
Definition: robin_map.h:218
float load_factor() const
Definition: robin_hash.h:994