Mercurial > lbo > hg > ylisp
changeset 40:63b0bf003bb9
base/vec: Implement yvec_new
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Wed, 21 Aug 2019 13:08:16 +0200 |
parents | 9de50050f36f |
children | a3eac54f2112 |
files | src/base/vec.c src/base/vec.h src/base/vec_test.c |
diffstat | 3 files changed, 33 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/base/vec.c Wed Aug 21 13:06:45 2019 +0200 +++ b/src/base/vec.c Wed Aug 21 13:08:16 2019 +0200 @@ -38,6 +38,13 @@ assert(vec->len <= vec->cap); } +yvec_t yvec_new(void *src, size_t size, size_t len) { + yvec_t vec; + yvec_init(&vec, size, len); + yvec_push_multi(&vec, src, len); + return vec; +} + void yvec_init(yvec_t *vec, size_t size, size_t n) { assert(vec); vec->size = size; @@ -56,15 +63,15 @@ } void *yvec_at(yvec_t *vec, size_t index) { - if (index >= vec->len) - return NULL; + if (index >= vec->len) return NULL; return yvec_at_nocheck(vec, index); } void yvec_resize(yvec_t *vec, size_t new_size) { if (new_size > vec->cap) { yvec_growcap(vec, new_size); - memset(yvec_at_nocheck(vec, vec->len), 0, (new_size - vec->len)*vec->size); + memset(yvec_at_nocheck(vec, vec->len), 0, + (new_size - vec->len) * vec->size); vec->len = new_size; } else { vec->len = new_size; @@ -83,7 +90,7 @@ } void yvec_push_multi(yvec_t *vec, const void *elements, size_t n) { - yvec_growcap(vec, vec->len + n); // Grow capacity to at least len+n. + yvec_growcap(vec, vec->len + n); // Grow capacity to at least len+n. memcpy(yvec_at_nocheck(vec, vec->len), elements, n * vec->size); vec->len += n; assert(vec->len <= vec->cap);
--- a/src/base/vec.h Wed Aug 21 13:06:45 2019 +0200 +++ b/src/base/vec.h Wed Aug 21 13:08:16 2019 +0200 @@ -43,13 +43,22 @@ #define YVEC_PUSH(vecp, elemp) \ (assert((vecp)->size == sizeof(*(elemp))), yvec_push(vecp, (void *)(elemp))) +#define YVEC_NEW(src, len, TYPE) yvec_new(src, sizeof(TYPE), len) + +/** + * @brief Initialize a new vector and return it, from an array of `len` + * elements of each `size` bytes. Use `YVEC_NEW()` to directly specify the type + * of the array. + */ +yvec_t yvec_new(void* src, size_t size, size_t len); + /** * @brief Initialize a vector with `n` elements of `size` bytes each. See also * `YVEC_INIT()`. The vector is guaranteed to only contain zero values. The * initial length is 0. The next `size` appends are "free" (they won't allocate * more memory). */ -void yvec_init(yvec_t *vec, size_t size, size_t n); +void yvec_init(yvec_t *vec, size_t size, size_t len); /** * @brief Append an element. See also `yvec_push()`, which asserts that the
--- a/src/base/vec_test.c Wed Aug 21 13:06:45 2019 +0200 +++ b/src/base/vec_test.c Wed Aug 21 13:08:16 2019 +0200 @@ -3,6 +3,16 @@ #include "vec.h" +void test_vec_new(void) { + int src[3] = {1, 2, 3}; + yvec_t vec = YVEC_NEW(src, 3, int); + assert(2 == *YVEC_AT(&vec, 1, int)); + assert(3 == *YVEC_AT(&vec, 2, int)); + assert(3 == vec.len); + assert(3 == vec.cap); + yvec_destroy(&vec); +} + void test_vec_init_use(void) { yvec_t vec; YVEC_INIT(&vec, 16, int); @@ -16,8 +26,7 @@ yvec_resize(&vec, 0); - for (int i = 0; i < 100; i++) - YVEC_PUSH(&vec, &i); + for (int i = 0; i < 100; i++) YVEC_PUSH(&vec, &i); // Depends on growth_factor! assert(128 == vec.cap); @@ -70,9 +79,8 @@ yvec_destroy(&v3); } - - int main(void) { + test_vec_new(); test_vec_init_use(); test_vec_append(); return 0;