libdvec-c

C memory vector library
git clone https://git.sinitax.com/sinitax/libdvec-c
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

commit cace3248f08c52886568830479cfb5b8338ab72c
parent 8d68770e56d3c08f646b59c0914f992064f02c70
Author: Louis Burda <quent.burda@gmail.com>
Date:   Thu, 23 Mar 2023 20:26:51 +0100

Allow ignoring return code for _add_slot(s) and fix iter

Diffstat:
Minclude/dvec.h | 19+++++++++++--------
Msrc/dvec.c | 11+++++++----
2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/include/dvec.h b/include/dvec.h @@ -5,7 +5,7 @@ #include <stdbool.h> #include <stddef.h> -#define DVEC_ITER(dvec, p) *p = dvec->data; dvec_iter_fwd(dvec, (void **)p); +#define DVEC_ITER(dvec, p) *p = NULL; dvec_iter_fwd(dvec, (void **)(p)); #ifdef LIBDVEC_ASSERT_ARGS #include "stdlib.h" @@ -50,8 +50,8 @@ void dvec_remove(struct dvec *dvec, size_t index, size_t count); void dvec_replace(struct dvec *dvec, size_t index, const void *data, size_t count); -bool dvec_iter_fwd(struct dvec *dvec, void **p); -bool dvec_iter_bwd(struct dvec *dvec, void **p); +bool dvec_iter_fwd(const struct dvec *dvec, void **p); +bool dvec_iter_bwd(const struct dvec *dvec, void **p); static inline void * dvec_at(struct dvec *dvec, size_t index) @@ -94,12 +94,15 @@ dvec_len(struct dvec *dvec) } static inline void * -dvec_add_slots(struct dvec *dvec, int *rc, size_t count) +dvec_add_slots(struct dvec *dvec, int *_rc, size_t count) { - LIBDVEC_ABORT_ON_ARGS(!dvec || !rc || !count); + int rc; - *rc = dvec_add(dvec, dvec->len, count); - if (*rc) return NULL; + LIBDVEC_ABORT_ON_ARGS(!dvec || !count); + + rc = dvec_add(dvec, dvec->len, count); + if (_rc) *_rc = rc; + if (rc) return NULL; return dvec->data + (dvec->len - count) * dvec->dsize; } @@ -107,7 +110,7 @@ dvec_add_slots(struct dvec *dvec, int *rc, size_t count) static inline void * dvec_add_slot(struct dvec *dvec, int *rc) { - LIBDVEC_ABORT_ON_ARGS(!dvec || !rc); + LIBDVEC_ABORT_ON_ARGS(!dvec); return dvec_add_slots(dvec, rc, 1); } diff --git a/src/dvec.c b/src/dvec.c @@ -138,7 +138,7 @@ dvec_reserve(struct dvec *dvec, size_t len) rc = dvec->allocator->realloc(&dvec->data, dvec->cap * dvec->dsize); LIBDVEC_ABORT_ON_ALLOC(rc); - if (rc) return rc; + if (rc) return -rc; return 0; } @@ -170,9 +170,12 @@ dvec_shrink(struct dvec *dvec) int dvec_add(struct dvec *dvec, size_t index, size_t len) { + int rc; + LIBDVEC_ABORT_ON_ARGS(!dvec || index > dvec->len); - dvec_reserve(dvec, dvec->len + len); + rc = dvec_reserve(dvec, dvec->len + len); + if (rc) return rc; if (index < dvec->len) { memmove(dvec->data + (index + len) * dvec->dsize, @@ -208,7 +211,7 @@ dvec_replace(struct dvec *dvec, size_t index, const void *data, size_t count) } bool -dvec_iter_fwd(struct dvec *dvec, void **p) +dvec_iter_fwd(const struct dvec *dvec, void **p) { void **iter; @@ -227,7 +230,7 @@ dvec_iter_fwd(struct dvec *dvec, void **p) } bool -dvec_iter_bwd(struct dvec *dvec, void **p) +dvec_iter_bwd(const struct dvec *dvec, void **p) { void **iter;