svec improvements

Signed-off-by: Robear Selwans <robear.selwans@outlook.com>
This commit is contained in:
2024-11-13 15:39:41 +02:00
parent 0ee9771976
commit e45152d20f

View File

@@ -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