aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api/private
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2022-06-20 15:04:40 +0200
committerGitHub <noreply@github.com>2022-06-20 15:04:40 +0200
commite3bfc1293e30512a6aa23964a3486ee709ac3f21 (patch)
treec8d1b70ef948a4beafe82195431f1c6607fbe8b7 /src/nvim/api/private
parentb2ed439bd5ab1b431bb61f8754554c48453495c5 (diff)
parent5d6987210578f5f1c3151988b99a9411f9603374 (diff)
downloadrneovim-e3bfc1293e30512a6aa23964a3486ee709ac3f21.tar.gz
rneovim-e3bfc1293e30512a6aa23964a3486ee709ac3f21.tar.bz2
rneovim-e3bfc1293e30512a6aa23964a3486ee709ac3f21.zip
Merge pull request #18988 from bfredl/uipack
refactor(ui): encode "redraw" events without intermediate allocations
Diffstat (limited to 'src/nvim/api/private')
-rw-r--r--src/nvim/api/private/defs.h15
-rw-r--r--src/nvim/api/private/helpers.c26
-rw-r--r--src/nvim/api/private/helpers.h14
3 files changed, 44 insertions, 11 deletions
diff --git a/src/nvim/api/private/defs.h b/src/nvim/api/private/defs.h
index 396fab721d..b1e0dd364c 100644
--- a/src/nvim/api/private/defs.h
+++ b/src/nvim/api/private/defs.h
@@ -6,9 +6,10 @@
#include <string.h>
#include "nvim/func_attr.h"
+#include "nvim/lib/kvec.h"
#include "nvim/types.h"
-#define ARRAY_DICT_INIT { .size = 0, .capacity = 0, .items = NULL }
+#define ARRAY_DICT_INIT KV_INITIAL_VALUE
#define STRING_INIT { .data = NULL, .size = 0 }
#define OBJECT_INIT { .type = kObjectTypeNil }
#define ERROR_INIT { .type = kErrorTypeNone, .msg = NULL }
@@ -84,18 +85,10 @@ REMOTE_TYPE(Window);
REMOTE_TYPE(Tabpage);
typedef struct object Object;
-
-typedef struct {
- Object *items;
- size_t size, capacity;
-} Array;
+typedef kvec_t(Object) Array;
typedef struct key_value_pair KeyValuePair;
-
-typedef struct {
- KeyValuePair *items;
- size_t size, capacity;
-} Dictionary;
+typedef kvec_t(KeyValuePair) Dictionary;
typedef enum {
kObjectTypeNil = 0,
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c
index ff6a4c37e8..693d946088 100644
--- a/src/nvim/api/private/helpers.c
+++ b/src/nvim/api/private/helpers.c
@@ -669,6 +669,32 @@ void api_free_string(String value)
xfree(value.data);
}
+Array arena_array(Arena *arena, size_t max_size)
+{
+ Array arr = ARRAY_DICT_INIT;
+ kv_fixsize_arena(arena, arr, max_size);
+ return arr;
+}
+
+Dictionary arena_dict(Arena *arena, size_t max_size)
+{
+ Dictionary dict = ARRAY_DICT_INIT;
+ kv_fixsize_arena(arena, dict, max_size);
+ return dict;
+}
+
+String arena_string(Arena *arena, String str)
+{
+ if (str.size) {
+ char *mem = arena_alloc(arena, str.size + 1, false);
+ memcpy(mem, str.data, str.size);
+ mem[str.size] = NUL;
+ return cbuf_as_string(mem, str.size);
+ } else {
+ return (String)STRING_INIT;
+ }
+}
+
void api_free_object(Object value)
{
switch (value.type) {
diff --git a/src/nvim/api/private/helpers.h b/src/nvim/api/private/helpers.h
index 8423db4970..a4348d8b44 100644
--- a/src/nvim/api/private/helpers.h
+++ b/src/nvim/api/private/helpers.h
@@ -63,17 +63,31 @@
#define PUT(dict, k, v) \
kv_push(dict, ((KeyValuePair) { .key = cstr_to_string(k), .value = v }))
+#define PUT_C(dict, k, v) \
+ kv_push_c(dict, ((KeyValuePair) { .key = cstr_as_string(k), .value = v }))
+
#define PUT_BOOL(dict, name, condition) PUT(dict, name, BOOLEAN_OBJ(condition));
#define ADD(array, item) \
kv_push(array, item)
+#define ADD_C(array, item) \
+ kv_push_c(array, item)
+
#define FIXED_TEMP_ARRAY(name, fixsize) \
Array name = ARRAY_DICT_INIT; \
Object name##__items[fixsize]; \
name.size = fixsize; \
name.items = name##__items; \
+#define MAXSIZE_TEMP_ARRAY(name, maxsize) \
+ Array name = ARRAY_DICT_INIT; \
+ Object name##__items[maxsize]; \
+ name.capacity = maxsize; \
+ name.items = name##__items; \
+
+#define cbuf_as_string(d, s) ((String) { .data = d, .size = s })
+
#define STATIC_CSTR_AS_STRING(s) ((String) { .data = s, .size = sizeof(s) - 1 })
/// Create a new String instance, putting data in allocated memory