diff options
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 */ |