erase() should really now set proper values to 0 after move
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define CAPACITY 1024
|
||||
#define nullptr ((void*)0)
|
||||
|
||||
typedef struct {
|
||||
char* arr;
|
||||
size_t size;
|
||||
size_t capacity;
|
||||
} Vec8_t;
|
||||
|
||||
Vec8_t create(const Vec8_t* input) {
|
||||
Vec8_t vec = { .arr = nullptr, .size = 0, .capacity = CAPACITY };
|
||||
if (input != nullptr && input->size > 0) vec.size = input->size + 1;
|
||||
vec.arr = calloc(vec.capacity, sizeof(char));
|
||||
return vec;
|
||||
}
|
||||
|
||||
Vec8_t add_back(Vec8_t* vec, const char val) {
|
||||
if (vec->size >= vec->capacity) {
|
||||
vec->capacity *= 2;
|
||||
char* nvec = reallocf(vec->arr, vec->capacity * sizeof(char));
|
||||
if (nvec == NULL) return *vec;
|
||||
vec->arr = nvec;
|
||||
}
|
||||
vec->arr[vec->size] = val;
|
||||
vec->size++;
|
||||
return *vec;
|
||||
}
|
||||
|
||||
// Your current implementation
|
||||
__attribute__((overloadable)) Vec8_t*
|
||||
erase(Vec8_t* vec, const int iter_start, const int iter_end) {
|
||||
if(vec == nullptr) return nullptr;
|
||||
if(vec->arr == nullptr) return nullptr;
|
||||
if(iter_start < 0 || iter_end >= vec->size) return nullptr;
|
||||
if(iter_start >= iter_end) return nullptr;
|
||||
size_t diff = iter_end - iter_start;
|
||||
memmove(&vec->arr[iter_start], &vec->arr[iter_end], (vec->size - iter_end) * sizeof(char));
|
||||
for(size_t i = vec->size - 1; i > iter_end; i--) {
|
||||
vec->arr[i] = 0;
|
||||
}
|
||||
vec->size -= diff;
|
||||
return vec;
|
||||
}
|
||||
|
||||
int main() {
|
||||
Vec8_t vec = create(nullptr);
|
||||
for (int i = 0; i < 10; i++) add_back(&vec, 'a' + i);
|
||||
|
||||
printf("Before erase: ");
|
||||
for (int i = 0; i < 10; i++) printf("%c ", vec.arr[i]);
|
||||
printf("(size=%zu)\n", vec.size);
|
||||
|
||||
erase(&vec, 2, 4);
|
||||
|
||||
printf("After erase(2,4): ");
|
||||
for (int i = 0; i < 10; i++) printf("%c ", vec.arr[i] == 0 ? '0' : vec.arr[i]);
|
||||
printf("(size=%zu)\n", vec.size);
|
||||
|
||||
printf("\nExpected: a b e f g h i j (size=8)\n");
|
||||
printf("Got: ");
|
||||
for (int i = 0; i < vec.size; i++) printf("%c ", vec.arr[i] == 0 ? '0' : vec.arr[i]);
|
||||
printf("(size=%zu)\n", vec.size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user