27template<
typename IntT>
inline constexpr IntT
ceil_division(
const IntT x,
const IntT y)
31 return x / y + ((x %
y) != 0);
34template<
typename IntT>
inline constexpr IntT
floor_division(
const IntT x,
const IntT y)
57 const int64_t max_load_factor_numerator,
58 const int64_t max_load_factor_denominator)
61 min_usable_slots, max_load_factor_numerator, max_load_factor_denominator));
81 : numerator_(numerator), denominator_(denominator)
92 BLI_assert(is_power_of_2(
int(min_total_slots)));
95 total_slots = std::max(total_slots, min_total_slots);
97 total_slots, numerator_, denominator_);
100 *r_total_slots = total_slots;
101 *r_usable_slots = usable_slots;
159 return key == EmptyValue;
167 return key == RemovedValue;
175 return key != EmptyValue && key != RemovedValue;
230 float average_collisions_;
235 float removed_load_factor_;
238 const void *address_;
250 template<
typename HashTable,
typename Keys>
253 total_collisions_ = 0;
254 size_ = hash_table.size();
255 capacity_ = hash_table.capacity();
256 removed_amount_ = hash_table.removed_amount();
257 size_per_element_ = hash_table.size_per_element();
258 size_in_bytes_ = hash_table.size_in_bytes();
259 address_ =
static_cast<const void *
>(&hash_table);
261 for (
const auto &key : keys) {
262 int64_t collisions = hash_table.count_collisions(key);
263 if (keys_by_collision_count_.
size() <= collisions) {
265 collisions - keys_by_collision_count_.
size() + 1);
267 keys_by_collision_count_[collisions]++;
268 total_collisions_ += collisions;
271 average_collisions_ = (size_ == 0) ? 0 : (
float)total_collisions_ / (
float)size_;
272 load_factor_ = (
float)size_ / (
float)capacity_;
273 removed_load_factor_ = (
float)removed_amount_ / (
float)capacity_;
276 void print(
const char *name)
const;
310 const auto a_begin = a.begin();
311 const auto a_end = a.end();
312 const auto b_begin =
b.begin();
313 const auto b_end =
b.end();
314 if (a_end - a_begin != b_end - b_begin) {
317 return std::equal(a_begin, a_end, b_begin);
321template<
typename T,
int64_t InlineBufferCapacity,
typename Allocator>
HashTableStats(const HashTable &hash_table, const Keys &keys)
void print(const char *name) const
LoadFactor(uint8_t numerator, uint8_t denominator)
static constexpr int64_t compute_total_slots(int64_t min_usable_slots, uint8_t numerator, uint8_t denominator)
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
void append_n_times(const T &value, const int64_t n)
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
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)
_W64 unsigned int uintptr_t
unsigned __int64 uint64_t
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)