aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/hashmap.h38
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 */