aboutsummaryrefslogtreecommitdiff
path: root/include/std/hash_map.h
blob: b430d22acd12acadb648e7f0fc0f0253e58cbb1b (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
#ifndef TSL_HASH_MAP_H
#define TSL_HASH_MAP_H

#include "string_view.h"
#include <stdint.h>

typedef uint64_t (*TslHashFunc)(const void *data, size_t size);

/* TODO: Optimize small hash map by using the members of the struct instead of allocating on heap */
typedef struct {
    void *buckets_data; /* value=TslHashMapNode<void*>, data=|hash(uint64_t) + key_size(size_t) + key_data(...) data_size(size_t) + data_data(...)| */
    size_t buckets_size;
    size_t buckets_capacity;
} TslHashMap;

void tsl_hash_map_init(TslHashMap *self);
void tsl_hash_map_deinit(TslHashMap *self);

int tsl_hash_map_insert(TslHashMap *self, const TslStringView *key, const void *data, size_t size, TslHashFunc hash_func);
/* Get a reference to the value by key @key, or NULL if it doesn't exist */
void* tsl_hash_map_get(TslHashMap *self, const TslStringView *key, TslHashFunc hash_func);
/* Get a reference to the value by key @key, or insert a new value for the key with a size of @size */
int tsl_hash_map_get_or_create(TslHashMap *self, const TslStringView *key, size_t size, TslHashFunc hash_func, void **output);

#endif /* TSL_HASH_MAP_H */