From 57ff54aac90c95320a1b6b31426235814ef5d754 Mon Sep 17 00:00:00 2001 From: Warwick Date: Thu, 8 Feb 2024 11:31:51 +0000 Subject: [PATCH] implemented erase from vector --- src/main.c | 8 +++++--- src/vec.c | 14 ++++++++++++-- src/vec.h | 5 +++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/main.c b/src/main.c index f421e65..9438e8c 100644 --- a/src/main.c +++ b/src/main.c @@ -6,16 +6,18 @@ int main() { vector *vec = vec_create(sizeof(int)); - for (int x = 0; x < 100; x++) { + for (int x = 0; x < 110; x++) { vec_push_back(vec, &x); } int i = 99999999; - vec_push_index(vec, &i, 5); + vec_insert(vec, &i, 5); vec_push_front(vec, &i); printf("Capacity before shrink: %zu | ", vec_capacity(vec)); vec_shrink_to_fit(vec); printf("Capacity after: %zu\n", vec_capacity(vec)); - for (int x = 0; x < 102; x++) { + vec_erase(vec, 0); + vec_erase(vec, 101); + for (int x = 0; x < 110; x++) { printf("%d ", *(int *)vec_get(vec, x)); } printf("\n"); diff --git a/src/vec.c b/src/vec.c index 2dd2d5e..4b59497 100644 --- a/src/vec.c +++ b/src/vec.c @@ -53,9 +53,9 @@ void vec_push_back(vector *vec, void *data) { vec->size++; } -void vec_push_front(vector *vec, void *data) { vec_push_index(vec, data, 0); } +void vec_push_front(vector *vec, void *data) { vec_insert(vec, data, 0); } -void vec_push_index(vector *vec, void *data, uint index) { +void vec_insert(vector *vec, void *data, uint index) { assert(vec != NULL); assert(index <= vec->size); // TODO: handle wraparound @@ -68,6 +68,16 @@ void vec_push_index(vector *vec, void *data, uint index) { memcpy(vec->elements + (index * vec->element_size), data, vec->element_size); vec->size++; } +void vec_erase(vector *vec, uint index) { + assert(vec != NULL); + assert(index <= vec->size); + // TODO: handle wraparound + + memcpy(vec->elements + index * vec->element_size, + vec->elements + (index + 1) * vec->element_size, + (vec->size - index) * vec->element_size); + vec->size--; +} void *vec_get(vector *vec, uint index) { // TODO: handle wraparound diff --git a/src/vec.h b/src/vec.h index 25da3c1..c444354 100644 --- a/src/vec.h +++ b/src/vec.h @@ -14,8 +14,9 @@ void vec_shrink_to_fit(vector *vec); // Which means you can only push one element at a time void vec_push_back(vector *vec, void *data); void vec_push_front(vector *vec, void *data); -void vec_push_index(vector *vec, void *data, uint index); +void vec_insert(vector *vec, void *data, uint index); +void vec_erase(vector *vec, uint index); -void* vec_get(vector *vec, uint index); +void *vec_get(vector *vec, uint index); size_t vec_size(vector *vec); size_t vec_capacity(vector *vec);