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