Skip to content

Commit

Permalink
Add replace and remove method in vector
Browse files Browse the repository at this point in the history
  • Loading branch information
hanako-eo committed Oct 10, 2023
1 parent 0825821 commit fca3330
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
2 changes: 2 additions & 0 deletions includes/vector.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
19 changes: 18 additions & 1 deletion src/vector.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
}
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit fca3330

Please sign in to comment.