rcx

library of miscellaneous bits of C code
git clone git://git.rr3.xyz/rcx
Log | Files | Refs | README | LICENSE

commit 2df5ebc15b0eadaacbd274b46a282b7005d1a014
parent 2c036d36487e5d9b49e4560a4d1ea0c43f787431
Author: Robert Russell <robertrussell.72001@gmail.com>
Date:   Wed,  7 Sep 2022 21:51:51 -0700

Add more insert vector methods

Instead of push, cat, and catn, it would be more pleasing to
respectively call them app, appv, appn (where app is short for
append), but these names are less standard/readable.

Diffstat:
Minc/rcx/vector.h | 34+++++++++++++++++++++++++---------
1 file changed, 25 insertions(+), 9 deletions(-)

diff --git a/inc/rcx/vector.h b/inc/rcx/vector.h @@ -31,7 +31,11 @@ R_VECTOR_STATIC UNUSED usize R_VECTOR_METHOD(cap,##__VA_ARGS__)(T **v); \ R_VECTOR_STATIC UNUSED int R_VECTOR_METHOD(resize,##__VA_ARGS__)(T **v, usize cap); \ R_VECTOR_STATIC UNUSED int R_VECTOR_METHOD(reserve,##__VA_ARGS__)(T **v, usize n); \ R_VECTOR_STATIC UNUSED int R_VECTOR_METHOD(ins,##__VA_ARGS__)(T **v, usize i, T e); \ +R_VECTOR_STATIC UNUSED int R_VECTOR_METHOD(insv,##__VA_ARGS__)(T **dst, usize i, T *src); \ +R_VECTOR_STATIC UNUSED int R_VECTOR_METHOD(insn,##__VA_ARGS__)(T **dst, usize i, T *src, usize n); \ R_VECTOR_STATIC UNUSED int R_VECTOR_METHOD(push,##__VA_ARGS__)(T **v, T e); \ +R_VECTOR_STATIC UNUSED int R_VECTOR_METHOD(cat,##__VA_ARGS__)(T **dst, T *src); \ +R_VECTOR_STATIC UNUSED int R_VECTOR_METHOD(catn,##__VA_ARGS__)(T **dst, T *src, usize n); \ R_VECTOR_STATIC UNUSED T R_VECTOR_METHOD(del,##__VA_ARGS__)(T **v, usize i); \ R_VECTOR_STATIC UNUSED T R_VECTOR_METHOD(pop,##__VA_ARGS__)(T **v); \ R_VECTOR_STATIC UNUSED T R_VECTOR_METHOD(peek,##__VA_ARGS__)(T **v); @@ -85,17 +89,31 @@ int R_VECTOR_METHOD(reserve,##__VA_ARGS__)(T **v, usize n) { \ } \ } \ int R_VECTOR_METHOD(ins,##__VA_ARGS__)(T **v, usize i, T e) { \ - if (R_VECTOR_METHOD(reserve,##__VA_ARGS__)(v, 1)) \ + return R_VECTOR_METHOD(insn,##__VA_ARGS__)(v, i, &e, 1); \ +} \ +int R_VECTOR_METHOD(insv,##__VA_ARGS__)(T **dst, usize i, T *src) { \ + return R_VECTOR_METHOD(insn,##__VA_ARGS__)(dst, i, src, \ + R_VECTOR_METHOD(len,##__VA_ARGS__)(&src)); \ +} \ +int R_VECTOR_METHOD(insn,##__VA_ARGS__)(T **dst, usize i, T *src, usize n) { \ + if (R_VECTOR_METHOD(reserve,##__VA_ARGS__)(dst, n)) \ return -1; \ - memmove(&(*v)[i+1], &(*v)[i], \ - (R_VECTOR_HDR_(*v)->len - i) * sizeof (*v)[0]); \ - (*v)[i] = e; \ - R_VECTOR_HDR_(*v)->len++; \ + memmove(&(*dst)[i+n], &(*dst)[i], \ + (R_VECTOR_HDR_(*dst)->len - i) * sizeof (*dst)[0]); \ + memcpy(&(*dst)[i], src, n * sizeof (*dst)[0]); \ + R_VECTOR_HDR_(*dst)->len += n; \ return 0; \ } \ int R_VECTOR_METHOD(push,##__VA_ARGS__)(T **v, T e) { \ - return R_VECTOR_METHOD(ins,##__VA_ARGS__)(v, \ - R_VECTOR_METHOD(len,##__VA_ARGS__)(v), e); \ + return R_VECTOR_METHOD(catn,##__VA_ARGS__)(v, &e, 1); \ +} \ +int R_VECTOR_METHOD(cat,##__VA_ARGS__)(T **dst, T *src) { \ + return R_VECTOR_METHOD(catn,##__VA_ARGS__)(dst, \ + src, R_VECTOR_METHOD(len,##__VA_ARGS__)(&src)); \ +} \ +int R_VECTOR_METHOD(catn,##__VA_ARGS__)(T **dst, T *src, usize n) { \ + return R_VECTOR_METHOD(insn,##__VA_ARGS__)(dst, \ + R_VECTOR_METHOD(len,##__VA_ARGS__)(dst), src, n); \ } \ T R_VECTOR_METHOD(del,##__VA_ARGS__)(T **v, usize i) { \ T e = (*v)[i]; \ @@ -112,10 +130,8 @@ T R_VECTOR_METHOD(peek,##__VA_ARGS__)(T **v) { \ } /* TODO? -insn/insnz deln clr => set length to 0 without resizing -dup => duplicate/clone vector optionally take cmp function and define: sort => qsort wrapper bsearch => bsearch wrapper