13#ifndef ZEPHYR_INCLUDE_SYS_HASH_MAP_H_
14#define ZEPHYR_INCLUDE_SYS_HASH_MAP_H_
47#define SYS_HASHMAP_DEFINE_ADVANCED(_name, _api, _config_type, _data_type, _hash_func, \
49 const struct _config_type _name##_config = __VA_ARGS__; \
50 struct _data_type _name##_data; \
51 struct sys_hashmap _name = { \
52 .api = (const struct sys_hashmap_api *)(_api), \
53 .config = (const struct sys_hashmap_config *)&_name##_config, \
54 .data = (struct sys_hashmap_data *)&_name##_data, \
55 .hash_func = (_hash_func), \
56 .alloc_func = (_alloc_func), \
75#define SYS_HASHMAP_DEFINE_STATIC_ADVANCED(_name, _api, _config_type, _data_type, _hash_func, \
77 static const struct _config_type _name##_config = __VA_ARGS__; \
78 static struct _data_type _name##_data; \
79 static struct sys_hashmap _name = { \
80 .api = (const struct sys_hashmap_api *)(_api), \
81 .config = (const struct sys_hashmap_config *)&_name##_config, \
82 .data = (struct sys_hashmap_data *)&_name##_data, \
83 .hash_func = (_hash_func), \
84 .alloc_func = (_alloc_func), \
94#define SYS_HASHMAP_DEFINE(_name) SYS_HASHMAP_DEFAULT_DEFINE(_name)
103#define SYS_HASHMAP_DEFINE_STATIC(_name) SYS_HASHMAP_DEFAULT_DEFINE_STATIC(_name)
119#define SYS_HASHMAP_DEFAULT_ALLOCATOR sys_hashmap_default_allocator
122#define SYS_HASHMAP_DEFAULT_LOAD_FACTOR 75
317 size_t num_reserved,
size_t *new_num_buckets)
323 const bool shrink = !grow;
333 __ASSERT_NO_MSG(size <
SIZE_MAX / 100);
340 n_buckets <<= grow * (size != 1);
342 n_buckets >>= shrink;
345 n_buckets *= (size != 0);
347 __ASSERT_NO_MSG(new_num_buckets != NULL);
348 __ASSERT_NO_MSG(new_num_buckets != &data->
n_buckets);
349 *new_num_buckets = n_buckets;
355 shrink && (n_buckets == 0 || (size * 100) / n_buckets <= map->
config->
load_factor);
357 return should_grow || should_shrink;
uint32_t(* sys_hash_func32_t)(const void *str, size_t n)
32-bit Hash function interface
Definition hash_function.h:41
static bool sys_hashmap_iterator_has_next(const struct sys_hashmap_iterator *it)
Check if a Hashmap iterator has a next entry.
Definition hash_map_api.h:68
static bool sys_hashmap_remove(struct sys_hashmap *map, uint64_t key, uint64_t *value)
Remove an entry from a sys_hashmap.
Definition hash_map.h:204
static int sys_hashmap_insert(struct sys_hashmap *map, uint64_t key, uint64_t value, uint64_t *old_value)
Insert a new entry into a sys_hashmap.
Definition hash_map.h:186
static uint8_t sys_hashmap_load_factor(const struct sys_hashmap *map)
Query the load factor of map.
Definition hash_map.h:275
static size_t sys_hashmap_size(const struct sys_hashmap *map)
Query the number of entries contained within map.
Definition hash_map.h:247
static bool sys_hashmap_get(const struct sys_hashmap *map, uint64_t key, uint64_t *value)
Get a value from a sys_hashmap.
Definition hash_map.h:221
static bool sys_hashmap_is_empty(const struct sys_hashmap *map)
Check if map is empty.
Definition hash_map.h:260
void(* sys_hashmap_callback_t)(uint64_t key, uint64_t value, void *cookie)
Callback interface for sys_hashmap.
Definition hash_map_api.h:106
static size_t sys_hashmap_num_buckets(const struct sys_hashmap *map)
Query the number of buckets used in map.
Definition hash_map.h:290
void *(* sys_hashmap_allocator_t)(void *ptr, size_t new_size)
Allocator interface for sys_hashmap.
Definition hash_map_api.h:84
static bool sys_hashmap_contains_key(const struct sys_hashmap *map, uint64_t key)
Check if map contains a value associated with key.
Definition hash_map.h:235
static void * sys_hashmap_default_allocator(void *ptr, size_t size)
Definition hash_map.h:108
static void sys_hashmap_clear(struct sys_hashmap *map, sys_hashmap_callback_t cb, void *cookie)
Clear all entries contained in a sys_hashmap.
Definition hash_map.h:165
static void sys_hashmap_foreach(const struct sys_hashmap *map, sys_hashmap_callback_t cb, void *cookie)
Iterate over all values contained in a sys_hashmap.
Definition hash_map.h:145
static bool sys_hashmap_should_rehash(const struct sys_hashmap *map, bool grow, size_t num_reserved, size_t *new_num_buckets)
Decide whether the Hashmap should be resized.
Definition hash_map.h:316
Open-Addressing / Linear Probe Hashmap Implementation.
Separate Chaining Hashmap Implementation.
__UINT64_TYPE__ uint64_t
Definition stdint.h:91
#define SIZE_MAX
Definition stdint.h:70
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
void * realloc(void *ptr, size_t size)
Generic Hashmap API.
Definition hash_map_api.h:168
sys_hashmap_iterator_t iter
Iterator constructor (in-place)
Definition hash_map_api.h:170
sys_hashmap_remove_t remove
Remove a key-value pair from the Hashmap.
Definition hash_map_api.h:176
sys_hashmap_clear_t clear
Clear the hash table, freeing all resources.
Definition hash_map_api.h:172
sys_hashmap_insert_t insert
Insert a key-value pair into the Hashmap.
Definition hash_map_api.h:174
sys_hashmap_get_t get
Retrieve the value associated with a given key from the Hashmap.
Definition hash_map_api.h:178
Generic Hashmap configuration.
Definition hash_map_api.h:197
uint8_t initial_n_buckets
Initial number of buckets to allocate.
Definition hash_map_api.h:203
uint8_t load_factor
Maximum load factor expressed in hundredths.
Definition hash_map_api.h:201
Generic Hashmap data.
Definition hash_map_api.h:225
size_t n_buckets
The number of buckets currently allocated.
Definition hash_map_api.h:229
size_t size
The number of entries currently in the Hashmap.
Definition hash_map_api.h:231
Generic Hashmap iterator interface.
Definition hash_map_api.h:44
const struct sys_hashmap * map
Pointer to the associated Hashmap.
Definition hash_map_api.h:46
const size_t size
Number of entries in the map.
Definition hash_map_api.h:56
uint64_t key
Key associated with the current entry.
Definition hash_map_api.h:52
void(* next)(struct sys_hashmap_iterator *it)
Modify the iterator in-place to point to the next Hashmap entry.
Definition hash_map_api.h:48
uint64_t value
Value associated with the current entry.
Definition hash_map_api.h:54
Definition hash_map_oa_lp.h:27
size_t size
Definition hash_map_oa_lp.h:30
size_t n_buckets
Definition hash_map_oa_lp.h:29
Generic Hashmap.
Definition hash_map.h:125
struct sys_hashmap_data * data
Hashmap data.
Definition hash_map.h:131
sys_hash_func32_t hash_func
Hash function.
Definition hash_map.h:133
const struct sys_hashmap_api * api
Hashmap API.
Definition hash_map.h:127
sys_hashmap_allocator_t alloc_func
Allocator.
Definition hash_map.h:135
const struct sys_hashmap_config * config
Hashmap configuration.
Definition hash_map.h:129