diff options
author | Thiago de Arruda <tpadilha84@gmail.com> | 2014-05-19 10:52:04 -0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-05-19 10:52:04 -0300 |
commit | 974eade1a6445222812fc03f60896def74b7dd06 (patch) | |
tree | 1e08bfbe66124ec2e3b2bc54f2034a17f89cb472 | |
parent | eb7513bbd2bd9189502159c4146bb6999b8da32b (diff) | |
download | rneovim-974eade1a6445222812fc03f60896def74b7dd06.tar.gz rneovim-974eade1a6445222812fc03f60896def74b7dd06.tar.bz2 rneovim-974eade1a6445222812fc03f60896def74b7dd06.zip |
Improve map module: Change scopes
- Move `Map` structure definition to `map_defs.h`
- Use `KHASH_DECLARE` on map_defs.h to declare khash function prototypes.
- Redefine `map_foreach` into a macro
- Refactor server.c module to use the new `map_foreach` macro.
-rw-r--r-- | src/nvim/map.c | 29 | ||||
-rw-r--r-- | src/nvim/map.h | 10 | ||||
-rw-r--r-- | src/nvim/map_defs.h | 9 | ||||
-rw-r--r-- | src/nvim/os/server.c | 22 |
4 files changed, 27 insertions, 43 deletions
diff --git a/src/nvim/map.c b/src/nvim/map.c index 332de6d3d3..91a90b4493 100644 --- a/src/nvim/map.c +++ b/src/nvim/map.c @@ -8,15 +8,7 @@ #include "nvim/lib/khash.h" -typedef struct { - void *ptr; -} Value; - -KHASH_MAP_INIT_STR(Map, Value) - -struct map { - khash_t(Map) *table; -}; +__KHASH_IMPL(Map,, kh_cstr_t, void *, 1, kh_str_hash_func, kh_str_hash_equal) Map *map_new() { @@ -40,7 +32,7 @@ void *map_get(Map *map, const char *key) return NULL; } - return kh_val(map->table, k).ptr; + return kh_val(map->table, k); } bool map_has(Map *map, const char *key) @@ -53,15 +45,14 @@ 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; + rv = kh_val(map->table, k); kh_del(Map, map->table, k); } - kh_val(map->table, k) = val; + kh_val(map->table, k) = value; return rv; } @@ -72,20 +63,10 @@ void *map_del(Map *map, const char *key) khiter_t k; if ((k = kh_get(Map, map->table, key)) != kh_end(map->table)) { - rv = kh_val(map->table, k).ptr; + rv = kh_val(map->table, k); 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); - }); -} - diff --git a/src/nvim/map.h b/src/nvim/map.h index 39536a0c10..3e9ab389bd 100644 --- a/src/nvim/map.h +++ b/src/nvim/map.h @@ -47,11 +47,11 @@ void *map_put(Map *map, const char *key, void *value); /// @return The current value if exists or NULL otherwise void *map_del(Map *map, const char *key); -/// Iterates through each key/value pair in the map -/// -/// @param map The `Map` instance -/// @param cb A function that will be called for each key/value -void map_foreach(Map *map, key_value_cb cb); +#define map_foreach(map, key, value, block) \ + kh_foreach(map->table, key, value, block) + +#define map_foreach_value(map, value, block) \ + kh_foreach_value(map->table, value, block) #endif // NVIM_MAP_H diff --git a/src/nvim/map_defs.h b/src/nvim/map_defs.h index d8203aeba6..e1355624dc 100644 --- a/src/nvim/map_defs.h +++ b/src/nvim/map_defs.h @@ -1,7 +1,14 @@ #ifndef NVIM_MAP_DEFS_H #define NVIM_MAP_DEFS_H -typedef struct map Map; +#include "nvim/lib/khash.h" + +KHASH_DECLARE(Map, kh_cstr_t, void *) + +typedef struct { + khash_t(Map) *table; +} Map; + /// Callback for iterating through each key/value pair in a map /// diff --git a/src/nvim/os/server.c b/src/nvim/os/server.c index e9a11809ae..9cf0f53c70 100644 --- a/src/nvim/os/server.c +++ b/src/nvim/os/server.c @@ -45,7 +45,6 @@ typedef struct { static Map *servers = NULL; -static void close_server(Map *map, const char *endpoint, void *server); static void connection_cb(uv_stream_t *server, int status); static void free_client(uv_handle_t *handle); static void free_server(uv_handle_t *handle); @@ -70,7 +69,15 @@ void server_teardown() return; } - map_foreach(servers, close_server); + Server *server; + + map_foreach_value(servers, server, { + if (server->type == kServerTypeTcp) { + uv_close((uv_handle_t *)&server->socket.tcp.handle, free_server); + } else { + uv_close((uv_handle_t *)&server->socket.pipe.handle, free_server); + } + }); } void server_start(char *endpoint, ChannelProtocol prot) @@ -221,17 +228,6 @@ static void connection_cb(uv_stream_t *server, int status) channel_from_stream(client, srv->protocol); } -static void close_server(Map *map, const char *endpoint, void *srv) -{ - Server *server = srv; - - if (server->type == kServerTypeTcp) { - uv_close((uv_handle_t *)&server->socket.tcp.handle, free_server); - } else { - uv_close((uv_handle_t *)&server->socket.pipe.handle, free_server); - } -} - static void free_client(uv_handle_t *handle) { free(handle); |