summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2023-03-27 21:12:47 +0200
committerLouis Burda <quent.burda@gmail.com>2023-03-31 22:17:02 -0400
commitd33ebe88ade38ff683fbd0fd74bee13f7962406b (patch)
tree62e4a95c015d7a6032abf31dd59ac326f7981a87 /src
parentcace3248f08c52886568830479cfb5b8338ab72c (diff)
downloadlibdvec-c-d33ebe88ade38ff683fbd0fd74bee13f7962406b.tar.gz
libdvec-c-d33ebe88ade38ff683fbd0fd74bee13f7962406b.zip
Minor API improvements
Diffstat (limited to 'src')
-rw-r--r--src/dvec.c75
-rw-r--r--src/test.c16
2 files changed, 48 insertions, 43 deletions
diff --git a/src/dvec.c b/src/dvec.c
index 00f407f..2ad220b 100644
--- a/src/dvec.c
+++ b/src/dvec.c
@@ -46,6 +46,7 @@ dvec_deinit(struct dvec *dvec)
rc = dvec->allocator->free(dvec->data);
LIBDVEC_ABORT_ON_ALLOC(rc);
+
return -rc;
}
@@ -59,7 +60,7 @@ dvec_alloc(struct dvec **dvec, size_t dsize, size_t cap,
rc = allocator->alloc((void **)dvec, sizeof(struct dvec));
LIBDVEC_ABORT_ON_ALLOC(rc);
- if (!*dvec) return -rc;
+ if (rc) return -rc;
rc = dvec_init(*dvec, dsize, cap, allocator);
if (rc) return rc;
@@ -155,15 +156,13 @@ dvec_shrink(struct dvec *dvec)
rc = dvec->allocator->free(dvec->data);
LIBDVEC_ABORT_ON_ALLOC(rc);
if (rc) return -rc;
- return 0;
+ } else {
+ dvec->cap = dvec->len;
+ rc = dvec->allocator->realloc(&dvec->data, dvec->cap * dvec->dsize);
+ LIBDVEC_ABORT_ON_ALLOC(rc);
+ if (rc) return -rc;
}
- dvec->cap = dvec->len;
-
- rc = dvec->allocator->realloc(&dvec->data, dvec->cap * dvec->dsize);
- LIBDVEC_ABORT_ON_ALLOC(rc);
- if (rc) return -rc;
-
return 0;
}
@@ -210,42 +209,42 @@ dvec_replace(struct dvec *dvec, size_t index, const void *data, size_t count)
memcpy(dvec->data + index * dvec->dsize, data, count * dvec->dsize);
}
-bool
-dvec_iter_fwd(const struct dvec *dvec, void **p)
+void *
+dvec_iter_fwd(const struct dvec *dvec, void *p)
{
- void **iter;
-
- LIBDVEC_ABORT_ON_ARGS(!dvec || !p);
-
- if (!dvec->len) return false;
-
- iter = p;
- if (*iter == NULL) {
- *iter = dvec->data;
+ LIBDVEC_ABORT_ON_ARGS(!dvec);
+ LIBDVEC_ABORT_ON_ARGS(p && (p < dvec->data));
+ LIBDVEC_ABORT_ON_ARGS(p && (p >= dvec->data + dvec->len * dvec->dsize));
+ LIBDVEC_ABORT_ON_ARGS(p && ((size_t) (p - dvec->data) % dvec->dsize));
+
+ if (p == NULL) {
+ if (dvec->len > 0)
+ return dvec->data;
+ else
+ return NULL;
+ } else if (p < dvec->data + dvec->dsize * (dvec->len - 1)) {
+ return p + dvec->dsize;
} else {
- *iter += dvec->dsize;
+ return NULL;
}
-
- return *iter < dvec->data + dvec->dsize * dvec->len;
}
-bool
-dvec_iter_bwd(const struct dvec *dvec, void **p)
+void *
+dvec_iter_bwd(const struct dvec *dvec, void *p)
{
- void **iter;
-
- LIBDVEC_ABORT_ON_ARGS(!dvec || !p);
-
- if (!dvec->len) return false;
-
- iter = p;
- if (*iter == NULL) {
- *iter = dvec->data + (dvec->len - 1) * dvec->dsize;
- } else if (*iter > dvec->data) {
- *iter -= dvec->dsize;
+ LIBDVEC_ABORT_ON_ARGS(!dvec);
+ LIBDVEC_ABORT_ON_ARGS(p && (p < dvec->data));
+ LIBDVEC_ABORT_ON_ARGS(p && (p >= dvec->data + dvec->len * dvec->dsize));
+ LIBDVEC_ABORT_ON_ARGS(p && ((size_t) (p - dvec->data) % dvec->dsize));
+
+ if (p == NULL) {
+ if (dvec->len > 0)
+ return dvec->data + (dvec->len - 1) * dvec->dsize;
+ else
+ return NULL;
+ } else if (p > dvec->data) {
+ return p - dvec->dsize;
} else {
- return false;
+ return NULL;
}
-
- return true;
}
diff --git a/src/test.c b/src/test.c
index 44df3d0..f7e1abb 100644
--- a/src/test.c
+++ b/src/test.c
@@ -6,7 +6,12 @@
#include <string.h>
#include <stdlib.h>
-#define LIBDVEC_ERR(rc) errx(1, "libdvec: %s", rc < 0 ? strerror(-rc) : "???")
+#define LIBDVEC_ERR(rc) errx(1, "libdvec: %s", \
+ rc < 0 ? strerror(-rc) : dvec_err[rc])
+
+static const char *dvec_err[] = {
+ DVEC_STRERR_INIT
+};
int
main(int argc, const char **argv)
@@ -15,17 +20,18 @@ main(int argc, const char **argv)
int i, rc;
int *val;
- rc = dvec_init(&dvec, sizeof(int), 10, &stdlib_heap_allocator);
+ rc = dvec_init(&dvec, sizeof(int), 16, &stdlib_heap_allocator);
if (rc) LIBDVEC_ERR(rc);
for (i = 1; i < argc; i++) {
- val = dvec_add_slot(&dvec, &rc);
+ rc = dvec_add_back(&dvec, 1);
if (rc) LIBDVEC_ERR(rc);
+ val = dvec_back(&dvec);
*val = atoi(argv[i]);
}
- for (i = 0; i < dvec.len; i++)
- printf("%i\n", *(int *)dvec_at(&dvec, i));
+ for (DVEC_ITER(&dvec, val))
+ printf("%i\n", *val);
printf("dvec len: %lu\n", dvec.len);