| /* 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); | 
 | } |