blob: f3478d8b19a8437b0dc7acb5ef571b77cd820e1e [file] [log] [blame]
/* Copyright (c) 2016 Google Inc
* Barret Rhoden <brho@cs.berkeley.edu>
* See LICENSE for details.
*
* Helper structs and funcs for making a dynamically-sized hash table. */
#pragma once
struct hash_helper {
unsigned int nr_hash_lists;
unsigned int nr_hash_bits;
size_t nr_items;
size_t load_limit;
};
#define HASH_MAX_LOAD_FACTOR(size) ((size * 13) / 20)
#define HASH_INIT_NR_BITS 6
#define HASH_MAX_NR_BITS 31
#define HASH_INIT_SZ (1 << HASH_INIT_NR_BITS)
static inline bool hash_needs_more(struct hash_helper *hh)
{
if (hh->nr_hash_bits == HASH_MAX_NR_BITS)
return FALSE;
return hh->nr_items > hh->load_limit;
}
/* Only call when you know we need more (i.e., bits < 31). */
static inline unsigned int hash_next_nr_lists(struct hash_helper *hh)
{
return 1 << (hh->nr_hash_bits + 1);
}
/* Only call when you know we need more (i.e., bits < 31). */
static inline void hash_incr_nr_lists(struct hash_helper *hh)
{
hh->nr_hash_bits++;
hh->nr_hash_lists = 1 << hh->nr_hash_bits;
}
static inline void hash_set_load_limit(struct hash_helper *hh, size_t lim)
{
hh->load_limit = lim;
}
static inline void hash_reset_load_limit(struct hash_helper *hh)
{
hh->load_limit = HASH_MAX_LOAD_FACTOR(hh->nr_hash_lists);
}
static inline void hash_init_hh(struct hash_helper *hh)
{
hh->nr_hash_lists = HASH_INIT_SZ;
hh->nr_hash_bits = HASH_INIT_NR_BITS;
hh->nr_items = 0;
hash_reset_load_limit(hh);
}