aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-05-19 10:52:04 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-05-19 10:52:04 -0300
commit974eade1a6445222812fc03f60896def74b7dd06 (patch)
tree1e08bfbe66124ec2e3b2bc54f2034a17f89cb472
parenteb7513bbd2bd9189502159c4146bb6999b8da32b (diff)
downloadrneovim-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.c29
-rw-r--r--src/nvim/map.h10
-rw-r--r--src/nvim/map_defs.h9
-rw-r--r--src/nvim/os/server.c22
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);