30 return x /
y + ((
x %
y) != 0);
55 const int64_t max_load_factor_numerator,
56 const int64_t max_load_factor_denominator)
59 min_usable_slots, max_load_factor_numerator, max_load_factor_denominator));
78 constexpr LoadFactor(uint8_t numerator, uint8_t denominator)
79 : numerator_(numerator), denominator_(denominator)
90 BLI_assert(is_power_of_2(
int(min_total_slots)));
93 total_slots = std::max(total_slots, min_total_slots);
95 total_slots, numerator_, denominator_);
98 *r_total_slots = total_slots;
99 *r_usable_slots = usable_slots;
157 return key == EmptyValue;
165 return key == RemovedValue;
173 return key != EmptyValue && key != RemovedValue;
228 float average_collisions_;
233 float removed_load_factor_;
236 const void *address_;
248 template<
typename HashTable,
typename Keys>
251 total_collisions_ = 0;
252 size_ = hash_table.size();
253 capacity_ = hash_table.capacity();
254 removed_amount_ = hash_table.removed_amount();
255 size_per_element_ = hash_table.size_per_element();
256 size_in_bytes_ = hash_table.size_in_bytes();
257 address_ =
static_cast<const void *
>(&hash_table);
259 for (
const auto &key : keys) {
260 int64_t collisions = hash_table.count_collisions(key);
261 if (keys_by_collision_count_.size() <= collisions) {
262 keys_by_collision_count_.append_n_times(0,
263 collisions - keys_by_collision_count_.size() + 1);
265 keys_by_collision_count_[collisions]++;
266 total_collisions_ += collisions;
269 average_collisions_ = (size_ == 0) ? 0 : (
float)total_collisions_ / (
float)size_;
270 load_factor_ = (
float)size_ / (
float)capacity_;
271 removed_load_factor_ = (
float)removed_amount_ / (
float)capacity_;
308 const auto a_begin = a.begin();
309 const auto a_end = a.end();
310 const auto b_begin =
b.begin();
311 const auto b_end =
b.end();
312 if (a_end - a_begin != b_end - b_begin) {
315 return std::equal(a_begin, a_end, b_begin);
319template<
typename T,
int64_t InlineBufferCapacity,
typename Allocator>
unsigned long long int uint64_t
HashTableStats(const HashTable &hash_table, const Keys &keys)
void print(const char *name) const
constexpr LoadFactor(uint8_t numerator, uint8_t denominator)
constexpr void compute_total_and_usable_slots(int64_t min_total_slots, int64_t min_usable_slots, int64_t *r_total_slots, int64_t *r_usable_slots) const
static constexpr int64_t compute_total_slots(int64_t min_usable_slots, uint8_t numerator, uint8_t denominator)
constexpr IntT floor_division(const IntT x, const IntT y)
constexpr int64_t total_slot_amount_for_usable_slots(const int64_t min_usable_slots, const int64_t max_load_factor_numerator, const int64_t max_load_factor_denominator)
constexpr int64_t ceil_division_by_fraction(const int64_t x, const int64_t numerator, const int64_t denominator)
constexpr int64_t floor_multiplication_with_fraction(const int64_t x, const int64_t numerator, const int64_t denominator)
constexpr IntT ceil_division(const IntT x, const IntT y)
bool operator()(const T1 &a, const T2 &b) const
bool operator()(const T1 &a, const T2 &b) const
static bool is_empty(Pointer pointer)
static Pointer get_empty()
static bool is_not_empty_or_removed(Pointer pointer)
static void remove(Pointer &pointer)
static bool is_removed(Pointer pointer)
bool operator()(const T1 &a, const T2 &b) const
static bool is_removed(const Key &key)
static bool is_empty(const Key &key)
static void remove(Key &key)
static bool is_not_empty_or_removed(const Key &key)