techkaczynski.dev / code

summaryrefslogtreecommitdiff
path: root/ext/hashmap.h
diff options
context:
space:
mode:
authortech kaczynski <tk@techkaczynski.dev>2026-09-22 22:38:57 +1000
committertech kaczynski <tk@techkaczynski.dev>2026-09-22 22:38:57 +1000
commit08cb8d6a585dd552b69a488d9db1be123f01467a (patch)
tree77d50ce30bbc102b08486929ba654b5bef70af43 /ext/hashmap.h
initial commit.
Diffstat (limited to 'ext/hashmap.h')
-rw-r--r--ext/hashmap.h77
1 files changed, 77 insertions, 0 deletions
diff --git a/ext/hashmap.h b/ext/hashmap.h
new file mode 100644
index 0000000..615fb90
--- /dev/null
+++ b/ext/hashmap.h
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2014 rxi
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MIT license. See LICENSE for details.
+ */
+
+#ifndef HASHMAP_H
+#define HASHMAP_H
+
+#include <string.h>
+
+#define MAP_VERSION "0.1.0"
+
+struct map_node_t;
+typedef struct map_node_t map_node_t;
+
+typedef struct {
+ map_node_t **buckets;
+ unsigned nbuckets, nnodes;
+} map_base_t;
+
+typedef struct {
+ unsigned bucketidx;
+ map_node_t *node;
+} map_iter_t;
+
+
+#define map_t(T)\
+ struct { map_base_t base; T *ref; T tmp; }
+
+
+#define map_init(m)\
+ memset(m, 0, sizeof(*(m)))
+
+
+#define map_deinit(m)\
+ map_deinit_(&(m)->base)
+
+
+#define map_get(m, key)\
+ ( (m)->ref = map_get_(&(m)->base, key) )
+
+
+#define map_set(m, key, value)\
+ ( (m)->tmp = (value),\
+ map_set_(&(m)->base, key, &(m)->tmp, sizeof((m)->tmp)) )
+
+
+#define map_remove(m, key)\
+ map_remove_(&(m)->base, key)
+
+
+#define map_iter(m)\
+ map_iter_()
+
+
+#define map_next(m, iter)\
+ map_next_(&(m)->base, iter)
+
+
+void map_deinit_(map_base_t *m);
+void *map_get_(map_base_t *m, const char *key);
+int map_set_(map_base_t *m, const char *key, void *value, int vsize);
+void map_remove_(map_base_t *m, const char *key);
+map_iter_t map_iter_(void);
+const char *map_next_(map_base_t *m, map_iter_t *iter);
+
+
+typedef map_t(void*) map_void_t;
+typedef map_t(char*) map_str_t;
+typedef map_t(int) map_int_t;
+typedef map_t(char) map_char_t;
+typedef map_t(float) map_float_t;
+typedef map_t(double) map_double_t;
+
+#endif