aboutsummaryrefslogtreecommitdiff
path: root/advent-of-code/2023/lib/map.c
blob: 846033ea07817aa994aaeb76dad464a84627b9f6 (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
82
83
84
85
86
87
88
89
90
#include "map.h"
#include "rb_tree.h"

#include <string.h>

typedef int (*rb_cmp_t)(void*, void*);

void* new_map(cmp_t compare) {
    rb_tree_t *tree = malloc(sizeof(rb_tree_t));
    rb_cmp_t cmp = (rb_cmp_t)compare;
    *tree = (rb_tree_t){NULL, cmp, NULL};
    return tree;
}

void map_set(void* self, void* key, void* value) {
    node_entry_t *iter = rb_tree_find(self, &key);
    if (iter == NULL) {
        iter = malloc(sizeof(*iter));
        iter->key = key;
        iter->value = value;
        rb_tree_insert(self, iter);
    } else {
        iter->value = value;
    }
}

void* map_get(void* self, void* key) {
    node_entry_t *iter = rb_tree_find(self, &key);
    if (iter == NULL) return NULL;
    return iter->value;
}

void map_erase(void* self, void* key) {
    rb_tree_remove(self, key);
}

void* map_begin(void *self) {
    return rb_tree_min(self);
}

void* map_next(void *self, void *iter) {
    return rb_tree_next(self, iter);
}

void* map_iter_key(void* iter_) {
    node_entry_t *iter = iter_;
    return iter->key;
}

void* map_iter_value(void* iter_) {
    node_entry_t *iter = iter_;
    return iter->value;
}

static int dict_cmp(void **a, void** b) {
    return strcmp(*a, *b);
}
void* new_dict() {
    return new_map(dict_cmp);
}

void dict_set(void* self, const char *key, void* value) {
    map_set(self, (void*)key, value);
}

void* dict_get(void* self, const char* key) {
    return map_get(self, (void*)key);
}

void dict_erase(void* self, const char* key) {
    map_erase(self, (void*)key);
}

void* dict_begin(void *self) {
    return map_begin(self);
}

void* dict_next(void *self, void *iter) {
    return map_next(self, iter);
}

const char* dict_iter_key(void* iter) {
    return map_iter_key(iter);
}

void* dict_iter_value(void* iter) {
    return map_iter_value(iter);
}