commit ad08c872d7648aea972b13e5e151e7b9f36aaf66
parent 8c978e47e5ef7073b5ae4f297d875e681284c4df
Author: Robert Russell <robertrussell.72001@gmail.com>
Date: Sun, 1 Oct 2023 15:19:59 -0700
Allow indices to be negative in list ptr, get, and set
Diffstat:
2 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/inc/list/impl/decls.h b/inc/list/impl/decls.h
@@ -24,23 +24,29 @@ LIST_METHOD(cap)(LIST_T **l) {
}
static inline UNUSED LIST_T *
-LIST_METHOD(ptr)(LIST_T **l, usize i) {
- LIST_ASSERT(i < LIST_METHOD(len)(l),
- STRINGIFY(LIST_METHOD(ptr))" called with i >= len");
+LIST_METHOD(ptr)(LIST_T **l, isize i) {
+ usize len = LIST_METHOD(len)(l);
+ if (i < 0) i += len;
+ LIST_ASSERT(0 <= i && i < len,
+ STRINGIFY(LIST_METHOD(ptr))" called with i out of bounds");
return &(*l)[i];
}
static inline UNUSED LIST_T
-LIST_METHOD(get)(LIST_T **l, usize i) {
- LIST_ASSERT(i < LIST_METHOD(len)(l),
- STRINGIFY(LIST_METHOD(get))" called with i >= len");
+LIST_METHOD(get)(LIST_T **l, isize i) {
+ usize len = LIST_METHOD(len)(l);
+ if (i < 0) i += len;
+ LIST_ASSERT(0 <= i && i < len,
+ STRINGIFY(LIST_METHOD(get))" called with i out of bounds");
return (*l)[i];
}
static inline UNUSED void
-LIST_METHOD(set)(LIST_T **l, usize i, LIST_T e) {
- LIST_ASSERT(i < LIST_METHOD(len)(l),
- STRINGIFY(LIST_METHOD(set))" called with i >= len");
+LIST_METHOD(set)(LIST_T **l, isize i, LIST_T e) {
+ usize len = LIST_METHOD(len)(l);
+ if (i < 0) i += len;
+ LIST_ASSERT(0 <= i && i < len,
+ STRINGIFY(LIST_METHOD(set))" called with i out of bounds");
(*l)[i] = e;
}
@@ -86,7 +92,7 @@ LIST_METHOD(peek)(LIST_T **l) {
static inline UNUSED void
LIST_METHOD(trunc)(LIST_T **l, usize n) {
LIST_ASSERT(n <= LIST_METHOD(len)(l),
- STRINGIFY(LIST_METHOD(trunc))" called with n > len");
+ STRINGIFY(LIST_METHOD(trunc))" called with n out of bounds");
if (*l) LIST_HDR(*l)->len = n;
}
diff --git a/inc/list/impl/defs.h b/inc/list/impl/defs.h
@@ -42,7 +42,7 @@ LIST_METHOD(reserve)(LIST_T **l, usize n) {
int
LIST_METHOD(insarr)(LIST_T **dst, usize i, LIST_T *src, usize n) {
LIST_ASSERT(i <= LIST_METHOD(len)(dst),
- STRINGIFY(LIST_METHOD(insarr))" called with i > len");
+ STRINGIFY(LIST_METHOD(insarr))" called with i out of bounds");
/* Return early with n == 0, so that LIST_HDR use below is valid. */
if (n == 0) return 0;
if (LIST_METHOD(reserve)(dst, n) < 0) return -1;
@@ -56,7 +56,7 @@ LIST_METHOD(insarr)(LIST_T **dst, usize i, LIST_T *src, usize n) {
LIST_T
LIST_METHOD(del)(LIST_T **l, usize i) {
LIST_ASSERT(i < LIST_METHOD(len)(l),
- STRINGIFY(LIST_METHOD(del))" called with i >= len");
+ STRINGIFY(LIST_METHOD(del))" called with i out of bounds");
LIST_T e = (*l)[i];
usize m = LIST_HDR(*l)->len - i - 1;
memmove(&(*l)[i], &(*l)[i+1], m * sizeof (*l)[0]);