24 #ifndef TSL_ROBIN_GROWTH_POLICY_H 25 #define TSL_ROBIN_GROWTH_POLICY_H 39 #define tsl_assert(expr) assert(expr) 41 #define tsl_assert(expr) (static_cast<void>(0)) 49 #ifndef TSL_THROW_OR_TERMINATE 50 #if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || \ 51 (defined(_MSC_VER) && defined(_CPPUNWIND))) && \ 52 !defined(TSL_NO_EXCEPTIONS) 53 #define TSL_THROW_OR_TERMINATE(ex, msg) throw ex(msg) 56 #define TSL_THROW_OR_TERMINATE(ex, msg) std::terminate() 59 #define TSL_THROW_OR_TERMINATE(ex, msg) \ 61 std::fprintf(stderr, msg); \ 69 #if defined(__GNUC__) || defined(__clang__) 70 #define TSL_LIKELY(exp) (__builtin_expect(!!(exp), true)) 72 #define TSL_LIKELY(exp) (exp) 103 if (min_bucket_count_in_out > 0) {
105 m_mask = min_bucket_count_in_out - 1;
127 return (
m_mask + 1) * GrowthFactor;
136 return (std::numeric_limits<std::size_t>::max() / 2) + 1;
157 for (std::size_t i = 1; i <
sizeof(std::size_t) * CHAR_BIT; i *= 2) {
166 return value != 0 && (value & (value - 1)) == 0;
171 "GrowthFactor must be a power of two >= 2.");
189 if (min_bucket_count_in_out > 0) {
190 m_mod = min_bucket_count_in_out;
205 const double next_bucket_count_ =
207 if (!std::isnormal(next_bucket_count_)) {
215 return std::size_t(next_bucket_count_);
225 1.0 * GrowthFactor::num / GrowthFactor::den;
236 static constexpr
const std::array<std::size_t, 40>
PRIMES = {
237 {1ul, 5ul, 17ul, 29ul, 37ul, 53ul,
238 67ul, 79ul, 97ul, 131ul, 193ul, 257ul,
239 389ul, 521ul, 769ul, 1031ul, 1543ul, 2053ul,
240 3079ul, 6151ul, 12289ul, 24593ul, 49157ul, 98317ul,
241 196613ul, 393241ul, 786433ul, 1572869ul, 3145739ul, 6291469ul,
242 12582917ul, 25165843ul, 50331653ul, 100663319ul, 201326611ul, 402653189ul,
243 805306457ul, 1610612741ul, 3221225473ul, 4294967291ul}};
245 template <
unsigned int IPrime>
static constexpr std::size_t
mod(std::size_t hash)
247 return hash %
PRIMES[IPrime];
253 static constexpr
const std::array<std::size_t (*)(std::size_t), 40>
MOD_PRIME = {
254 {&mod<0>, &mod<1>, &mod<2>, &mod<3>, &mod<4>, &mod<5>, &mod<6>, &mod<7>,
255 &mod<8>, &mod<9>, &mod<10>, &mod<11>, &mod<12>, &mod<13>, &mod<14>, &mod<15>,
256 &mod<16>, &mod<17>, &mod<18>, &mod<19>, &mod<20>, &mod<21>, &mod<22>, &mod<23>,
257 &mod<24>, &mod<25>, &mod<26>, &mod<27>, &mod<28>, &mod<29>, &mod<30>, &mod<31>,
258 &mod<32>, &mod<33>, &mod<34>, &mod<35>, &mod<36>, &mod<37>, &mod<38>, &mod<39>}};
301 if (min_bucket_count_in_out > 0) {
302 min_bucket_count_in_out = *it_prime;
305 min_bucket_count_in_out = 0;
331 "The type of m_iprime is not big enough.");
std::size_t bucket_for_hash(std::size_t hash) const noexcept
Definition: robin_growth_policy.h:116
std::size_t next_bucket_count() const
Definition: robin_growth_policy.h:199
std::size_t m_mod
Definition: robin_growth_policy.h:229
std::size_t bucket_for_hash(std::size_t hash) const noexcept
Definition: robin_growth_policy.h:309
static constexpr std::size_t mod(std::size_t hash)
Definition: robin_growth_policy.h:245
void clear() noexcept
Definition: robin_growth_policy.h:221
Definition: hopscotch_growth_policy.h:37
static constexpr const std::array< std::size_t(*)(std::size_t), 40 > MOD_PRIME
Definition: robin_growth_policy.h:253
std::size_t max_bucket_count() const
Definition: robin_growth_policy.h:323
#define TSL_THROW_OR_TERMINATE(ex, msg)
Definition: robin_growth_policy.h:59
static const std::size_t MAX_BUCKET_COUNT
Definition: robin_growth_policy.h:226
mod_growth_policy(std::size_t &min_bucket_count_in_out)
Definition: robin_growth_policy.h:183
void clear() noexcept
Definition: robin_growth_policy.h:143
std::size_t max_bucket_count() const
Definition: robin_growth_policy.h:133
std::size_t next_bucket_count() const
Definition: robin_growth_policy.h:314
Definition: robin_growth_policy.h:180
static constexpr const std::array< std::size_t, 40 > PRIMES
Definition: robin_growth_policy.h:236
std::size_t m_mask
Definition: robin_growth_policy.h:171
void clear() noexcept
Definition: robin_growth_policy.h:325
prime_growth_policy(std::size_t &min_bucket_count_in_out)
Definition: robin_growth_policy.h:292
static constexpr bool is_power_of_two(std::size_t value)
Definition: robin_growth_policy.h:164
static constexpr double REHASH_SIZE_MULTIPLICATION_FACTOR
Definition: robin_growth_policy.h:224
power_of_two_growth_policy(std::size_t &min_bucket_count_in_out)
Definition: robin_growth_policy.h:97
std::size_t max_bucket_count() const
Definition: robin_growth_policy.h:219
static std::size_t round_up_to_power_of_two(std::size_t value)
Definition: robin_growth_policy.h:146
Definition: robin_growth_policy.h:289
std::size_t next_bucket_count() const
Definition: robin_growth_policy.h:121
unsigned int m_iprime
Definition: robin_growth_policy.h:328
std::size_t bucket_for_hash(std::size_t hash) const noexcept
Definition: robin_growth_policy.h:197
Definition: robin_growth_policy.h:86