diff options
Diffstat (limited to 'src/nvim/map.h')
-rw-r--r-- | src/nvim/map.h | 104 |
1 files changed, 69 insertions, 35 deletions
diff --git a/src/nvim/map.h b/src/nvim/map.h index 92f0b32255..cc32a20740 100644 --- a/src/nvim/map.h +++ b/src/nvim/map.h @@ -7,39 +7,71 @@ #include "klib/khash.h" #include "nvim/api/private/defs.h" -#include "nvim/extmark_defs.h" -#include "nvim/gettext.h" +#include "nvim/assert.h" #include "nvim/highlight_defs.h" -#include "nvim/map_defs.h" -#include "nvim/tui/input_defs.h" #include "nvim/types.h" -#include "nvim/ui_client.h" #if defined(__NetBSD__) # undef uint64_t # define uint64_t uint64_t #endif +typedef const char *cstr_t; +typedef void *ptr_t; + +#define Map(T, U) Map_##T##_##U +#define PMap(T) Map(T, ptr_t) + +#define KEY_DECLS(T) \ + KHASH_DECLARE(T) \ + static inline bool set_put_##T(Set(T) *set, T key, T **key_alloc) { \ + int kh_ret; \ + khiter_t k = kh_put(T, set, key, &kh_ret, 0); \ + if (key_alloc) { \ + *key_alloc = &kh_key(set, k); \ + } \ + return kh_ret; \ + } \ + static inline void set_del_##T(Set(T) *set, T key) \ + { \ + khiter_t k; \ + if ((k = kh_get(T, set, key)) != kh_end(set)) { \ + kh_del(T, set, k); \ + } \ + } \ + static inline bool set_has_##T(Set(T) *set, T key) { \ + return (kh_get(T, set, key) != kh_end(set)); \ + } \ + #define MAP_DECLS(T, U) \ - KHASH_DECLARE(T##_##U##_map, T, U) \ typedef struct { \ - khash_t(T##_##U##_map) table; \ + khash_t(T) table; \ } Map(T, U); \ - Map(T, U) *map_##T##_##U##_new(void); \ - void map_##T##_##U##_free(Map(T, U) *map); \ - void map_##T##_##U##_destroy(Map(T, U) *map); \ U map_##T##_##U##_get(Map(T, U) *map, T key); \ - bool map_##T##_##U##_has(Map(T, U) *map, T key); \ - T map_##T##_##U##_key(Map(T, U) *map, T key); \ + static inline bool map_##T##_##U##_has(Map(T, U) *map, T key) \ + { \ + return kh_get(T, &map->table, key) != kh_end(&map->table); \ + } \ U map_##T##_##U##_put(Map(T, U) *map, T key, U value); \ - U *map_##T##_##U##_ref(Map(T, U) *map, T key, bool put); \ - U map_##T##_##U##_del(Map(T, U) *map, T key); \ - void map_##T##_##U##_clear(Map(T, U) *map); + U *map_##T##_##U##_ref(Map(T, U) *map, T key, T **key_alloc); \ + U *map_##T##_##U##_put_ref(Map(T, U) *map, T key, T **key_alloc, bool *new_item); \ + U map_##T##_##U##_del(Map(T, U) *map, T key, T *key_alloc); \ -// // NOTE: Keys AND values must be allocated! khash.h does not make a copy. -// + +#define Set(type) khash_t(type) + +KEY_DECLS(int) +KEY_DECLS(cstr_t) +KEY_DECLS(ptr_t) +KEY_DECLS(uint64_t) +KEY_DECLS(uint32_t) +KEY_DECLS(String) +KEY_DECLS(HlEntry) +KEY_DECLS(ColorKey) + MAP_DECLS(int, int) +MAP_DECLS(int, ptr_t) MAP_DECLS(int, cstr_t) MAP_DECLS(cstr_t, ptr_t) MAP_DECLS(cstr_t, int) @@ -49,48 +81,50 @@ MAP_DECLS(uint64_t, ptr_t) MAP_DECLS(uint64_t, ssize_t) MAP_DECLS(uint64_t, uint64_t) MAP_DECLS(uint32_t, uint32_t) - -MAP_DECLS(handle_T, ptr_t) MAP_DECLS(HlEntry, int) MAP_DECLS(String, handle_T) MAP_DECLS(String, int) MAP_DECLS(int, String) - MAP_DECLS(ColorKey, ColorItem) -MAP_DECLS(KittyKey, cstr_t) - -#define MAP_INIT { { 0, 0, 0, 0, NULL, NULL, NULL } } -#define map_init(k, v, map) do { *(map) = (Map(k, v)) MAP_INIT; } while (false) +#define SET_INIT { 0, 0, 0, 0, NULL, NULL, NULL } +#define MAP_INIT { SET_INIT } -#define map_destroy(T, U) map_##T##_##U##_destroy #define map_get(T, U) map_##T##_##U##_get #define map_has(T, U) map_##T##_##U##_has -#define map_key(T, U) map_##T##_##U##_key #define map_put(T, U) map_##T##_##U##_put #define map_ref(T, U) map_##T##_##U##_ref +#define map_put_ref(T, U) map_##T##_##U##_put_ref #define map_del(T, U) map_##T##_##U##_del -#define map_clear(T, U) map_##T##_##U##_clear +#define map_destroy(T, map) kh_dealloc(T, &(map)->table) +#define map_clear(T, map) kh_clear(T, &(map)->table) #define map_size(map) ((map)->table.size) -#define pmap_destroy(T) map_destroy(T, ptr_t) #define pmap_get(T) map_get(T, ptr_t) #define pmap_has(T) map_has(T, ptr_t) -#define pmap_key(T) map_key(T, ptr_t) #define pmap_put(T) map_put(T, ptr_t) #define pmap_ref(T) map_ref(T, ptr_t) +#define pmap_put_ref(T) map_put_ref(T, ptr_t) /// @see pmap_del2 #define pmap_del(T) map_del(T, ptr_t) -#define pmap_clear(T) map_clear(T, ptr_t) -#define pmap_init(k, map) map_init(k, ptr_t, map) -#define map_foreach(map, key, value, block) \ - kh_foreach(&(map)->table, key, value, block) +#define map_foreach(U, map, key, value, block) kh_foreach(U, &(map)->table, key, value, block) -#define map_foreach_value(map, value, block) \ - kh_foreach_value(&(map)->table, value, block) +#define map_foreach_value(U, map, value, block) kh_foreach_value(U, &(map)->table, value, block) +#define map_foreach_key(map, key, block) kh_foreach_key(&(map)->table, key, block) +#define set_foreach(set, key, block) kh_foreach_key(set, key, block) + +#define pmap_foreach_value(map, value, block) map_foreach_value(ptr_t, map, value, block) +#define pmap_foreach(map, key, value, block) map_foreach(ptr_t, map, key, value, block) void pmap_del2(PMap(cstr_t) *map, const char *key); +#define set_has(T, set, key) set_has_##T(set, key) +#define set_put(T, set, key) set_put_##T(set, key, NULL) +#define set_put_ref(T, set, key, key_alloc) set_put_##T(set, key, key_alloc) +#define set_del(T, set, key) set_del_##T(set, key) +#define set_destroy(T, set) kh_dealloc(T, set) +#define set_clear(T, set) kh_clear(T, set) + #endif // NVIM_MAP_H |