From fca3330b823ee39008785d6341dc5987d544e002 Mon Sep 17 00:00:00 2001 From: Hana Date: Tue, 10 Oct 2023 18:31:17 +0200 Subject: [PATCH] Add replace and remove method in vector --- includes/vector.h | 2 ++ src/vector.c | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/includes/vector.h b/includes/vector.h index b02e1b0..741e9c9 100644 --- a/includes/vector.h +++ b/includes/vector.h @@ -14,6 +14,8 @@ void* vector_set(vector_t* self, size_t index, void* element); vector_t* vector_push(vector_t* self, void* element); void* vector_pop(vector_t* self); +void* vector_replace(vector_t* self, void* new_element, void* old_element); +void* vector_remove(vector_t* self, void* element); vector_t* vector_clone(vector_t* self); void vector_deeply_drop(vector_t* self, void (*dropper)(void*)); void vector_drop(vector_t* self); diff --git a/src/vector.c b/src/vector.c index 6b2e7a3..76b1b20 100644 --- a/src/vector.c +++ b/src/vector.c @@ -16,7 +16,7 @@ vector_t* new_vector() { } void* vector_get(vector_t* self, size_t index) { - if (self->data == NULL || index >= self->len) return NULL; + if (self->data == NULL || index >= self->len || index < 0) return NULL; return self->data[index]; } @@ -70,6 +70,23 @@ void* vector_pop(vector_t* self) { return popped_element; } +void* vector_replace(vector_t* self, void* new_element, void* old_element) { + size_t i = 0; + while (self->data[i] != old_element) i++; + self->data[i] = new_element; + return old_element; +} + +void* vector_remove(vector_t* self, void* element) { + size_t offset = 0; + for (int i = 0; i < self->len; i++) { + if (self->data[i] == element) offset++; + else if (offset) self->data[i - offset] = self->data[i]; + } + self->len -= offset; + return element; +} + vector_t* vector_clone(vector_t* self) { vector_t* vec = malloc(sizeof(vector_t)); void** data = NULL;