aboutsummaryrefslogtreecommitdiff
path: root/analyzer/structures/hashmap.h
blob: 528f24a2ea8373a3a4e4c7673938b49a9bffd480 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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);