From 4be7bff040800fdb3cb30d4fcb04b1343dd76661 Mon Sep 17 00:00:00 2001 From: Warwick Date: Thu, 8 Feb 2024 11:03:17 +0000 Subject: [PATCH] implemented push based on index and push front --- src/main.c | 9 ++++++--- src/vec.c | 33 ++++++++++++++++++++++----------- src/vec.h | 5 ++++- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/main.c b/src/main.c index 003073b..c4bb607 100644 --- a/src/main.c +++ b/src/main.c @@ -6,10 +6,13 @@ int main() { vector *vec = vec_create(sizeof(int)); - for (int x = 0; x < 1000; x++) { - vec_pushback(vec, &x); + for (int x = 0; x < 10; x++) { + vec_push_back(vec, &x); } - for (int x = 0; x < 1000; x++) { + int i = 99999999; + vec_push_index(vec, &i, 5); + vec_push_front(vec, &i); + for (int x = 0; x < 12; x++) { printf("%d ",*(int*)vec_get(vec, x)); } printf("\n"); diff --git a/src/vec.c b/src/vec.c index 1c8f04f..28b6c9b 100644 --- a/src/vec.c +++ b/src/vec.c @@ -1,6 +1,5 @@ #include "vec.h" #include -#include #include #include @@ -29,32 +28,44 @@ void vec_destroy(vector *vec) { void vec_grow(vector *vec) { assert(vec != NULL); - printf("capacity: %zu\n", vec->capacity); - if (vec->size < vec->capacity) + if (vec->size < vec->capacity) return; // Grow the vector by half vec->capacity += vec->capacity / 2; - printf("new capacity: %zu\n", vec->capacity); vec->elements = reallocarray(vec->elements, vec->capacity, vec->element_size); assert(vec->elements != NULL); } -void vec_pushback(vector *vec, void *data) { +void vec_push_back(vector *vec, void *data) { assert(vec != NULL); vec_grow(vec); - printf("mem start: %p\n", vec->elements); - printf("mem end: %p\n", vec->elements + (vec->size * vec->element_size)); - printf("number of elements: %zu\n", vec->size); - printf("element size: %zu\n\n", vec->element_size); - memcpy(vec->elements + (vec->size * vec->element_size), data, vec->element_size); vec->size++; } -void* vec_get(vector *vec, uint index){ +void vec_push_front(vector *vec, void *data) { vec_push_index(vec, data, 0); } + +void vec_push_index(vector *vec, void *data, uint index) { + assert(vec != NULL); + assert(index <= vec->size); + // TODO: handle wraparound + vec_grow(vec); + + memcpy(vec->elements + (index + 1) * vec->element_size, + vec->elements + index * vec->element_size, + (vec->size - index) * vec->element_size); + + memcpy(vec->elements + (index * vec->element_size), data, vec->element_size); + vec->size++; +} + +void *vec_get(vector *vec, uint index) { + // TODO: handle wraparound + assert(vec != NULL); + assert(index <= vec->size); return vec->elements + index * vec->element_size; } diff --git a/src/vec.h b/src/vec.h index 1b7560a..e8e4c79 100644 --- a/src/vec.h +++ b/src/vec.h @@ -11,5 +11,8 @@ void vec_grow(vector *vec); // Assumes data is the same size as the element size // Which means you can only push one element at a time -void vec_pushback(vector *vec, void *data); +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_get(vector *vec, uint index);