24 #ifndef TSL_ROBIN_MAP_H 25 #define TSL_ROBIN_MAP_H 30 #include <initializer_list> 32 #include <type_traits> 76 template <
class Key,
class T,
class Hash = std::hash<Key>,
class KeyEqual = std::equal_to<Key>,
77 class Allocator = std::allocator<std::pair<Key, T>>,
bool StoreHash = false,
78 class GrowthPolicy = tsl::rh::power_of_two_growth_policy<2>>
91 return key_value.first;
104 return key_value.second;
111 KeyEqual, Allocator, StoreHash, GrowthPolicy>;
136 const KeyEqual &equal = KeyEqual(),
const Allocator &alloc = Allocator())
153 template <
class InputIt>
155 const Hash &hash = Hash(),
const KeyEqual &equal = KeyEqual(),
156 const Allocator &alloc = Allocator())
162 template <
class InputIt>
168 template <
class InputIt>
170 const Allocator &alloc)
177 const KeyEqual &equal = KeyEqual(),
const Allocator &alloc = Allocator())
183 const Allocator &alloc)
189 const Allocator &alloc)
231 template <class P, typename std::enable_if<std::is_constructible<value_type, P &&>::value>::type
233 std::pair<iterator, bool>
insert(P &&value)
245 template <class P, typename std::enable_if<std::is_constructible<value_type, P &&>::value>::type
257 template <
class InputIt>
void insert(InputIt first, InputIt last) {
m_ht.
insert(first, last); }
259 void insert(std::initializer_list<value_type> ilist)
290 template <
class... Args> std::pair<iterator, bool>
emplace(Args &&... args)
306 template <
class... Args>
317 template <
class... Args>
323 template <
class... Args>
326 return m_ht.
try_emplace(hint, std::move(k), std::forward<Args>(args)...);
341 return m_ht.
erase(key, precalculated_hash);
348 template <
class K,
class KE = KeyEqual,
349 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
362 template <
class K,
class KE = KeyEqual,
363 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
366 return m_ht.
erase(key, precalculated_hash);
381 T &
at(
const Key &key, std::size_t precalculated_hash)
383 return m_ht.
at(key, precalculated_hash);
386 const T &
at(
const Key &key)
const {
return m_ht.
at(key); }
391 const T &
at(
const Key &key, std::size_t precalculated_hash)
const 393 return m_ht.
at(key, precalculated_hash);
400 template <
class K,
class KE = KeyEqual,
401 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
414 template <
class K,
class KE = KeyEqual,
415 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
416 T &
at(
const K &key, std::size_t precalculated_hash)
418 return m_ht.
at(key, precalculated_hash);
424 template <
class K,
class KE = KeyEqual,
425 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
426 const T &
at(
const K &key)
const 434 template <
class K,
class KE = KeyEqual,
435 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
436 const T &
at(
const K &key, std::size_t precalculated_hash)
const 438 return m_ht.
at(key, precalculated_hash);
453 return m_ht.
count(key, precalculated_hash);
460 template <
class K,
class KE = KeyEqual,
461 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
474 template <
class K,
class KE = KeyEqual,
475 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
478 return m_ht.
count(key, precalculated_hash);
490 return m_ht.
find(key, precalculated_hash);
500 return m_ht.
find(key, precalculated_hash);
507 template <
class K,
class KE = KeyEqual,
508 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
521 template <
class K,
class KE = KeyEqual,
522 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
525 return m_ht.
find(key, precalculated_hash);
531 template <
class K,
class KE = KeyEqual,
532 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
545 template <
class K,
class KE = KeyEqual,
546 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
549 return m_ht.
find(key, precalculated_hash);
559 std::pair<iterator, iterator>
equal_range(
const Key &key, std::size_t precalculated_hash)
564 std::pair<const_iterator, const_iterator>
equal_range(
const Key &key)
const 572 std::pair<const_iterator, const_iterator>
equal_range(
const Key & key,
573 std::size_t precalculated_hash)
const 582 template <
class K,
class KE = KeyEqual,
583 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
596 template <
class K,
class KE = KeyEqual,
597 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
598 std::pair<iterator, iterator>
equal_range(
const K &key, std::size_t precalculated_hash)
606 template <
class K,
class KE = KeyEqual,
607 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
608 std::pair<const_iterator, const_iterator>
equal_range(
const K &key)
const 616 template <
class K,
class KE = KeyEqual,
617 typename std::enable_if<has_is_transparent<KE>::value>::type * =
nullptr>
618 std::pair<const_iterator, const_iterator>
equal_range(
const K & key,
619 std::size_t precalculated_hash)
const 661 for (
const auto &element_lhs : lhs) {
662 const auto it_element_rhs = rhs.
find(element_lhs.first);
663 if (it_element_rhs == rhs.
cend() || element_lhs.second != it_element_rhs->second) {
686 template <
class Key,
class T,
class Hash = std::hash<Key>,
class KeyEqual = std::equal_to<Key>,
687 class Allocator = std::allocator<std::pair<Key, T>>,
bool StoreHash = false>
std::pair< iterator, iterator > equal_range(const K &key)
Definition: robin_hash.h:886
robin_map(size_type bucket_count, const Hash &hash=Hash(), const KeyEqual &equal=KeyEqual(), const Allocator &alloc=Allocator())
Definition: robin_map.h:135
value_type & reference
Definition: robin_hash.h:323
size_type max_bucket_count() const
Definition: robin_map.h:628
iterator end() noexcept
Definition: robin_hash.h:593
typename ht::key_equal key_equal
Definition: robin_map.h:120
std::size_t size_type
Definition: robin_hash.h:318
iterator end() noexcept
Definition: robin_map.h:213
T value_type
Definition: robin_map.h:100
hasher hash_function() const
Definition: robin_map.h:643
size_type bucket_count() const
Definition: robin_hash.h:912
typename ht::const_reference const_reference
Definition: robin_map.h:123
iterator find(const K &key, std::size_t precalculated_hash)
Definition: robin_map.h:523
size_type max_bucket_count() const
Definition: robin_hash.h:914
Definition: robin_map.h:84
const T & at(const K &key, std::size_t precalculated_hash) const
Definition: robin_map.h:436
std::pair< iterator, bool > try_emplace(K &&key, Args &&... args)
Definition: robin_hash.h:686
std::pair< iterator, bool > insert(P &&value)
Definition: robin_map.h:233
T & operator[](const Key &key)
Definition: robin_map.h:441
iterator find(const Key &key, std::size_t precalculated_hash)
Definition: robin_map.h:488
const value_type & const_reference
Definition: robin_hash.h:324
T & at(const K &key)
Definition: robin_map.h:402
std::pair< iterator, bool > insert(P &&value)
Definition: robin_hash.h:621
const T & at(const K &key) const
Definition: robin_map.h:426
float load_factor() const
Definition: robin_hash.h:922
typename KeySelect::key_type key_type
Definition: robin_hash.h:316
size_type erase(const K &key, std::size_t precalculated_hash)
Definition: robin_map.h:364
friend bool operator!=(const robin_map &lhs, const robin_map &rhs)
Definition: robin_map.h:671
Definition: hopscotch_growth_policy.h:37
iterator erase(const_iterator first, const_iterator last)
Definition: robin_map.h:331
const_iterator find(const Key &key) const
Definition: robin_map.h:493
std::pair< iterator, bool > insert(const value_type &value)
Definition: robin_map.h:229
void insert(InputIt first, InputIt last)
Definition: robin_map.h:257
std::pair< Key, T > value_type
Definition: robin_hash.h:317
const_iterator find(const K &key, std::size_t precalculated_hash) const
Definition: robin_map.h:547
typename ht::key_type key_type
Definition: robin_map.h:114
iterator begin() noexcept
Definition: robin_map.h:209
iterator begin() noexcept
Definition: robin_hash.h:571
const_iterator begin() const noexcept
Definition: robin_map.h:210
std::pair< iterator, iterator > equal_range(const Key &key, std::size_t precalculated_hash)
Definition: robin_map.h:559
void max_load_factor(float ml)
Definition: robin_map.h:635
size_type count(const K &key) const
Definition: robin_hash.h:857
void swap(robin_map &other)
Definition: robin_map.h:369
void clear() noexcept
Definition: robin_hash.h:611
const_iterator end() const noexcept
Definition: robin_map.h:214
typename ht::hasher hasher
Definition: robin_map.h:119
iterator insert(const_iterator hint, value_type &&value)
Definition: robin_map.h:252
const value_type * const_pointer
Definition: robin_hash.h:326
T mapped_type
Definition: robin_map.h:115
size_type count(const K &key) const
Definition: robin_map.h:462
bool empty() const noexcept
Definition: robin_map.h:220
size_type bucket_count() const
Definition: robin_map.h:627
iterator erase(iterator pos)
Definition: robin_hash.h:707
const_iterator cbegin() const noexcept
Definition: robin_hash.h:583
size_type size() const noexcept
Definition: robin_hash.h:604
std::pair< iterator, iterator > equal_range(const Key &key)
Definition: robin_map.h:552
Definition: robin_map.h:97
typename ht::allocator_type allocator_type
Definition: robin_map.h:121
T & operator[](Key &&key)
Definition: robin_map.h:442
Definition: robin_map.h:79
size_type max_size() const noexcept
Definition: robin_map.h:222
const T & at(const Key &key, std::size_t precalculated_hash) const
Definition: robin_map.h:391
iterator try_emplace(const_iterator hint, const key_type &k, Args &&... args)
Definition: robin_map.h:318
const_iterator cend() const noexcept
Definition: robin_hash.h:597
KeyEqual key_equal
Definition: robin_hash.h:321
std::pair< iterator, bool > insert_or_assign(const key_type &k, M &&obj)
Definition: robin_map.h:264
Key key_type
Definition: robin_map.h:87
std::pair< iterator, bool > insert_or_assign(K &&key, M &&obj)
Definition: robin_hash.h:653
key_type & operator()(std::pair< Key, T > &key_value) noexcept
Definition: robin_map.h:94
typename ht::value_type value_type
Definition: robin_map.h:116
size_type count(const K &key, std::size_t precalculated_hash) const
Definition: robin_map.h:476
robin_map & operator=(std::initializer_list< value_type > ilist)
Definition: robin_map.h:194
std::pair< iterator, bool > try_emplace(const key_type &k, Args &&... args)
Definition: robin_map.h:307
iterator mutable_iterator(const_iterator pos)
Definition: robin_hash.h:960
iterator insert_or_assign(const_iterator hint, const key_type &k, M &&obj)
Definition: robin_map.h:274
key_equal key_eq() const
Definition: robin_map.h:644
typename ht::const_pointer const_pointer
Definition: robin_map.h:125
robin_map(size_type bucket_count, const Allocator &alloc)
Definition: robin_map.h:141
iterator emplace_hint(const_iterator hint, Args &&... args)
Definition: robin_hash.h:680
robin_map()
Definition: robin_map.h:133
std::pair< iterator, bool > try_emplace(key_type &&k, Args &&... args)
Definition: robin_map.h:312
T & at(const Key &key, std::size_t precalculated_hash)
Definition: robin_map.h:381
size_type erase(const K &key)
Definition: robin_map.h:350
iterator insert(const_iterator hint, P &&value)
Definition: robin_map.h:247
size_type max_size() const noexcept
Definition: robin_hash.h:606
std::pair< iterator, iterator > equal_range(const K &key, std::size_t precalculated_hash)
Definition: robin_map.h:598
robin_iterator< true > const_iterator
Definition: robin_hash.h:328
float load_factor() const
Definition: robin_map.h:633
void swap(robin_hash &other)
Definition: robin_hash.h:796
iterator erase(const_iterator pos)
Definition: robin_map.h:330
std::pair< const_iterator, const_iterator > equal_range(const K &key) const
Definition: robin_map.h:608
const_iterator find(const K &key) const
Definition: robin_map.h:533
robin_map(std::initializer_list< value_type > init, size_type bucket_count, const Allocator &alloc)
Definition: robin_map.h:182
const T & at(const Key &key) const
Definition: robin_map.h:386
const_iterator find(const Key &key, std::size_t precalculated_hash) const
Definition: robin_map.h:498
Allocator allocator_type
Definition: robin_hash.h:322
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:154
std::pair< const_iterator, const_iterator > equal_range(const Key &key, std::size_t precalculated_hash) const
Definition: robin_map.h:572
typename ht::pointer pointer
Definition: robin_map.h:124
U::value_type & at(const K &key)
Definition: robin_hash.h:817
ht m_ht
Definition: robin_map.h:679
T & at(const Key &key)
Definition: robin_map.h:374
allocator_type get_allocator() const
Definition: robin_map.h:204
iterator find(const K &key)
Definition: robin_hash.h:869
iterator find(const Key &key)
Definition: robin_map.h:481
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:175
Definition: robin_hash.h:52
void rehash(size_type count_)
Definition: robin_hash.h:939
robin_map(InputIt first, InputIt last, size_type bucket_count, const Hash &hash, const Allocator &alloc)
Definition: robin_map.h:169
std::pair< iterator, bool > insert_or_assign(key_type &&k, M &&obj)
Definition: robin_map.h:269
iterator find(const K &key)
Definition: robin_map.h:509
const_iterator cbegin() const noexcept
Definition: robin_map.h:211
typename ht::reference reference
Definition: robin_map.h:122
key_equal key_eq() const
Definition: robin_hash.h:955
typename ht::iterator iterator
Definition: robin_map.h:126
friend bool operator==(const robin_map &lhs, const robin_map &rhs)
Definition: robin_map.h:655
size_type count(const Key &key) const
Definition: robin_map.h:444
T & at(const K &key, std::size_t precalculated_hash)
Definition: robin_map.h:416
typename ht::difference_type difference_type
Definition: robin_map.h:118
iterator emplace_hint(const_iterator hint, Args &&... args)
Definition: robin_map.h:301
value_type & operator()(std::pair< Key, T > &key_value) noexcept
Definition: robin_map.h:107
size_type count(const Key &key, std::size_t precalculated_hash) const
Definition: robin_map.h:451
static const size_type DEFAULT_INIT_BUCKETS_SIZE
Definition: robin_hash.h:1204
robin_map(std::initializer_list< value_type > init, size_type bucket_count, const Hash &hash, const Allocator &alloc)
Definition: robin_map.h:188
std::pair< iterator, iterator > equal_range(const K &key)
Definition: robin_map.h:584
const value_type & operator()(const std::pair< Key, T > &key_value) const noexcept
Definition: robin_map.h:102
void insert(std::initializer_list< value_type > ilist)
Definition: robin_map.h:259
struct anonymous_namespace{Ioss_SmartAssert.C}::assert_initializer init
Hash hasher
Definition: robin_hash.h:320
robin_map(const Allocator &alloc)
Definition: robin_map.h:151
void reserve(size_type count_)
Definition: robin_hash.h:945
void clear() noexcept
Definition: robin_map.h:227
detail_robin_hash::robin_hash< std::pair< Key, T >, KeySelect, ValueSelect, Hash, KeyEqual, Allocator, StoreHash, GrowthPolicy > ht
Definition: robin_map.h:111
hasher hash_function() const
Definition: robin_hash.h:953
robin_iterator< false > iterator
Definition: robin_hash.h:327
std::pair< iterator, bool > emplace(Args &&... args)
Definition: robin_hash.h:675
Definition: robin_hash.h:302
robin_map(InputIt first, InputIt last, size_type bucket_count, const Allocator &alloc)
Definition: robin_map.h:163
iterator insert(const_iterator hint, const value_type &value)
Definition: robin_map.h:240
typename ht::size_type size_type
Definition: robin_map.h:117
friend void swap(robin_map &lhs, robin_map &rhs)
Definition: robin_map.h:676
size_type size() const noexcept
Definition: robin_map.h:221
void reserve(size_type count_)
Definition: robin_map.h:638
size_type erase(const key_type &key)
Definition: robin_map.h:332
std::pair< const_iterator, const_iterator > equal_range(const K &key, std::size_t precalculated_hash) const
Definition: robin_map.h:618
std::pair< iterator, bool > insert(value_type &&value)
Definition: robin_map.h:238
iterator erase(iterator pos)
Definition: robin_map.h:329
iterator insert_or_assign(const_iterator hint, key_type &&k, M &&obj)
Definition: robin_map.h:279
void rehash(size_type count_)
Definition: robin_map.h:637
robin_map(size_type bucket_count, const Hash &hash, const Allocator &alloc)
Definition: robin_map.h:146
std::ptrdiff_t difference_type
Definition: robin_hash.h:319
float max_load_factor() const
Definition: robin_hash.h:931
bool empty() const noexcept
Definition: robin_hash.h:602
float max_load_factor() const
Definition: robin_map.h:634
const_iterator cend() const noexcept
Definition: robin_map.h:215
const key_type & operator()(const std::pair< Key, T > &key_value) const noexcept
Definition: robin_map.h:89
value_type * pointer
Definition: robin_hash.h:325
iterator mutable_iterator(const_iterator pos)
Definition: robin_map.h:653
size_type erase(const key_type &key, std::size_t precalculated_hash)
Definition: robin_map.h:339
allocator_type get_allocator() const
Definition: robin_hash.h:566
iterator try_emplace(const_iterator hint, key_type &&k, Args &&... args)
Definition: robin_map.h:324
std::pair< iterator, bool > emplace(Args &&... args)
Definition: robin_map.h:290
std::pair< const_iterator, const_iterator > equal_range(const Key &key) const
Definition: robin_map.h:564
typename ht::const_iterator const_iterator
Definition: robin_map.h:127