aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/map.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/map.c')
-rw-r--r--src/nvim/map.c154
1 files changed, 75 insertions, 79 deletions
diff --git a/src/nvim/map.c b/src/nvim/map.c
index 40868e5b92..28fd0af61c 100644
--- a/src/nvim/map.c
+++ b/src/nvim/map.c
@@ -8,84 +8,80 @@
#include "nvim/lib/khash.h"
-typedef struct {
- void *ptr;
-} Value;
-
-KHASH_MAP_INIT_STR(Map, Value)
-
-struct map {
- khash_t(Map) *table;
-};
-
-Map *map_new()
-{
- Map *rv = xmalloc(sizeof(Map));
- rv->table = kh_init(Map);
- return rv;
-}
-
-void map_free(Map *map)
-{
- kh_clear(Map, map->table);
- kh_destroy(Map, map->table);
- free(map);
-}
-
-void *map_get(Map *map, const char *key)
-{
- khiter_t k;
-
- if ((k = kh_get(Map, map->table, key)) == kh_end(map->table)) {
- return NULL;
+#define cstr_t_hash kh_str_hash_func
+#define cstr_t_eq kh_str_hash_equal
+#define uint64_t_hash kh_int64_hash_func
+#define uint64_t_eq kh_int64_hash_equal
+#define uint32_t_hash kh_int_hash_func
+#define uint32_t_eq kh_int_hash_equal
+
+#if defined(ARCH_64)
+#define ptr_t_hash(key) uint64_t_hash((uint64_t)key)
+#define ptr_t_eq(a, b) uint64_t_eq((uint64_t)a, (uint64_t)b)
+#elif defined(ARCH_32)
+#define ptr_t_hash(key) uint32_t_hash((uint32_t)key)
+#define ptr_t_eq(a, b) uint32_t_eq((uint32_t)a, (uint32_t)b)
+#endif
+
+
+#define MAP_IMPL(T) \
+ __KHASH_IMPL(T##_map,, T, void *, 1, T##_hash, T##_eq) \
+ \
+ Map(T) *map_##T##_new() \
+ { \
+ Map(T) *rv = xmalloc(sizeof(Map(T))); \
+ rv->table = kh_init(T##_map); \
+ return rv; \
+ } \
+ \
+ void map_##T##_free(Map(T) *map) \
+ { \
+ kh_destroy(T##_map, map->table); \
+ free(map); \
+ } \
+ \
+ void *map_##T##_get(Map(T) *map, T key) \
+ { \
+ khiter_t k; \
+ \
+ if ((k = kh_get(T##_map, map->table, key)) == kh_end(map->table)) { \
+ return NULL; \
+ } \
+ \
+ return kh_val(map->table, k); \
+ } \
+ \
+ bool map_##T##_has(Map(T) *map, T key) \
+ { \
+ return kh_get(T##_map, map->table, key) != kh_end(map->table); \
+ } \
+ \
+ void *map_##T##_put(Map(T) *map, T key, void *value) \
+ { \
+ int ret; \
+ void *rv = NULL; \
+ khiter_t k = kh_put(T##_map, map->table, key, &ret); \
+ \
+ if (!ret) { \
+ rv = kh_val(map->table, k); \
+ } \
+ \
+ kh_val(map->table, k) = value; \
+ return rv; \
+ } \
+ \
+ void *map_##T##_del(Map(T) *map, T key) \
+ { \
+ void *rv = NULL; \
+ khiter_t k; \
+ \
+ if ((k = kh_get(T##_map, map->table, key)) != kh_end(map->table)) { \
+ rv = kh_val(map->table, k); \
+ kh_del(T##_map, map->table, k); \
+ } \
+ \
+ return rv; \
}
- return kh_val(map->table, k).ptr;
-}
-
-bool map_has(Map *map, const char *key)
-{
- return map_get(map, key) != NULL;
-}
-
-void *map_put(Map *map, const char *key, void *value)
-{
- int ret;
- void *rv = NULL;
- khiter_t k = kh_put(Map, map->table, key, &ret);
- Value val = {.ptr = value};
-
- if (!ret) {
- // key present, return the current value
- rv = kh_val(map->table, k).ptr;
- kh_del(Map, map->table, k);
- }
-
- kh_val(map->table, k) = val;
-
- return rv;
-}
-
-void *map_del(Map *map, const char *key)
-{
- void *rv = NULL;
- khiter_t k;
-
- if ((k = kh_get(Map, map->table, key)) != kh_end(map->table)) {
- rv = kh_val(map->table, k).ptr;
- kh_del(Map, map->table, k);
- }
-
- return rv;
-}
-
-void map_foreach(Map *map, key_value_cb cb)
-{
- const char *key;
- Value value;
-
- kh_foreach(map->table, key, value, {
- cb(map, (const char *)key, value.ptr);
- });
-}
-
+MAP_IMPL(cstr_t)
+MAP_IMPL(ptr_t)