diff options
author | dec05eba <dec05eba@protonmail.com> | 2021-12-16 09:56:16 +0100 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2021-12-16 10:50:59 +0100 |
commit | 6bb40bf0c5cd8ee8fb87640fd04b2c595f84c1d3 (patch) | |
tree | 99b4afcf68c450380acb3cb47b357e7caab960a6 /include | |
parent | 0417619b36dc7f4b004caa64a65570f1344d1c8d (diff) |
Add hashmap
Diffstat (limited to 'include')
-rw-r--r-- | include/hashmap.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/include/hashmap.h b/include/hashmap.h new file mode 100644 index 0000000..0928081 --- /dev/null +++ b/include/hashmap.h @@ -0,0 +1,38 @@ +#ifndef MGUI_HASHMAP_H +#define MGUI_HASHMAP_H + +#include <stdint.h> +#include <stddef.h> +#include <stdbool.h> + +typedef struct mgui_hashmap_entry mgui_hashmap_entry; + +struct mgui_hashmap_entry { + mgui_hashmap_entry *next; + uint64_t hash; + void *value; + size_t key_size; + /* char key[...]; Dynamically size string of size |key_size|. Allocated directly in the struct (sizeof(mgui_hashmap_entry) + key_size) */ +}; + +typedef struct { + mgui_hashmap_entry **entries; + size_t capacity; + size_t size; +} mgui_hashmap; + +void mgui_hashmap_init(mgui_hashmap *self); +void mgui_hashmap_deinit(mgui_hashmap *self); + +/* + Note: stores the |value| itself, and does not copy the content of |value|. + Note: inserting the same value multiple times in the hash map is undefined behavior. + Note: |hash| can be NULL. +*/ +void mgui_hashmap_insert(mgui_hashmap *self, const char *key, size_t key_size, void *value, uint64_t *hash_out); +bool mgui_hashmap_get(mgui_hashmap *self, const char *key, size_t key_size, void **value_out); +/* Note: |hash| has to be the hash for |key|, which you can get by using calling |mgui_hashmap_hash| with |key| or as a result of |mgui_hashmap_insert| */ +bool mgui_hashmap_get_by_hash(mgui_hashmap *self, const char *key, size_t key_size, uint64_t hash, void **value_out); +uint64_t mgui_hashmap_hash(const char *key, size_t key_size); + +#endif /* MGUI_HASHMAP_H */ |