Macros
kvec.h File Reference
#include <stdlib.h>
#include <string.h>
#include "nvim/memory.h"
#include "nvim/os/os_defs.h"

Go to the source code of this file.

Macros

#define kv_roundup32(x)
 
#define KV_INITIAL_VALUE   { .size = 0, .capacity = 0, .items = NULL }
 
#define kvec_t(type)
 
#define kv_init(v)   ((v).size = (v).capacity = 0, (v).items = 0)
 
#define kv_destroy(v)   xfree((v).items)
 
#define kv_A(v, i)   ((v).items[(i)])
 
#define kv_pop(v)   ((v).items[--(v).size])
 
#define kv_size(v)   ((v).size)
 
#define kv_max(v)   ((v).capacity)
 
#define kv_Z(v, i)   kv_A(v, kv_size(v) - (i) - 1)
 
#define kv_last(v)   kv_Z(v, 0)
 
#define kv_drop(v, n)   ((v).size -= (n))
 
#define kv_resize(v, s)
 
#define kv_resize_full(v)   kv_resize(v, (v).capacity ? (v).capacity << 1 : 8)
 
#define kv_copy(v1, v0)
 
#define kv_pushp(v)
 
#define kv_push(v, x)   (*kv_pushp(v) = (x))
 
#define kv_a(v, i)
 
#define kvec_withinit_t(type, INIT_SIZE)
 
#define kvi_init(v)
 
#define kvi_resize(v, s)
 
#define kvi_resize_full(v)
 
#define kvi_pushp(v)
 
#define kvi_push(v, x)   (*kvi_pushp(v) = (x))
 
#define kvi_destroy(v)
 

Macro Definition Documentation

#define kv_A (   v,
  i 
)    ((v).items[(i)])
#define kv_a (   v,
  i 
)
Value:
(*(((v).capacity <= (size_t) (i) \
? ((v).capacity = (v).size = (i) + 1, \
kv_roundup32((v).capacity), \
kv_resize((v), (v).capacity), 0UL) \
: ((v).size <= (size_t) (i) \
? (v).size = (i) + 1 \
: 0UL)), \
&(v).items[(i)]))
#define kv_resize(v, s)
Definition: kvec.h:77
#define kv_roundup32(x)
Definition: kvec.h:46
v
Definition: eval.c:2082
int i
Definition: typval.c:868
#define kv_copy (   v1,
  v0 
)
Value:
do { \
if ((v1).capacity < (v0).size) { \
kv_resize(v1, (v0).size); \
} \
(v1).size = (v0).size; \
memcpy((v1).items, (v0).items, sizeof((v1).items[0]) * (v0).size); \
} while (0) \
if(len)
Definition: encode.c:222
#define kv_resize(v, s)
Definition: kvec.h:77
#define kv_destroy (   v)    xfree((v).items)
#define kv_drop (   v,
  n 
)    ((v).size -= (n))

Drop last n items from kvec without resizing

Previously spelled as (void)kv_pop(v), repeated n times.

Parameters
[out]vKvec to drop items from.
[in]nNumber of elements to drop.
#define kv_init (   v)    ((v).size = (v).capacity = 0, (v).items = 0)
#define KV_INITIAL_VALUE   { .size = 0, .capacity = 0, .items = NULL }
#define kv_last (   v)    kv_Z(v, 0)
#define kv_max (   v)    ((v).capacity)
#define kv_pop (   v)    ((v).items[--(v).size])
#define kv_push (   v,
 
)    (*kv_pushp(v) = (x))
#define kv_pushp (   v)
Value:
((((v).size == (v).capacity) ? (kv_resize_full(v), 0) : 0), \
((v).items + ((v).size++)))
#define kv_resize_full(v)
Definition: kvec.h:81
v
Definition: eval.c:2082
#define kv_resize (   v,
  s 
)
Value:
((v).capacity = (s), \
(v).items = xrealloc((v).items, sizeof((v).items[0]) * (v).capacity))
void * xrealloc(void *ptr, size_t size) FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_ALLOC_SIZE(2) FUNC_ATTR_NONNULL_RET
Definition: memory.c:147
char * s
Definition: message.c:732
v
Definition: eval.c:2082
#define kv_resize_full (   v)    kv_resize(v, (v).capacity ? (v).capacity << 1 : 8)
#define kv_roundup32 (   x)
Value:
((--(x)), \
((x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16), \
(++(x)))
#define kv_size (   v)    ((v).size)
#define kv_Z (   v,
  i 
)    kv_A(v, kv_size(v) - (i) - 1)
#define kvec_t (   type)
Value:
struct { \
size_t size; \
size_t capacity; \
type *items; \
}
err type
Definition: helpers.c:1190
#define kvec_withinit_t (   type,
  INIT_SIZE 
)
Value:
struct { \
size_t size; \
size_t capacity; \
type *items; \
type init_array[INIT_SIZE]; \
}
err type
Definition: helpers.c:1190

