svec improvements
Signed-off-by: Robear Selwans <robear.selwans@outlook.com>
This commit is contained in:
59
ev_vec.h
59
ev_vec.h
@@ -65,6 +65,7 @@ TYPEDATA_GEN(ev_vec_overrides_t);
|
|||||||
# define vec_init ev_vec_init
|
# define vec_init ev_vec_init
|
||||||
# define svec_init ev_svec_init
|
# define svec_init ev_svec_init
|
||||||
# define svec_init_w_cap ev_svec_init_w_cap
|
# define svec_init_w_cap ev_svec_init_w_cap
|
||||||
|
# define svec_init_w_len ev_svec_init_w_len
|
||||||
# define vec_iter_begin ev_vec_iter_begin
|
# define vec_iter_begin ev_vec_iter_begin
|
||||||
# define vec_iter_end ev_vec_iter_end
|
# define vec_iter_end ev_vec_iter_end
|
||||||
# define vec_iter_next ev_vec_iter_next
|
# define vec_iter_next ev_vec_iter_next
|
||||||
@@ -133,32 +134,22 @@ ev_vec_init_impl(
|
|||||||
*/
|
*/
|
||||||
#define ev_vec_init(T, ...) ev_vec_init_impl(TypeData(T), EV_DEFAULT(ev_vec_overrides_t,__VA_ARGS__))
|
#define ev_vec_init(T, ...) ev_vec_init_impl(TypeData(T), EV_DEFAULT(ev_vec_overrides_t,__VA_ARGS__))
|
||||||
|
|
||||||
#define ev_svec_init(T, ...) __ev_svec_init_impl(T, EV_ARRSIZE((T[])__VA_ARGS__), __VA_ARGS__)
|
#define ev_svec_init(T, ...) __ev_svec_init_impl(T, EV_ARRSIZE((T[])__VA_ARGS__), EV_ARRSIZE((T[])__VA_ARGS__), __VA_ARGS__)
|
||||||
#define ev_svec_init_w_cap(T, cap) __ev_svec_init_w_cap_impl(T, cap)
|
#define ev_svec_init_w_cap(T, cap) __ev_svec_init_impl(T, 0, cap)
|
||||||
|
#define ev_svec_init_w_len(T, len) __ev_svec_init_impl(T, len, len)
|
||||||
|
|
||||||
#define __ev_svec_init_impl(T, len, ...) \
|
static struct ev_vec_meta_t *__svec_interm_md;
|
||||||
(ev_svec(T))&((struct { \
|
#define __ev_svec_init_impl(T, len, cap, ...) ( \
|
||||||
struct ev_vec_meta_t meta; \
|
__svec_interm_md = (u8[sizeof(T)*cap + sizeof(struct ev_vec_meta_t)]){}, \
|
||||||
EV_ALIGNAS(EV_ALIGNOF(T)) T data[len]; \
|
*__svec_interm_md = (struct ev_vec_meta_t){ \
|
||||||
}) { \
|
.length = len, \
|
||||||
.meta.length = len, \
|
.capacity = cap, \
|
||||||
.meta.capacity = len, \
|
.typeData = TypeData(T), \
|
||||||
.meta.typeData = TypeData(T), \
|
.allocationType = EV_VEC_ALLOCATION_TYPE_STACK, \
|
||||||
.meta.allocationType = EV_VEC_ALLOCATION_TYPE_STACK, \
|
}, \
|
||||||
.data = __VA_ARGS__ \
|
EV_VA_OPT(__VA_ARGS__)(memcpy(&__svec_interm_md[1], (T[])__VA_ARGS__, sizeof((T[])__VA_ARGS__)),) \
|
||||||
}).data
|
&(__svec_interm_md[1]) \
|
||||||
|
)
|
||||||
#define __ev_svec_init_w_cap_impl(T, cap) \
|
|
||||||
(ev_svec(T))&((struct { \
|
|
||||||
struct ev_vec_meta_t meta; \
|
|
||||||
EV_ALIGNAS(EV_ALIGNOF(T)) T data[cap]; \
|
|
||||||
}) { \
|
|
||||||
.meta.length = 0, \
|
|
||||||
.meta.capacity = cap, \
|
|
||||||
.meta.typeData = TypeData(T), \
|
|
||||||
.meta.allocationType = EV_VEC_ALLOCATION_TYPE_STACK, \
|
|
||||||
.data = __EV_VEC_EMPTY_ARRAY \
|
|
||||||
}).data
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Syntactic sugar for `ev_vec_push_impl()` that allows multiple pushed in the same statement.
|
* \brief Syntactic sugar for `ev_vec_push_impl()` that allows multiple pushed in the same statement.
|
||||||
@@ -395,15 +386,29 @@ EV_VEC_API ev_vec_error_t
|
|||||||
ev_vec_grow(
|
ev_vec_grow(
|
||||||
ev_vec_t *v);
|
ev_vec_t *v);
|
||||||
|
|
||||||
|
static const ev_vec_t EV_VEC_EMPTY =
|
||||||
|
(ev_vec(i32))&((struct {
|
||||||
|
struct ev_vec_meta_t meta;
|
||||||
|
EV_ALIGNAS(EV_ALIGNOF(i32)) i32 data[0];
|
||||||
|
}) {
|
||||||
|
.meta.length = 0,
|
||||||
|
.meta.capacity = 0,
|
||||||
|
.meta.typeData = TypeData(i32),
|
||||||
|
.meta.allocationType = EV_VEC_ALLOCATION_TYPE_STACK,
|
||||||
|
.data = __EV_VEC_EMPTY_ARRAY
|
||||||
|
}).data;
|
||||||
|
|
||||||
TYPEDATA_GEN(
|
TYPEDATA_GEN(
|
||||||
ev_vec_t,
|
ev_vec_t,
|
||||||
INVALID(ev_svec_init_w_cap(i32, 0))
|
INVALID(EV_VEC_EMPTY)
|
||||||
);
|
);
|
||||||
|
|
||||||
TYPEDATA_GEN(
|
TYPEDATA_GEN(
|
||||||
ev_svec_t,
|
ev_svec_t,
|
||||||
INVALID(ev_svec_init_w_cap(i32, 0))
|
INVALID(EV_VEC_EMPTY)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
#ifdef EV_VEC_IMPLEMENTATION
|
#ifdef EV_VEC_IMPLEMENTATION
|
||||||
#undef EV_VEC_IMPLEMENTATION
|
#undef EV_VEC_IMPLEMENTATION
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user