Added optional typedata overrides to ev_vec_init

Signed-off-by: Robear Selwans <robear.selwans@outlook.com>
This commit is contained in:
2024-10-28 14:35:03 +03:00
parent 6ae093c721
commit ca8403112d

View File

@@ -45,6 +45,14 @@ typedef enum {
} ev_vec_error_t; } ev_vec_error_t;
TYPEDATA_GEN(ev_vec_error_t, DEFAULT(EV_VEC_ERR_NONE)); TYPEDATA_GEN(ev_vec_error_t, DEFAULT(EV_VEC_ERR_NONE));
typedef struct {
ev_copy_fn copy;
ev_equal_fn equal;
ev_free_fn free;
ev_tostr_fn tostr;
} ev_vec_overrides_t;
TYPEDATA_GEN(ev_vec_overrides_t);
#if defined(EV_VEC_SHORTNAMES) #if defined(EV_VEC_SHORTNAMES)
# define vec_t ev_vec_t # define vec_t ev_vec_t
# define svec_t ev_svec_t # define svec_t ev_svec_t
@@ -113,7 +121,8 @@ struct ev_vec_meta_t {
*/ */
EV_VEC_API ev_vec_t EV_VEC_API ev_vec_t
ev_vec_init_impl( ev_vec_init_impl(
EvTypeData typeData); EvTypeData typeData,
ev_vec_overrides_t overrides);
/*! /*!
* \brief Syntactic sugar for `ev_vec_init_impl()` * \brief Syntactic sugar for `ev_vec_init_impl()`
@@ -122,7 +131,7 @@ ev_vec_init_impl(
* ev_vec_init(i32); // ev_vec_init_impl(TypeData(i32)); * ev_vec_init(i32); // ev_vec_init_impl(TypeData(i32));
* ``` * ```
*/ */
#define ev_vec_init(T) ev_vec_init_impl(TypeData(T)) #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__), __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_w_cap_impl(T, cap)
@@ -418,12 +427,22 @@ TYPEDATA_GEN(
ev_vec_t ev_vec_t
ev_vec_init_impl( ev_vec_init_impl(
EvTypeData typeData) EvTypeData typeData,
ev_vec_overrides_t overrides)
{ {
void *v = malloc(sizeof(struct ev_vec_meta_t) + (EV_VEC_INIT_CAP * typeData.size)); void *v = malloc(sizeof(struct ev_vec_meta_t) + (EV_VEC_INIT_CAP * typeData.size));
if (!v) if (!v)
return NULL; return NULL;
if(overrides.copy)
typeData.copy_fn = overrides.copy;
if(overrides.equal)
typeData.equal_fn = overrides.equal;
if(overrides.free)
typeData.free_fn = overrides.free;
if(overrides.tostr)
typeData.tostr_fn = overrides.tostr;
struct ev_vec_meta_t *metadata = (struct ev_vec_meta_t *)v; struct ev_vec_meta_t *metadata = (struct ev_vec_meta_t *)v;
*metadata = (struct ev_vec_meta_t){ *metadata = (struct ev_vec_meta_t){
.length = 0, .length = 0,