26#include <unordered_map>
27#include <unordered_set>
33constexpr size_t kHashPrime = 0x9e3779b9;
35using PartitionKey = std::pair<int32_t, PartitionValues>;
46 : spec_id(key.first), values(key.second) {}
51 std::size_t operator()(
const PartitionValues& partition)
const noexcept {
54 for (
const auto& literal : partition.values()) {
55 hash ^= literal_hash(literal) + kHashPrime + (hash << 6) + (hash >> 2);
70 using is_transparent = void;
72 std::size_t operator()(
const PartitionKey& key)
const noexcept {
73 std::size_t hash = std::hash<int32_t>{}(key.first);
79 std::size_t hash = std::hash<int32_t>{}(key.spec_id);
88 using is_transparent = void;
91 bool operator()(
const PartitionKey& lhs,
const PartitionKey& rhs)
const {
92 return lhs.first == rhs.first && lhs.second == rhs.second;
96 bool operator()(
const PartitionKey& lhs,
const PartitionKeyRef& rhs)
const {
97 return lhs.first == rhs.spec_id && lhs.second == rhs.values;
101 bool operator()(
const PartitionKeyRef& lhs,
const PartitionKey& rhs)
const {
102 return lhs.spec_id == rhs.first && lhs.values == rhs.second;
107 return lhs.spec_id == rhs.spec_id && lhs.values == rhs.values;
118 std::unordered_map<PartitionKey, V, PartitionKeyHash, PartitionKeyEqual>;
119 using iterator =
typename map_type::iterator;
120 using const_iterator =
typename map_type::const_iterator;
125 size_t size()
const {
return map_.size(); }
128 bool empty()
const {
return map_.empty(); }
145 std::optional<std::reference_wrapper<V>>
get(int32_t spec_id,
148 return it != map_.end() ? std::make_optional(std::ref(it->second)) : std::nullopt;
155 std::optional<std::reference_wrapper<const V>>
get(
158 return it != map_.end() ? std::make_optional(std::cref(it->second)) : std::nullopt;
168 if (it != map_.end()) {
169 it->second = std::move(value);
172 map_.emplace(PartitionKey{spec_id, std::move(values)}, std::move(value));
182 if (it != map_.end()) {
190 iterator
begin() {
return map_.begin(); }
191 const_iterator
begin()
const {
return map_.begin(); }
192 const_iterator cbegin()
const {
return map_.cbegin(); }
195 iterator
end() {
return map_.end(); }
196 const_iterator
end()
const {
return map_.end(); }
197 const_iterator cend()
const {
return map_.cend(); }
206 using set_type = std::unordered_set<PartitionKey, PartitionKeyHash, PartitionKeyEqual>;
207 using iterator =
typename set_type::iterator;
208 using const_iterator =
typename set_type::const_iterator;
213 size_t size()
const {
return set_.size(); }
216 bool empty()
const {
return set_.empty(); }
234 auto [_, inserted] = set_.emplace(spec_id, std::move(values));
244 if (it != set_.end()) {
252 iterator
begin() {
return set_.begin(); }
253 const_iterator
begin()
const {
return set_.begin(); }
254 const_iterator cbegin()
const {
return set_.cbegin(); }
257 iterator
end() {
return set_.end(); }
258 const_iterator
end()
const {
return set_.end(); }
259 const_iterator cend()
const {
return set_.cend(); }
A map that uses a pair of spec ID and partition tuple as keys.
Definition partition_value_util.h:115
iterator begin()
Get iterator to the beginning.
Definition partition_value_util.h:190
bool contains(int32_t spec_id, const PartitionValues &values) const
Check if the map contains a key.
Definition partition_value_util.h:137
bool put(int32_t spec_id, PartitionValues values, V value)
Insert or update a value in the map.
Definition partition_value_util.h:166
size_t size() const
Get the number of entries in the map.
Definition partition_value_util.h:125
iterator end()
Get iterator to the end.
Definition partition_value_util.h:195
std::optional< std::reference_wrapper< const V > > get(int32_t spec_id, const PartitionValues &values) const
Get the value associated with a key (const version).
Definition partition_value_util.h:155
bool remove(int32_t spec_id, const PartitionValues &values)
Remove an entry from the map.
Definition partition_value_util.h:180
std::optional< std::reference_wrapper< V > > get(int32_t spec_id, const PartitionValues &values)
Get the value associated with a key.
Definition partition_value_util.h:145
void clear()
Clear all entries from the map.
Definition partition_value_util.h:131
bool empty() const
Check if the map is empty.
Definition partition_value_util.h:128
A set that uses a pair of spec ID and partition tuple as elements.
Definition partition_value_util.h:204
bool add(int32_t spec_id, PartitionValues values)
Add an element to the set.
Definition partition_value_util.h:233
iterator begin()
Get iterator to the beginning.
Definition partition_value_util.h:252
size_t size() const
Get the number of elements in the set.
Definition partition_value_util.h:213
iterator end()
Get iterator to the end.
Definition partition_value_util.h:257
void clear()
Clear all elements from the set.
Definition partition_value_util.h:219
bool contains(int32_t spec_id, const PartitionValues &values) const
Check if the set contains an element.
Definition partition_value_util.h:225
bool remove(int32_t spec_id, const PartitionValues &values)
Remove an element from the set.
Definition partition_value_util.h:242
bool empty() const
Check if the set is empty.
Definition partition_value_util.h:216
StructLike wrapper for a vector of literals that represent partition values.
Definition partition_values.h:36
Transparent equality functor for PartitionKey with heterogeneous lookup support.
Definition partition_value_util.h:87
Transparent hash functor for PartitionKey with heterogeneous lookup support.
Definition partition_value_util.h:69
Lightweight lookup key for heterogeneous lookup without copying PartitionValues.
Definition partition_value_util.h:39
Equality functor for PartitionValues.
Definition partition_value_util.h:62
Hash functor for PartitionValues.
Definition partition_value_util.h:50