From d3bbc155aff44c22931d05b3c966a30f3cbcebe6 Mon Sep 17 00:00:00 2001 From: Robear Selwans Date: Mon, 7 Jul 2025 10:46:20 +0300 Subject: [PATCH] [ev_vec] Added ev_vec_dup Signed-off-by: Robear Selwans --- ev_vec.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/ev_vec.h b/ev_vec.h index 44e062e..f2ff12f 100644 --- a/ev_vec.h +++ b/ev_vec.h @@ -286,6 +286,17 @@ ev_vec_append( void **arr, u64 size); +/*! + * \brief A function that duplicates the passed vector into a new one and returns it. + * + * \param vec_p Reference to the vector object + * + * \returns The newly created vector. + */ +EV_VEC_API ev_vec_t +ev_vec_dup( + const void* vec_p); + /*! * \brief A function that copies the value at the end of a vector and removes * it from the vector. If a copy function was passed while initializing the @@ -598,6 +609,29 @@ ev_vec_append( return (int)old_len; } +EV_VEC_API ev_vec_t +ev_vec_dup( + const void* vec_p) +{ + ev_vec_t v_orig = *(ev_vec_t*)vec_p; + __ev_vec_getmeta(v_orig) + ev_vec_t v_new = ev_vec_init_impl(metadata->typeData, (ev_vec_overrides_t){0}); + ev_vec_setcapacity(&v_new, metadata->length); + + if(metadata->typeData.copy_fn) + { + for(int i = 0; i < metadata->length; i++) + ev_vec_push_impl(&v_new, (u8*)v_orig + (metadata->typeData.size * i)); + } + else + { + ev_vec_setlen(&v_new, metadata->length); + memcpy(v_new, v_orig, metadata->length * metadata->typeData.size); + } + + return v_new; +} + ev_vec_error_t ev_vec_pop( void* vec_p,