23#ifndef FROZEN_LETITGO_UNORDERED_SET_H
24#define FROZEN_LETITGO_UNORDERED_SET_H
39 template <
class T>
constexpr T
const &
operator()(T
const &key)
const {
46template <
class Key, std::
size_t N,
typename Hash = elsa<Key>,
47 class KeyEqual = std::equal_to<Key>>
49 static constexpr std::size_t storage_size =
76 KeyEqual
const &equal)
79 , tables_{
bits::make_pmh_tables<storage_size>(
87 constexpr unordered_set(std::initializer_list<Key> keys, Hash
const & hash, KeyEqual
const & equal)
98 constexpr bool empty()
const {
return !N; }
103 template <
class KeyType>
104 constexpr std::size_t
count(KeyType
const &key)
const {
108 template <
class KeyType,
class Hasher,
class Equal>
110 auto const pos = tables_.lookup(key, hash);
111 auto it = keys_.begin() + pos;
112 if (it != keys_.end() && equal(*it, key))
117 template <
class KeyType>
120 auto it = keys_.begin() + pos;
121 if (it != keys_.end() &&
key_eq()(*it, key))
127 template <
class KeyType>
128 constexpr bool contains(KeyType
const &key)
const {
129 return this->
find(key) != keys_.end();
132 template <
class KeyType>
133 constexpr std::pair<const_iterator, const_iterator>
equal_range(KeyType
const &key)
const {
134 auto const it =
find(key);
138 return {keys_.end(), keys_.end()};
147 constexpr const key_equal&
key_eq()
const {
return static_cast<KeyEqual const&
>(*this); }
150template <
typename T, std::
size_t N>
155template <
typename T, std::
size_t N,
typename Hasher,
typename Equal>
160template <
typename T, std::
size_t N>
165template <
typename T, std::
size_t N,
typename Hasher,
typename Equal>
166constexpr auto make_unordered_set(std::array<T, N>
const &keys, Hasher
const& hash, Equal
const& equal) {
170#ifdef FROZEN_LETITGO_HAS_DEDUCTION_GUIDES
172template <
class T,
class... Args>
173unordered_set(T, Args...) -> unordered_set<T,
sizeof...(Args) + 1>;
Definition basic_types.h:90
const value_type & const_reference
Definition basic_types.h:109
std::ptrdiff_t difference_type
Definition basic_types.h:115
const_pointer const_iterator
Definition basic_types.h:113
const value_type * const_pointer
Definition basic_types.h:111
std::size_t size_type
Definition basic_types.h:114
Definition unordered_set.h:48
constexpr std::size_t bucket_count() const
Definition unordered_set.h:142
typename container_type::difference_type difference_type
Definition unordered_set.h:62
const_reference reference
Definition unordered_set.h:66
constexpr unordered_set(container_type keys, Hash const &hash, KeyEqual const &equal)
Definition unordered_set.h:75
constexpr bool contains(KeyType const &key) const
Definition unordered_set.h:128
constexpr unordered_set(std::initializer_list< Key > keys)
Definition unordered_set.h:84
Hash hasher
Definition unordered_set.h:63
Key key_type
Definition unordered_set.h:59
constexpr const_iterator cbegin() const
Definition unordered_set.h:94
typename container_type::const_reference const_reference
Definition unordered_set.h:65
const_pointer pointer
Definition unordered_set.h:68
typename container_type::const_iterator const_iterator
Definition unordered_set.h:69
constexpr unordered_set(std::initializer_list< Key > keys, Hash const &hash, KeyEqual const &equal)
Definition unordered_set.h:87
constexpr const_iterator end() const
Definition unordered_set.h:93
const_iterator iterator
Definition unordered_set.h:70
constexpr const_iterator begin() const
Definition unordered_set.h:92
constexpr size_type size() const
Definition unordered_set.h:99
unordered_set(unordered_set const &)=default
constexpr std::pair< const_iterator, const_iterator > equal_range(KeyType const &key) const
Definition unordered_set.h:133
constexpr unordered_set(container_type keys)
Definition unordered_set.h:81
constexpr size_type max_size() const
Definition unordered_set.h:100
constexpr const_iterator find(KeyType const &key) const
Definition unordered_set.h:118
constexpr const_iterator find(KeyType const &key, Hasher const &hash, Equal const &equal) const
Definition unordered_set.h:109
constexpr std::size_t count(KeyType const &key) const
Definition unordered_set.h:104
constexpr const key_equal & key_eq() const
Definition unordered_set.h:147
typename container_type::const_pointer const_pointer
Definition unordered_set.h:67
constexpr std::size_t max_bucket_count() const
Definition unordered_set.h:143
typename container_type::size_type size_type
Definition unordered_set.h:61
constexpr const hasher & hash_function() const
Definition unordered_set.h:146
Key value_type
Definition unordered_set.h:60
constexpr const_iterator cend() const
Definition unordered_set.h:95
KeyEqual key_equal
Definition unordered_set.h:64
constexpr bool empty() const
Definition unordered_set.h:98
Definition algorithms.h:33
auto constexpr next_highest_power_of_two(std::size_t v)
Definition algorithms.h:35
Definition algorithm.h:30
constexpr auto make_unordered_set(T const (&keys)[N])
Definition unordered_set.h:151
minstd_rand default_prg_t
Definition random.h:93
Definition unordered_set.h:38
constexpr T const & operator()(T const &key) const
Definition unordered_set.h:39