#ifndef __SAFEC_MAP_H #include "types.h" size_t hash_bytes(const void* start, size_t size); typedef size_t (*hash_func_t)(const void* key); typedef bool (*eq_func_t)(const void* key1, const void* key2); typedef void (*map_foreach_func_t)(void* key, void* val, void* data); typedef void (*set_foreach_func_t)(void* key, void* data); struct __map_entry { void* key; void* value; struct __map_entry* next; }; typedef struct { hash_func_t hash_func; eq_func_t eq_func; double load_limit; size_t size; size_t __num_buckets; struct __map_entry** __buckets; } map_t; void map_init( map_t* map, hash_func_t hash_func, eq_func_t eq_func, double load_limit); void map_init_capacity( map_t* map, hash_func_t hash_func, eq_func_t eq_func, double load_limit, size_t capacity); void map_destroy(map_t* map); bool map_contains(const map_t* map, const void* key); void* map_get(const map_t* map, const void* key); void* map_get_or_default(const map_t* map, const void* key, void* default_val); void* map_compute_if_absent(map_t* map, void* key, void* default_val); void map_put(map_t* map, void* key, void* val); void* map_remove(map_t* map, const void* key); void map_foreach_readonly( map_t* map, map_foreach_func_t foreach_func, void* data); void map_foreach_readwrite( map_t* map, map_foreach_func_t foreach_func, void* data); typedef struct { hash_func_t hash_func; eq_func_t eq_func; double load_limit; size_t size; size_t __num_buckets; void** __buckets; } set_t; void set_init( set_t* set, hash_func_t hash_func, eq_func_t eq_func, double load_limit); void set_init_capacity( set_t* set, hash_func_t hash_func, eq_func_t eq_func, double load_limit, size_t capacity); void set_destroy(set_t* set); bool set_contains(const set_t* set, const void* key); void* set_get(const set_t* set, const void* key); void* set_get_or_default(const set_t* set, const void* key, void* default_key); void* set_add(set_t* set, void* key); void set_put(set_t* set, void* key); void* set_remove(set_t* set, const void* key); void set_foreach(set_t* set, set_foreach_func_t foreach_func, void* data); #endif