|
| | 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) |
| |
| | robin_hash (const robin_hash &other) |
| |
| | 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) |
| |
| robin_hash & | operator= (const robin_hash &other) |
| |
| robin_hash & | operator= (robin_hash &&other) |
| |
| allocator_type | get_allocator () const |
| |
| iterator | begin () noexcept |
| |
| const_iterator | begin () const noexcept |
| |
| const_iterator | cbegin () const noexcept |
| |
| iterator | end () noexcept |
| |
| const_iterator | end () const noexcept |
| |
| const_iterator | cend () const noexcept |
| |
| bool | empty () const noexcept |
| |
| size_type | size () const noexcept |
| |
| size_type | max_size () const noexcept |
| |
| void | clear () noexcept |
| |
| template<typename P > |
| std::pair< iterator, bool > | insert (P &&value) |
| |
| template<typename P > |
| iterator | insert_hint (const_iterator hint, P &&value) |
| |
| template<class InputIt > |
| void | insert (InputIt first, InputIt last) |
| |
| template<class K , class M > |
| std::pair< iterator, bool > | insert_or_assign (K &&key, M &&obj) |
| |
| template<class K , class M > |
| iterator | insert_or_assign (const_iterator hint, K &&key, M &&obj) |
| |
| template<class... Args> |
| std::pair< iterator, bool > | emplace (Args &&... args) |
| |
| template<class... Args> |
| iterator | emplace_hint (const_iterator hint, Args &&... args) |
| |
| template<class K , class... Args> |
| std::pair< iterator, bool > | try_emplace (K &&key, Args &&... args) |
| |
| template<class K , class... Args> |
| iterator | try_emplace_hint (const_iterator hint, K &&key, Args &&... args) |
| |
| iterator | erase (iterator pos) |
| |
| iterator | erase (const_iterator pos) |
| |
| iterator | erase (const_iterator first, const_iterator last) |
| |
| template<class K > |
| size_type | erase (const K &key) |
| |
| template<class K > |
| size_type | erase (const K &key, std::size_t my_hash) |
| |
| void | swap (robin_hash &other) |
| |
| template<class K , class U = ValueSelect, typename std::enable_if< has_mapped_type< U >::value >::type * = nullptr> |
| U::value_type & | at (const K &key) |
| |
| template<class K , class U = ValueSelect, typename std::enable_if< has_mapped_type< U >::value >::type * = nullptr> |
| U::value_type & | at (const K &key, std::size_t my_hash) |
| |
| template<class K , class U = ValueSelect, typename std::enable_if< has_mapped_type< U >::value >::type * = nullptr> |
| const U::value_type & | at (const K &key) const |
| |
| template<class K , class U = ValueSelect, typename std::enable_if< has_mapped_type< U >::value >::type * = nullptr> |
| const U::value_type & | at (const K &key, std::size_t my_hash) const |
| |
| template<class K , class U = ValueSelect, typename std::enable_if< has_mapped_type< U >::value >::type * = nullptr> |
| U::value_type & | operator[] (K &&key) |
| |
| template<class K > |
| size_type | count (const K &key) const |
| |
| template<class K > |
| size_type | count (const K &key, std::size_t my_hash) const |
| |
| template<class K > |
| iterator | find (const K &key) |
| |
| template<class K > |
| iterator | find (const K &key, std::size_t my_hash) |
| |
| template<class K > |
| const_iterator | find (const K &key) const |
| |
| template<class K > |
| const_iterator | find (const K &key, std::size_t my_hash) const |
| |
| template<class K > |
| std::pair< iterator, iterator > | equal_range (const K &key) |
| |
| template<class K > |
| std::pair< iterator, iterator > | equal_range (const K &key, std::size_t my_hash) |
| |
| template<class K > |
| std::pair< const_iterator, const_iterator > | equal_range (const K &key) const |
| |
| template<class K > |
| std::pair< const_iterator, const_iterator > | equal_range (const K &key, std::size_t my_hash) const |
| |
| size_type | bucket_count () const |
| |
| size_type | max_bucket_count () const |
| |
| float | load_factor () const |
| |
| float | min_load_factor () const |
| |
| float | max_load_factor () const |
| |
| void | min_load_factor (float ml) |
| |
| void | max_load_factor (float ml) |
| |
| void | rehash (size_type new_count) |
| |
| void | reserve (size_type new_count) |
| |
| hasher | hash_function () const |
| |
| key_equal | key_eq () const |
| |
| iterator | mutable_iterator (const_iterator pos) |
| |
|
| template<class K > |
| std::size_t | hash_key (const K &key) const |
| |
| template<class K1 , class K2 > |
| bool | compare_keys (const K1 &key1, const K2 &key2) const |
| |
| std::size_t | bucket_for_hash (std::size_t my_hash) const |
| |
| template<class U = GrowthPolicy, typename std::enable_if< is_power_of_two_policy< U >::value >::type * = nullptr> |
| std::size_t | next_bucket (std::size_t index) const noexcept |
| |
| template<class U = GrowthPolicy, typename std::enable_if<!is_power_of_two_policy< U >::value >::type * = nullptr> |
| std::size_t | next_bucket (std::size_t index) const noexcept |
| |
| template<class K > |
| iterator | find_impl (const K &key, std::size_t my_hash) |
| |
| template<class K > |
| const_iterator | find_impl (const K &key, std::size_t my_hash) const |
| |
| void | erase_from_bucket (iterator pos) |
| |
| template<class K , class... Args> |
| std::pair< iterator, bool > | insert_impl (const K &key, Args &&... value_type_args) |
| |
| template<class... Args> |
| void | insert_value (std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type my_hash, Args &&... value_type_args) |
| |
| void | insert_value (std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type my_hash, value_type &&value) |
| |
| void | insert_value_impl (std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type my_hash, value_type &value) |
| |
| void | rehash_impl (size_type new_count) |
| |
| void | insert_value_on_rehash (std::size_t ibucket, distance_type dist_from_ideal_bucket, truncated_hash_type my_hash, value_type &&value) |
| |
| bool | rehash_on_extreme_load () |
| |
| bucket_entry * | static_empty_bucket_ptr () |
| |
template<class ValueType, class KeySelect, class ValueSelect, class Hash, class KeyEqual, class Allocator, bool StoreHash, class GrowthPolicy>
class tsl::detail_robin_hash::robin_hash< ValueType, KeySelect, ValueSelect, Hash, KeyEqual, Allocator, StoreHash, GrowthPolicy >
Internal common class used by robin_map and robin_set.
ValueType is what will be stored by robin_hash (usually std::pair<Key, T> for map and Key for set).
KeySelect should be a FunctionObject which takes a ValueType in parameter and returns a reference to the key.
ValueSelect should be a FunctionObject which takes a ValueType in parameter and returns a reference to the value. ValueSelect should be void if there is no value (in a set for example).
The strong exception guarantee only holds if the expression std::is_nothrow_swappable<ValueType>\:\:value && std::is_nothrow_move_constructible<ValueType>\:\:value is true.
Behaviour is undefined if the destructor of ValueType throws.
template<class ValueType, class KeySelect, class ValueSelect, class Hash, class KeyEqual, class Allocator, bool StoreHash, class GrowthPolicy>
| tsl::detail_robin_hash::robin_hash< ValueType, KeySelect, ValueSelect, Hash, KeyEqual, Allocator, StoreHash, GrowthPolicy >::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 |
|
) |
| |
|
inline |
C++11 doesn't support the creation of a std::vector with a custom allocator and 'count' default-inserted elements. The needed constructor explicit vector(size_type count, const Allocator& alloc = Allocator()); is only available in C++14 and later. We thus must resize after using the vector(const Allocator& alloc) constructor.
We can't use vector(size_type count, const T& value, const Allocator& alloc) as it requires the value T to be copyable.
template<class ValueType, class KeySelect, class ValueSelect, class Hash, class KeyEqual, class Allocator, bool StoreHash, class GrowthPolicy>
Backward shift, swap the empty bucket, previous_ibucket, with the values on its right, ibucket, until we cross another empty bucket or if the other bucket has a distance_from_ideal_bucket == 0.
We try to move the values closer to their ideal bucket.
template<class ValueType, class KeySelect, class ValueSelect, class Hash, class KeyEqual, class Allocator, bool StoreHash, class GrowthPolicy>
Grow the table if m_grow_on_next_insert is true or we reached the max_load_factor. Shrink the table if m_try_skrink_on_next_insert is true (an erase occurred) and we're below the min_load_factor.
Return true if the table has been rehashed.
template<class ValueType, class KeySelect, class ValueSelect, class Hash, class KeyEqual, class Allocator, bool StoreHash, class GrowthPolicy>
We can only use the hash on rehash if the size of the hash type is the same as the stored one or if we use a power of two modulo. In the case of the power of two modulo, we just mask the least significant bytes, we just have to check that the truncated_hash_type didn't truncated more bytes.
template<class ValueType, class KeySelect, class ValueSelect, class Hash, class KeyEqual, class Allocator, bool StoreHash, class GrowthPolicy>
We can't shrink down the map on erase operations as the erase methods need to return the next iterator. Shrinking the map would invalidate all the iterators and we could not return the next iterator in a meaningful way, On erase, we thus just indicate on erase that we should try to shrink the hash table on the next insert if we go below the min_load_factor.