aboutsummaryrefslogtreecommitdiff
path: root/analyzer/structures/hashmap.h
diff options
context:
space:
mode:
authorMosder <xmosder12@gmail.com>2026-07-14 11:08:32 +0200
committerMosder <xmosder12@gmail.com>2026-07-14 11:08:32 +0200
commit106e1f7a579a66c46cb68356f585917fe7883310 (patch)
tree1688e24eaa60f852a9a44d69690ed66569c06af8 /analyzer/structures/hashmap.h
parentdf568228d1a125f909cb25790255c0719f8ec7b1 (diff)
refactor: generalized Makefile by adding CC and CFLAGS variables. Changed from realtive to absolute paths for includes
Diffstat (limited to 'analyzer/structures/hashmap.h')
-rw-r--r--analyzer/structures/hashmap.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/analyzer/structures/hashmap.h b/analyzer/structures/hashmap.h
new file mode 100644
index 0000000..528f24a
--- /dev/null
+++ b/analyzer/structures/hashmap.h
@@ -0,0 +1,81 @@
+// structures/hashmap.h
+// a simple implementation of hashmap using linked list
+
+#include <stddef.h>
+
+#define HASHMAP_TABLE_SIZE 128
+
+typedef struct HashMapNode {
+ void *key;
+ void *value;
+ struct HashMapNode *next;
+} HashMapNode;
+
+typedef struct {
+ HashMapNode *table[HASHMAP_TABLE_SIZE];
+ size_t key_size;
+ size_t value_size;
+ size_t (*hash)(void *key);
+ int (*compare)(void *key1, void *key2);
+ void (*key_cleanup)(void *key);
+ void (*value_cleanup)(void *value);
+} HashMap;
+
+// create a new hash map
+// params:
+// - key_size - size of the key type
+// - value_size - size of the value type
+// - hash - function for hashing keys
+// params:
+// - key - pointer to the key to hash
+// returns:
+// hash of the key (size_t in [0; HASHMAP_TABLE_SIZE))
+// - compare - function for comparing keys
+// params:
+// - key1 - pointer to the first of the keys to compare
+// - key2 - pointer to the second of the keys to compare
+// returns:
+// truthy if the keys are identical, falsy if they are different
+// - key_cleanup - function for cleaning up any internal allocations inside node->key (not the key itself)
+// if it has no heap allocations, this should be NULL
+// params:
+// - key - pointer to the key to cleanup
+// - value_cleanup - function for cleaning up any internal allocations inside node->value (not the value itself)
+// if it has no heap allocations, this should be NULL
+// params:
+// - value - pointer to the value to cleanup
+// returns:
+// pointer to the new hash map
+extern HashMap *hashmap_new(
+ size_t key_size,
+ size_t value_size,
+ size_t (*hash)(void *key),
+ int (*compare)(void *key1, void *key2),
+ void (*key_cleanup)(void *key),
+ void (*value_cleanup)(void *value)
+);
+
+// create/update an entry in a hash map
+// params:
+// - map - hash map to insert to
+// - key - pointer to the key
+// - value - pointer to the value
+extern void hashmap_put(HashMap *map, void *key, void *value);
+
+// get the value of given key from a hash map
+// params:
+// - map - hash map to get from
+// - key - pointer to the key of the value to get
+// returns:
+// pointer to the value of specified key or NULL if it doesn't exist
+extern void *hashmap_get(HashMap *map, void *key);
+
+// delete an entry from a hash map
+// params:
+// - map - hash map to delete from
+// - key - pointer to the key of the entry to delete
+extern void hashmap_delete(HashMap *map, void *key);
+
+// free the hash map
+// - map - hash map to free
+extern void hashmap_free(HashMap *map);