Loading...
Searching...
No Matches
robin_map.h
1
24#ifndef PXR_TSL_ROBIN_MAP_H
25#define PXR_TSL_ROBIN_MAP_H
26
27#include <cstddef>
28#include <functional>
29#include <initializer_list>
30#include <memory>
31#include <type_traits>
32#include <utility>
33
34#include "robin_hash.h"
35
36// Pixar modification, modify namespace for isolation.
37#include "pxr/pxr.h"
38
39PXR_NAMESPACE_OPEN_SCOPE
40
41namespace pxr_tsl {
42
91template <class Key, class T, class Hash = std::hash<Key>,
92 class KeyEqual = std::equal_to<Key>,
93 class Allocator = std::allocator<std::pair<Key, T>>,
94 bool StoreHash = false,
95 class GrowthPolicy = pxr_tsl::rh::power_of_two_growth_policy<2>>
96class robin_map {
97 private:
98 template <typename U>
99 using has_is_transparent = pxr_tsl::detail_robin_hash::has_is_transparent<U>;
100
101 class KeySelect {
102 public:
103 using key_type = Key;
104
105 const key_type& operator()(
106 const std::pair<Key, T>& key_value) const noexcept {
107 return key_value.first;
108 }
109
110 key_type& operator()(std::pair<Key, T>& key_value) noexcept {
111 return key_value.first;
112 }
113 };
114
115 class ValueSelect {
116 public:
117 using value_type = T;
118
119 const value_type& operator()(
120 const std::pair<Key, T>& key_value) const noexcept {
121 return key_value.second;
122 }
123
124 value_type& operator()(std::pair<Key, T>& key_value) noexcept {
125 return key_value.second;
126 }
127 };
128
130 ValueSelect, Hash, KeyEqual,
131 Allocator, StoreHash, GrowthPolicy>;
132
133 public:
134 using key_type = typename ht::key_type;
135 using mapped_type = T;
136 using value_type = typename ht::value_type;
137 using size_type = typename ht::size_type;
138 using difference_type = typename ht::difference_type;
139 using hasher = typename ht::hasher;
140 using key_equal = typename ht::key_equal;
141 using allocator_type = typename ht::allocator_type;
142 using reference = typename ht::reference;
143 using const_reference = typename ht::const_reference;
144 using pointer = typename ht::pointer;
145 using const_pointer = typename ht::const_pointer;
146 using iterator = typename ht::iterator;
147 using const_iterator = typename ht::const_iterator;
148
149 public:
150 /*
151 * Constructors
152 */
153 robin_map() : robin_map(ht::DEFAULT_INIT_BUCKETS_SIZE) {}
154
155 explicit robin_map(size_type bucket_count, const Hash& hash = Hash(),
156 const KeyEqual& equal = KeyEqual(),
157 const Allocator& alloc = Allocator())
158 : m_ht(bucket_count, hash, equal, alloc) {}
159
160 robin_map(size_type bucket_count, const Allocator& alloc)
161 : robin_map(bucket_count, Hash(), KeyEqual(), alloc) {}
162
163 robin_map(size_type bucket_count, const Hash& hash, const Allocator& alloc)
164 : robin_map(bucket_count, hash, KeyEqual(), alloc) {}
165
166 explicit robin_map(const Allocator& alloc)
167 : robin_map(ht::DEFAULT_INIT_BUCKETS_SIZE, alloc) {}
168
169 template <class InputIt>
170 robin_map(InputIt first, InputIt last,
171 size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE,
172 const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(),
173 const Allocator& alloc = Allocator())
174 : robin_map(bucket_count, hash, equal, alloc) {
175 insert(first, last);
176 }
177
178 template <class InputIt>
179 robin_map(InputIt first, InputIt last, size_type bucket_count,
180 const Allocator& alloc)
181 : robin_map(first, last, bucket_count, Hash(), KeyEqual(), alloc) {}
182
183 template <class InputIt>
184 robin_map(InputIt first, InputIt last, size_type bucket_count,
185 const Hash& hash, const Allocator& alloc)
186 : robin_map(first, last, bucket_count, hash, KeyEqual(), alloc) {}
187
188 robin_map(std::initializer_list<value_type> init,
189 size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE,
190 const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual(),
191 const Allocator& alloc = Allocator())
192 : robin_map(init.begin(), init.end(), bucket_count, hash, equal, alloc) {}
193
194 robin_map(std::initializer_list<value_type> init, size_type bucket_count,
195 const Allocator& alloc)
196 : robin_map(init.begin(), init.end(), bucket_count, Hash(), KeyEqual(),
197 alloc) {}
198
199 robin_map(std::initializer_list<value_type> init, size_type bucket_count,
200 const Hash& hash, const Allocator& alloc)
201 : robin_map(init.begin(), init.end(), bucket_count, hash, KeyEqual(),
202 alloc) {}
203
204 robin_map& operator=(std::initializer_list<value_type> ilist) {
205 m_ht.clear();
206
207 m_ht.reserve(ilist.size());
208 m_ht.insert(ilist.begin(), ilist.end());
209
210 return *this;
211 }
212
213 allocator_type get_allocator() const { return m_ht.get_allocator(); }
214
215 /*
216 * Iterators
217 */
218 iterator begin() noexcept { return m_ht.begin(); }
219 const_iterator begin() const noexcept { return m_ht.begin(); }
220 const_iterator cbegin() const noexcept { return m_ht.cbegin(); }
221
222 iterator end() noexcept { return m_ht.end(); }
223 const_iterator end() const noexcept { return m_ht.end(); }
224 const_iterator cend() const noexcept { return m_ht.cend(); }
225
226 /*
227 * Capacity
228 */
229 bool empty() const noexcept { return m_ht.empty(); }
230 size_type size() const noexcept { return m_ht.size(); }
231 size_type max_size() const noexcept { return m_ht.max_size(); }
232
233 /*
234 * Modifiers
235 */
236 void clear() noexcept { m_ht.clear(); }
237
238 std::pair<iterator, bool> insert(const value_type& value) {
239 return m_ht.insert(value);
240 }
241
242 template <class P, typename std::enable_if<std::is_constructible<
243 value_type, P&&>::value>::type* = nullptr>
244 std::pair<iterator, bool> insert(P&& value) {
245 return m_ht.emplace(std::forward<P>(value));
246 }
247
248 std::pair<iterator, bool> insert(value_type&& value) {
249 return m_ht.insert(std::move(value));
250 }
251
252 iterator insert(const_iterator hint, const value_type& value) {
253 return m_ht.insert_hint(hint, value);
254 }
255
256 template <class P, typename std::enable_if<std::is_constructible<
257 value_type, P&&>::value>::type* = nullptr>
258 iterator insert(const_iterator hint, P&& value) {
259 return m_ht.emplace_hint(hint, std::forward<P>(value));
260 }
261
262 iterator insert(const_iterator hint, value_type&& value) {
263 return m_ht.insert_hint(hint, std::move(value));
264 }
265
266 template <class InputIt>
267 void insert(InputIt first, InputIt last) {
268 m_ht.insert(first, last);
269 }
270
271 void insert(std::initializer_list<value_type> ilist) {
272 m_ht.insert(ilist.begin(), ilist.end());
273 }
274
275 template <class M>
276 std::pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj) {
277 return m_ht.insert_or_assign(k, std::forward<M>(obj));
278 }
279
280 template <class M>
281 std::pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj) {
282 return m_ht.insert_or_assign(std::move(k), std::forward<M>(obj));
283 }
284
285 template <class M>
286 iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj) {
287 return m_ht.insert_or_assign(hint, k, std::forward<M>(obj));
288 }
289
290 template <class M>
291 iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj) {
292 return m_ht.insert_or_assign(hint, std::move(k), std::forward<M>(obj));
293 }
294
302 template <class... Args>
303 std::pair<iterator, bool> emplace(Args&&... args) {
304 return m_ht.emplace(std::forward<Args>(args)...);
305 }
306
314 template <class... Args>
315 iterator emplace_hint(const_iterator hint, Args&&... args) {
316 return m_ht.emplace_hint(hint, std::forward<Args>(args)...);
317 }
318
319 template <class... Args>
320 std::pair<iterator, bool> try_emplace(const key_type& k, Args&&... args) {
321 return m_ht.try_emplace(k, std::forward<Args>(args)...);
322 }
323
324 template <class... Args>
325 std::pair<iterator, bool> try_emplace(key_type&& k, Args&&... args) {
326 return m_ht.try_emplace(std::move(k), std::forward<Args>(args)...);
327 }
328
329 template <class... Args>
330 iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args) {
331 return m_ht.try_emplace_hint(hint, k, std::forward<Args>(args)...);
332 }
333
334 template <class... Args>
335 iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args) {
336 return m_ht.try_emplace_hint(hint, std::move(k),
337 std::forward<Args>(args)...);
338 }
339
340 iterator erase(iterator pos) { return m_ht.erase(pos); }
341 iterator erase(const_iterator pos) { return m_ht.erase(pos); }
342 iterator erase(const_iterator first, const_iterator last) {
343 return m_ht.erase(first, last);
344 }
345 size_type erase(const key_type& key) { return m_ht.erase(key); }
346
353 void erase_fast(iterator pos) { return m_ht.erase_fast(pos); }
354
360 size_type erase(const key_type& key, std::size_t precalculated_hash) {
361 return m_ht.erase(key, precalculated_hash);
362 }
363
369 template <
370 class K, class KE = KeyEqual,
371 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
372 size_type erase(const K& key) {
373 return m_ht.erase(key);
374 }
375
383 template <
384 class K, class KE = KeyEqual,
385 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
386 size_type erase(const K& key, std::size_t precalculated_hash) {
387 return m_ht.erase(key, precalculated_hash);
388 }
389
390 void swap(robin_map& other) { other.m_ht.swap(m_ht); }
391
392 /*
393 * Lookup
394 */
395 T& at(const Key& key) { return m_ht.at(key); }
396
402 T& at(const Key& key, std::size_t precalculated_hash) {
403 return m_ht.at(key, precalculated_hash);
404 }
405
406 const T& at(const Key& key) const { return m_ht.at(key); }
407
411 const T& at(const Key& key, std::size_t precalculated_hash) const {
412 return m_ht.at(key, precalculated_hash);
413 }
414
420 template <
421 class K, class KE = KeyEqual,
422 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
423 T& at(const K& key) {
424 return m_ht.at(key);
425 }
426
434 template <
435 class K, class KE = KeyEqual,
436 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
437 T& at(const K& key, std::size_t precalculated_hash) {
438 return m_ht.at(key, precalculated_hash);
439 }
440
444 template <
445 class K, class KE = KeyEqual,
446 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
447 const T& at(const K& key) const {
448 return m_ht.at(key);
449 }
450
454 template <
455 class K, class KE = KeyEqual,
456 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
457 const T& at(const K& key, std::size_t precalculated_hash) const {
458 return m_ht.at(key, precalculated_hash);
459 }
460
461 T& operator[](const Key& key) { return m_ht[key]; }
462 T& operator[](Key&& key) { return m_ht[std::move(key)]; }
463
464 size_type count(const Key& key) const { return m_ht.count(key); }
465
471 size_type count(const Key& key, std::size_t precalculated_hash) const {
472 return m_ht.count(key, precalculated_hash);
473 }
474
480 template <
481 class K, class KE = KeyEqual,
482 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
483 size_type count(const K& key) const {
484 return m_ht.count(key);
485 }
486
494 template <
495 class K, class KE = KeyEqual,
496 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
497 size_type count(const K& key, std::size_t precalculated_hash) const {
498 return m_ht.count(key, precalculated_hash);
499 }
500
501 iterator find(const Key& key) { return m_ht.find(key); }
502
508 iterator find(const Key& key, std::size_t precalculated_hash) {
509 return m_ht.find(key, precalculated_hash);
510 }
511
512 const_iterator find(const Key& key) const { return m_ht.find(key); }
513
517 const_iterator find(const Key& key, std::size_t precalculated_hash) const {
518 return m_ht.find(key, precalculated_hash);
519 }
520
526 template <
527 class K, class KE = KeyEqual,
528 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
529 iterator find(const K& key) {
530 return m_ht.find(key);
531 }
532
540 template <
541 class K, class KE = KeyEqual,
542 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
543 iterator find(const K& key, std::size_t precalculated_hash) {
544 return m_ht.find(key, precalculated_hash);
545 }
546
550 template <
551 class K, class KE = KeyEqual,
552 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
553 const_iterator find(const K& key) const {
554 return m_ht.find(key);
555 }
556
564 template <
565 class K, class KE = KeyEqual,
566 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
567 const_iterator find(const K& key, std::size_t precalculated_hash) const {
568 return m_ht.find(key, precalculated_hash);
569 }
570
571 bool contains(const Key& key) const { return m_ht.contains(key); }
572
578 bool contains(const Key& key, std::size_t precalculated_hash) const {
579 return m_ht.contains(key, precalculated_hash);
580 }
581
587 template <
588 class K, class KE = KeyEqual,
589 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
590 bool contains(const K& key) const {
591 return m_ht.contains(key);
592 }
593
601 template <
602 class K, class KE = KeyEqual,
603 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
604 bool contains(const K& key, std::size_t precalculated_hash) const {
605 return m_ht.contains(key, precalculated_hash);
606 }
607
608 std::pair<iterator, iterator> equal_range(const Key& key) {
609 return m_ht.equal_range(key);
610 }
611
617 std::pair<iterator, iterator> equal_range(const Key& key,
618 std::size_t precalculated_hash) {
619 return m_ht.equal_range(key, precalculated_hash);
620 }
621
622 std::pair<const_iterator, const_iterator> equal_range(const Key& key) const {
623 return m_ht.equal_range(key);
624 }
625
629 std::pair<const_iterator, const_iterator> equal_range(
630 const Key& key, std::size_t precalculated_hash) const {
631 return m_ht.equal_range(key, precalculated_hash);
632 }
633
639 template <
640 class K, class KE = KeyEqual,
641 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
642 std::pair<iterator, iterator> equal_range(const K& key) {
643 return m_ht.equal_range(key);
644 }
645
653 template <
654 class K, class KE = KeyEqual,
655 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
656 std::pair<iterator, iterator> equal_range(const K& key,
657 std::size_t precalculated_hash) {
658 return m_ht.equal_range(key, precalculated_hash);
659 }
660
664 template <
665 class K, class KE = KeyEqual,
666 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
667 std::pair<const_iterator, const_iterator> equal_range(const K& key) const {
668 return m_ht.equal_range(key);
669 }
670
674 template <
675 class K, class KE = KeyEqual,
676 typename std::enable_if<has_is_transparent<KE>::value>::type* = nullptr>
677 std::pair<const_iterator, const_iterator> equal_range(
678 const K& key, std::size_t precalculated_hash) const {
679 return m_ht.equal_range(key, precalculated_hash);
680 }
681
682 /*
683 * Bucket interface
684 */
685 size_type bucket_count() const { return m_ht.bucket_count(); }
686 size_type max_bucket_count() const { return m_ht.max_bucket_count(); }
687
688 /*
689 * Hash policy
690 */
691 float load_factor() const { return m_ht.load_factor(); }
692
693 float min_load_factor() const { return m_ht.min_load_factor(); }
694 float max_load_factor() const { return m_ht.max_load_factor(); }
695
705 void min_load_factor(float ml) { m_ht.min_load_factor(ml); }
706 void max_load_factor(float ml) { m_ht.max_load_factor(ml); }
707
708 void rehash(size_type count_) { m_ht.rehash(count_); }
709 void reserve(size_type count_) { m_ht.reserve(count_); }
710
711 /*
712 * Observers
713 */
714 hasher hash_function() const { return m_ht.hash_function(); }
715 key_equal key_eq() const { return m_ht.key_eq(); }
716
717 /*
718 * Other
719 */
720
724 iterator mutable_iterator(const_iterator pos) {
725 return m_ht.mutable_iterator(pos);
726 }
727
741 template <class Serializer>
742 void serialize(Serializer& serializer) const {
743 m_ht.serialize(serializer);
744 }
745
772 template <class Deserializer>
773 static robin_map deserialize(Deserializer& deserializer,
774 bool hash_compatible = false) {
775 robin_map map(0);
776 map.m_ht.deserialize(deserializer, hash_compatible);
777
778 return map;
779 }
780
781 friend bool operator==(const robin_map& lhs, const robin_map& rhs) {
782 if (lhs.size() != rhs.size()) {
783 return false;
784 }
785
786 for (const auto& element_lhs : lhs) {
787 const auto it_element_rhs = rhs.find(element_lhs.first);
788 if (it_element_rhs == rhs.cend() ||
789 element_lhs.second != it_element_rhs->second) {
790 return false;
791 }
792 }
793
794 return true;
795 }
796
797 friend bool operator!=(const robin_map& lhs, const robin_map& rhs) {
798 return !operator==(lhs, rhs);
799 }
800
801 friend void swap(robin_map& lhs, robin_map& rhs) { lhs.swap(rhs); }
802
803 private:
804 ht m_ht;
805};
806
811template <class Key, class T, class Hash = std::hash<Key>,
812 class KeyEqual = std::equal_to<Key>,
813 class Allocator = std::allocator<std::pair<Key, T>>,
814 bool StoreHash = false>
815using robin_pg_map = robin_map<Key, T, Hash, KeyEqual, Allocator, StoreHash,
817
818} // end namespace pxr_tsl
819
820PXR_NAMESPACE_CLOSE_SCOPE
821
822#endif
The 'operator*()' and 'operator->()' methods return a const reference and const pointer respectively ...
Definition: robin_hash.h:461
Internal common class used by robin_map and robin_set.
Definition: robin_hash.h:367
iterator erase(iterator pos)
Here to avoid template<class K> size_type erase(const K& key) being used when we use an iterator inst...
Definition: robin_hash.h:836
Grow the hash table by using prime numbers as bucket count.
Implementation of a hash map using open-addressing and the robin hood hashing algorithm with backward...
Definition: robin_map.h:96
std::pair< iterator, iterator > equal_range(const Key &key, std::size_t precalculated_hash)
Use the hash value 'precalculated_hash' instead of hashing the key.
Definition: robin_map.h:617
bool contains(const Key &key, std::size_t precalculated_hash) const
Use the hash value 'precalculated_hash' instead of hashing the key.
Definition: robin_map.h:578
const_iterator find(const K &key, std::size_t precalculated_hash) const
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:567
const_iterator find(const Key &key, std::size_t precalculated_hash) const
Use the hash value 'precalculated_hash' instead of hashing the key.
Definition: robin_map.h:517
static robin_map deserialize(Deserializer &deserializer, bool hash_compatible=false)
Deserialize a previously serialized map through the deserializer parameter.
Definition: robin_map.h:773
std::pair< const_iterator, const_iterator > equal_range(const K &key) const
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:667
const T & at(const K &key, std::size_t precalculated_hash) const
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:457
void erase_fast(iterator pos)
Erase the element at position 'pos'.
Definition: robin_map.h:353
std::pair< const_iterator, const_iterator > equal_range(const Key &key, std::size_t precalculated_hash) const
Use the hash value 'precalculated_hash' instead of hashing the key.
Definition: robin_map.h:629
std::pair< iterator, iterator > equal_range(const K &key)
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:642
bool contains(const K &key, std::size_t precalculated_hash) const
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:604
void min_load_factor(float ml)
Set the min_load_factor to ml.
Definition: robin_map.h:705
size_type count(const Key &key, std::size_t precalculated_hash) const
Use the hash value 'precalculated_hash' instead of hashing the key.
Definition: robin_map.h:471
T & at(const K &key)
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:423
const_iterator find(const K &key) const
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:553
std::pair< const_iterator, const_iterator > equal_range(const K &key, std::size_t precalculated_hash) const
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:677
size_type erase(const key_type &key, std::size_t precalculated_hash)
Use the hash value 'precalculated_hash' instead of hashing the key.
Definition: robin_map.h:360
iterator find(const Key &key, std::size_t precalculated_hash)
Use the hash value 'precalculated_hash' instead of hashing the key.
Definition: robin_map.h:508
T & at(const K &key, std::size_t precalculated_hash)
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:437
iterator mutable_iterator(const_iterator pos)
Convert a const_iterator to an iterator.
Definition: robin_map.h:724
iterator emplace_hint(const_iterator hint, Args &&... args)
Due to the way elements are stored, emplace_hint will need to move or copy the key-value once.
Definition: robin_map.h:315
iterator find(const K &key, std::size_t precalculated_hash)
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:543
bool contains(const K &key) const
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:590
const T & at(const K &key) const
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:447
size_type count(const K &key) const
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:483
std::pair< iterator, bool > emplace(Args &&... args)
Due to the way elements are stored, emplace will need to move or copy the key-value once.
Definition: robin_map.h:303
size_type erase(const K &key)
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:372
const T & at(const Key &key, std::size_t precalculated_hash) const
Use the hash value 'precalculated_hash' instead of hashing the key.
Definition: robin_map.h:411
T & at(const Key &key, std::size_t precalculated_hash)
Use the hash value 'precalculated_hash' instead of hashing the key.
Definition: robin_map.h:402
iterator find(const K &key)
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:529
size_type erase(const K &key, std::size_t precalculated_hash)
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:386
std::pair< iterator, iterator > equal_range(const K &key, std::size_t precalculated_hash)
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:656
size_type count(const K &key, std::size_t precalculated_hash) const
This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent ex...
Definition: robin_map.h:497
void serialize(Serializer &serializer) const
Serialize the map through the serializer parameter.
Definition: robin_map.h:742
MIT License.