#ifndef HASHMAP_H #define HASHMAP_H #include typedef struct hashtable *hashtable_t; typedef size_t (*hashtable_hash_func)(void *key); typedef bool (*hashtable_equal_func)(void *key1, void *key2); struct hashtable { hashtable_hash_func hash_func; hashtable_equal_func equal_func; struct hashtable_item { struct hashtable_item *next; void *key; void *data; } **table; size_t size; size_t cap; }; hashtable_t hashtable_create(size_t cap, hashtable_hash_func hash_func, hashtable_equal_func equal_func); void hashtable_destroy(hashtable_t ht); void hashtable_reset(hashtable_t ht); int hashtable_insert(hashtable_t ht, void *key, void *data, void **prevkey, void **prevdata); int hashtable_query(hashtable_t ht, void *key, void **data); int hashtable_delete(hashtable_t ht, void *key); #define hashtable_for_each_item(ht, item, i) \ for(size_t i = 0; i < ht->cap; i++) \ for(struct hashtable_item *item = ht->table[i]; \ item != NULL; \ item = item->next) #define hashtable_for_each_item_on_index(ht, item, idx) \ for(struct hashtable_item *item = \ ht->table[idx]; \ item != NULL; \ item = item->next) #define hashtable_for_each_item_safe(ht, item, i) \ for(size_t i = 0; i < ht->cap; i++) \ for(struct hashtable_item \ *item = ht->table[i], \ *next = NULL; \ item != NULL && (next = item->next, 1); \ item = next) #endif