diff --git a/Makefile b/Makefile index 39b6c56..85f4843 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -CC = clang -CFLAGS = -O2 -Wall -Wextra -Wno-c2x-extensions +CC = zig cc +CFLAGS = -O2 -std=c23 #-Wall -Wextra -Wno-c2x-extensions test_array: $(CC) $(CFLAGS) -o test_array test_array.c libkeke_array.c ./test_array diff --git a/a.out b/a.out deleted file mode 100755 index 8d8a0f5..0000000 Binary files a/a.out and /dev/null differ diff --git a/libkeke_array.c b/libkeke_array.c index 30fda9b..98b4e2f 100644 --- a/libkeke_array.c +++ b/libkeke_array.c @@ -27,8 +27,7 @@ KekeArray *keke_array_alloc(size_t initial_len, size_t type_size) { array->type_size = type_size; array->max_len = max_len; - array->content = malloc(max_len * type_size); - memset(array->content, 0, max_len * type_size); + array->content = calloc(max_len, type_size); return array; } @@ -37,7 +36,6 @@ void keke_array_free(KekeArray *array) { free(array); } - void keke_array_set(KekeArray *array, size_t index, const void *value) { if(index >= array->max_len) { array->content = realloc(array->content, (array->max_len << 1) * array->type_size); @@ -74,6 +72,11 @@ void keke_array_set_len(KekeArray *array, size_t new_len) { } void keke_array_insert(KekeArray *array, size_t index, const void *value) { + if(array->len + 1 > array->max_len) { + array->content = realloc(array->content, (array->max_len << 1) * array->type_size); + memset(array->content + array->max_len * array->type_size, 0, array->max_len * array->type_size); + array->max_len <<= 1; + } keke_array_set_len(array, array->len + 1); memmove(array->content + ((index + 1) * array->type_size), array->content + (index * array->type_size), (array->len - index - 1) * array->type_size); memcpy(array->content + index * array->type_size, value, array->type_size); @@ -98,6 +101,12 @@ void keke_array_delete(KekeArray *array, size_t index) { memmove(array->content + (index * array->type_size), array->content + ((index + 1) * array->type_size), (array->len - index + 1) * array->type_size); } +void keke_array_swap_delete(KekeArray *array, size_t index) { + size_t new_len = array->len - 1; + keke_swap(ARRAY_GET(array, index), ARRAY_GET(array, new_len), array->type_size); + keke_array_set_len(array, new_len); +} + KekeArray *keke_array_yoink(KekeArray *array, size_t start_index, size_t len) { if(start_index + len >= array->len) return NULL; KekeArray *ret = keke_array_alloc(len, array->type_size); diff --git a/libkeke_symbol.c b/libkeke_symbol.c index bbe4828..8eea560 100644 --- a/libkeke_symbol.c +++ b/libkeke_symbol.c @@ -1,7 +1,7 @@ #include #include "libkeke_symbol.h" -static KekeSymbol iota = KEKE_NULL_SYMBOL + 1; +static _Atomic KekeSymbol iota = KEKE_NULL_SYMBOL + 1; KekeSymbol keke_new_symbol() { return iota++; diff --git a/test_array.c b/test_array.c index dd3da74..513a285 100644 --- a/test_array.c +++ b/test_array.c @@ -48,7 +48,7 @@ int main(void) { puts("Expected value:\n9, 8, 3, 2, 1, 0,"); keke_array_foreach(array, output); puts("\n"); - + const int k = 100; keke_array_insert(array2, 2, &k); puts("Expected value:\n7, 6, 100, 5, 4,"); @@ -123,7 +123,7 @@ int main(void) { j = 0; keke_array_reduce(array4, add, &j); printf("Expected value:\n7\n%d\n\n", j); - + keke_array_free(array); keke_array_free(array2); keke_array_free(array4);