Type of a vector with a few first members allocated on stack

Is compatible with kv_A, kv_pop, kv_size, kv_max, kv_last. Is not compatible with kv_resize, kv_resize_full, kv_copy, kv_push, kv_pushp, kv_a, kv_destroy.

Parameters
[in]typeType of vector elements.
[in]init_sizeNumber of the elements in the initial array.
#define kvi_destroy (   v)
Value:
do { \
if ((v).items != (v).init_array) { \
xfree((v).items); \
} \
} while (0)
if(len)
Definition: encode.c:222
v
Definition: eval.c:2082
xfree(sourcing_name)

Free array of elements of a vector with preallocated array if needed

Parameters
[out]vVector to free.
#define kvi_init (   v)
Value:
((v).capacity = ARRAY_SIZE((v).init_array), \
(v).size = 0, \
(v).items = (v).init_array)
v
Definition: eval.c:2082
#define ARRAY_SIZE(arr)
Definition: macros.h:140

Initialize vector with preallocated array

Parameters
[out]vVector to initialize.
#define kvi_push (   v,
 
)    (*kvi_pushp(v) = (x))

Push value to a vector with preallocated array

Parameters
[out]vVector to push to.
[in]xValue to push.
#define kvi_pushp (   v)
Value:
((((v).size == (v).capacity) ? (kvi_resize_full(v), 0) : 0), \
((v).items + ((v).size++)))
#define kvi_resize_full(v)
Definition: kvec.h:173
v
Definition: eval.c:2082

Get location where to store new element to a vector with preallocated array

Parameters
[in,out]vVector to push to.
Returns
Pointer to the place where new value should be stored.
#define kvi_resize (   v,
  s 
)
Value:
((v).capacity = ((s) > ARRAY_SIZE((v).init_array) \
? (s) \
: ARRAY_SIZE((v).init_array)), \
(v).items = ((v).capacity == ARRAY_SIZE((v).init_array) \
? ((v).items == (v).init_array \
? (v).items \
: _memcpy_free((v).init_array, (v).items, \
(v).size * sizeof((v).items[0]))) \
: ((v).items == (v).init_array \
? memcpy(xmalloc((v).capacity * sizeof((v).items[0])), \
(v).items, \
(v).size * sizeof((v).items[0])) \
: xrealloc((v).items, \
(v).capacity * sizeof((v).items[0])))))
void * xrealloc(void *ptr, size_t size) FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_ALLOC_SIZE(2) FUNC_ATTR_NONNULL_RET
Definition: memory.c:147
char * s
Definition: message.c:732
void * xmalloc(size_t size) FUNC_ATTR_MALLOC FUNC_ATTR_ALLOC_SIZE(1) FUNC_ATTR_NONNULL_RET
Definition: memory.c:100
v
Definition: eval.c:2082
#define ARRAY_SIZE(arr)
Definition: macros.h:140

Resize vector with preallocated array

Note
May not resize to an array smaller then init_array: if requested, init_array will be used.
Parameters
[out]vVector to resize.
[in]sNew size.
#define kvi_resize_full (   v)
Value:
/* ARRAY_SIZE((v).init_array) is the minimal capacity of this vector. */ \
/* Thus when vector is full capacity may not be zero and it is safe */ \
/* not to bother with checking whether (v).capacity is 0. But now */ \
/* capacity is not guaranteed to have size that is a power of 2, it is */ \
/* hard to fix this here and is not very necessary if users will use */ \
/* 2^x initial array size. */ \
kvi_resize(v, (v).capacity << 1)
v
Definition: eval.c:2082
#define kvi_resize(v, s)
Definition: kvec.h:154

Resize vector with preallocated array when it is full

Parameters
[out]vVector to resize.