diff options
| author | Mistivia <i@mistivia.com> | 2024-01-27 14:02:35 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-01-27 14:02:35 +0800 |
| commit | 6580dcd9127f69aaa794472ec92bc46015dc4019 (patch) | |
| tree | dc2c7e102c75180f7bd98c2f3a14f8b55f83c0f2 /advent-of-code/2023/lib/map.c | |
init
Diffstat (limited to 'advent-of-code/2023/lib/map.c')
| -rw-r--r-- | advent-of-code/2023/lib/map.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/advent-of-code/2023/lib/map.c b/advent-of-code/2023/lib/map.c new file mode 100644 index 0000000..846033e --- /dev/null +++ b/advent-of-code/2023/lib/map.c @@ -0,0 +1,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); +} + + |
