mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
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.
This commit is contained in:
parent
eb7513bbd2
commit
974eade1a6
@ -8,15 +8,7 @@
|
|||||||
|
|
||||||
#include "nvim/lib/khash.h"
|
#include "nvim/lib/khash.h"
|
||||||
|
|
||||||
typedef struct {
|
__KHASH_IMPL(Map,, kh_cstr_t, void *, 1, kh_str_hash_func, kh_str_hash_equal)
|
||||||
void *ptr;
|
|
||||||
} Value;
|
|
||||||
|
|
||||||
KHASH_MAP_INIT_STR(Map, Value)
|
|
||||||
|
|
||||||
struct map {
|
|
||||||
khash_t(Map) *table;
|
|
||||||
};
|
|
||||||
|
|
||||||
Map *map_new()
|
Map *map_new()
|
||||||
{
|
{
|
||||||
@ -40,7 +32,7 @@ void *map_get(Map *map, const char *key)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return kh_val(map->table, k).ptr;
|
return kh_val(map->table, k);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool map_has(Map *map, const char *key)
|
bool map_has(Map *map, const char *key)
|
||||||
@ -53,15 +45,14 @@ void *map_put(Map *map, const char *key, void *value)
|
|||||||
int ret;
|
int ret;
|
||||||
void *rv = NULL;
|
void *rv = NULL;
|
||||||
khiter_t k = kh_put(Map, map->table, key, &ret);
|
khiter_t k = kh_put(Map, map->table, key, &ret);
|
||||||
Value val = {.ptr = value};
|
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
// key present, return the current value
|
// 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_del(Map, map->table, k);
|
||||||
}
|
}
|
||||||
|
|
||||||
kh_val(map->table, k) = val;
|
kh_val(map->table, k) = value;
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
@ -72,20 +63,10 @@ void *map_del(Map *map, const char *key)
|
|||||||
khiter_t k;
|
khiter_t k;
|
||||||
|
|
||||||
if ((k = kh_get(Map, map->table, key)) != kh_end(map->table)) {
|
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);
|
kh_del(Map, map->table, k);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
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);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -47,11 +47,11 @@ void *map_put(Map *map, const char *key, void *value);
|
|||||||
/// @return The current value if exists or NULL otherwise
|
/// @return The current value if exists or NULL otherwise
|
||||||
void *map_del(Map *map, const char *key);
|
void *map_del(Map *map, const char *key);
|
||||||
|
|
||||||
/// Iterates through each key/value pair in the map
|
#define map_foreach(map, key, value, block) \
|
||||||
///
|
kh_foreach(map->table, key, value, block)
|
||||||
/// @param map The `Map` instance
|
|
||||||
/// @param cb A function that will be called for each key/value
|
#define map_foreach_value(map, value, block) \
|
||||||
void map_foreach(Map *map, key_value_cb cb);
|
kh_foreach_value(map->table, value, block)
|
||||||
|
|
||||||
#endif // NVIM_MAP_H
|
#endif // NVIM_MAP_H
|
||||||
|
|
||||||
|
@ -1,7 +1,14 @@
|
|||||||
#ifndef NVIM_MAP_DEFS_H
|
#ifndef NVIM_MAP_DEFS_H
|
||||||
#define 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
|
/// Callback for iterating through each key/value pair in a map
|
||||||
///
|
///
|
||||||
|
@ -45,7 +45,6 @@ typedef struct {
|
|||||||
|
|
||||||
static Map *servers = NULL;
|
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 connection_cb(uv_stream_t *server, int status);
|
||||||
static void free_client(uv_handle_t *handle);
|
static void free_client(uv_handle_t *handle);
|
||||||
static void free_server(uv_handle_t *handle);
|
static void free_server(uv_handle_t *handle);
|
||||||
@ -70,7 +69,15 @@ void server_teardown()
|
|||||||
return;
|
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)
|
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);
|
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)
|
static void free_client(uv_handle_t *handle)
|
||||||
{
|
{
|
||||||
free(handle);
|
free(handle);
|
||||||
|
Loading…
Reference in New Issue
Block a user