1 #ifndef _HASHMAP_H 2 #define _HASHMAP_H 3 4 #include "utils/iterator.h" 5 #include "utils/allocator.h" 6 7 enum hashmap_flags { 8 HASHMAP_AUTO_INC = 0x1, 9 HASHMAP_AUTO_DEC = 0x2 10 }; 11 12 typedef struct hashmap_pair_t hashmap_pair; 13 typedef struct hashmap_node_t hashmap_node; 14 typedef struct hashmap_t hashmap; 15 16 struct hashmap_pair_t { 17 unsigned int keylen, vallen; 18 void *key, *val; 19 }; 20 21 struct hashmap_node_t { 22 hashmap_pair pair; 23 hashmap_node *next; 24 }; 25 26 struct hashmap_t { 27 hashmap_node **buckets; 28 unsigned int buckets_x; 29 unsigned int buckets_x_min; 30 unsigned int buckets_x_max; 31 unsigned int reserved; 32 float min_pressure; 33 float max_pressure; 34 unsigned int flags; 35 allocator alloc; 36 }; 37 38 void hashmap_create(hashmap *hashmap, int n_size); // actual size will be 2^n_size 39 void hashmap_create_with_allocator(hashmap *hashmap, int n_size, allocator alloc); 40 void hashmap_free(hashmap *hashmap); 41 void hashmap_set_opts(hashmap *hm, unsigned int flags, float min_pressure, float max_pressure, int buckets_min, int buckets_max); 42 int hashmap_resize(hashmap *hm, int n_size); 43 float hashmap_get_pressure(hashmap *hm); 44 void hashmap_autoresize(hashmap *hm); 45 unsigned int hashmap_size(const hashmap *hashmap); 46 unsigned int hashmap_reserved(const hashmap *hashmap); 47 void* hashmap_put(hashmap *hm, const void *key, unsigned int keylen, const void *val, unsigned int vallen); 48 void hashmap_sput(hashmap *hashmap, const char *key, void *value, unsigned int value_len); 49 void hashmap_iput(hashmap *hashmap, unsigned int key, void *value, unsigned int value_len); 50 int hashmap_get(hashmap *hm, const void *key, unsigned int keylen, void **val, unsigned int *vallen); 51 int hashmap_sget(hashmap *hashmap, const char *key, void **value, unsigned int *value_len); 52 int hashmap_iget(hashmap *hashmap, unsigned int key, void **value, unsigned int *value_len); 53 int hashmap_del(hashmap *hm, const void *key, unsigned int keylen); 54 void hashmap_sdel(hashmap *hashmap, const char *key); 55 void hashmap_idel(hashmap *hashmap, unsigned int key); 56 void hashmap_iter_begin(const hashmap *hashmap, iterator *iter); 57 int hashmap_delete(hashmap *hashmap, iterator *iter); 58 void hashmap_clear(hashmap *hashmap); 59 60 #endif // _HASHMAP_H 61