rcx

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

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:
Minc/list/impl/decls.h | 26++++++++++++++++----------
Minc/list/impl/defs.h | 4++--
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]);