diff options
Diffstat (limited to 'src/nvim/map.c')
-rw-r--r-- | src/nvim/map.c | 154 |
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) |