aboutsummaryrefslogtreecommitdiff
path: root/analyzer/structures/hashmap.h
diff options
context:
space:
mode:
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);