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