Compare commits

...

5 Commits

Author SHA1 Message Date
e0c8b46bfa refactor: tests work, all fine 2026-05-14 08:20:56 -06:00
0a0350c1c1 refactor: changed arrayslice init 2026-05-14 06:59:25 -06:00
36bd2a37c7 refactor: changed arrayslice_to_arraylsit 2026-05-14 06:53:38 -06:00
dc274787e3 refactor: slices take same approach for init 2026-05-14 06:48:56 -06:00
d69a74dad2 refactor: init takes pointer to pointer for compatibliity
Its better for me this way, its just this little change at least, next
is fucking going and fixig all damn tests, the fucking wors part
2026-05-13 20:42:04 -06:00
4 changed files with 357 additions and 334 deletions

View File

@@ -8,7 +8,7 @@ set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Opciones
option(ARRAYLIST_BUILD_TESTS "Build arraylist tests" OFF)
option(ARRAYLIST_BUILD_TESTS "Build arraylist tests" ON)
option(ARRAYLIST_ENABLE_SANITIZERS "Enable sanitizers for tests" ON)
# ------------------------

View File

@@ -20,9 +20,12 @@ typedef enum {
ARRLIST_INVALID_CAPACITY,
ARRLIST_IS_BORROWED,
ARRLIST_INVALID_SLICE,
ARRLIST_INVALID_ARR,
ARRLIST_INVALID_START,
ARRLIST_BORROW_UNDERFLOW,
} ArrayListErr;
ArrayList *arraylist_init(size_t capacity, size_t elem_size);
ArrayListErr arraylist_init(ArrayList **arr, size_t capacity, size_t elem_size);
ArrayListErr arraylist_destroy(ArrayList **arr);
ArrayListErr arraylist_clear(ArrayList *arr);
ArrayList *arraylist_clone(const ArrayList *arr);
@@ -47,8 +50,8 @@ ArrayListErr arraylist_resize(ArrayList *arr, size_t new_capacity);
ArrayListErr arraylist_reserve(ArrayList *arr, size_t size_to_reserve);
//Slice stuff
ArraySlice *arraylist_slice(ArrayList *arr, size_t start, size_t len);
ArraySlice *arraylist_slice_unsafe(ArrayList *arr, size_t start, size_t len);
ArrayListErr arraylist_slice(ArraySlice **slice, ArrayList *arr, size_t start, size_t len);
ArrayListErr arraylist_slice_unsafe(ArraySlice **slice, ArrayList *arr, size_t start, size_t len);
ArrayListErr arrayslice_destroy(ArraySlice **slice);
bool arrayslice_is_valid(const ArraySlice *slice);
@@ -62,6 +65,6 @@ ArrayListErr arrayslice_next(ArraySlice *slice, void *out);
ArrayListErr arrayslice_reset(ArraySlice *slice);
ArrayListErr arrayslice_advance(ArraySlice *slice, size_t n);
ArrayList *arrayslice_to_arraylist(const ArraySlice *slice);
ArrayListErr arrayslice_to_arraylist(ArrayList **arr, const ArraySlice *slice);
#endif

View File

@@ -26,34 +26,42 @@ struct ArraySlice {
static ArrayListErr arraylist_grow(ArrayList *arr);
static ArrayListErr arraylist_shrink(ArrayList *arr);
ArrayList *arraylist_init(size_t capacity, size_t elem_size) {
ArrayListErr arraylist_init(ArrayList **arr, size_t capacity, size_t elem_size) {
if (arr == NULL) {
return ARRLIST_NULL_ARG;
}
*arr = NULL;
if (capacity == 0) {
return NULL;
return ARRLIST_INVALID_CAPACITY;
}
if (elem_size == 0) {
return NULL;
return ARRLIST_INVALID_ELEM_SIZE;
}
if (capacity > SIZE_MAX / elem_size) {
return NULL;
return ARRLIST_INVALID_CAPACITY;
}
ArrayList *arr = malloc(sizeof(ArrayList));
if (arr == NULL) {
return NULL;
}
arr->capacity = capacity;
arr->elem_size = elem_size;
arr->len = 0;
arr->borrows = 0;
arr->buffer = malloc(capacity * elem_size);
if (arr->buffer == NULL) {
free(arr);
return NULL;
ArrayList *new_arr = malloc(sizeof(ArrayList));
if (new_arr == NULL) {
return ARRLIST_BAD_ALLOC;
}
return arr;
new_arr->capacity = capacity;
new_arr->elem_size = elem_size;
new_arr->len = 0;
new_arr->borrows = 0;
new_arr->buffer = malloc(capacity * elem_size);
if (new_arr->buffer == NULL) {
free(new_arr);
return ARRLIST_BAD_ALLOC;
}
*arr = new_arr;
return ARRLIST_OK;
}
ArrayListErr arraylist_destroy(ArrayList **arr) {
@@ -428,68 +436,69 @@ ArrayListErr arraylist_reserve(ArrayList *arr, size_t size_to_reserve) {
return ARRLIST_OK;
}
ArraySlice *arraylist_slice(ArrayList *arr, size_t start, size_t len) {
if (arr == NULL) {
return NULL;
ArrayListErr arraylist_slice(ArraySlice **slice, ArrayList *arr, size_t start, size_t len) {
if (arr == NULL || slice == NULL) {
return ARRLIST_NULL_ARG;
}
if (arr->len == 0 || len == 0) {
return NULL;
if (arr->len == 0) {
return ARRLIST_INVALID_ARR;
}
if (start > SIZE_MAX / arr->elem_size || len > SIZE_MAX / arr->elem_size) {
return NULL;
if (start > SIZE_MAX - len) {
return ARRLIST_INVALID_CAPACITY;
}
if (start + len > arr->len) {
return NULL;
if (start + len > arr->len || len == 0) {
return ARRLIST_INVALID_START;
}
ArraySlice *slice = malloc(sizeof(ArraySlice));
if (slice == NULL) {
return NULL;
ArraySlice *new_slice = malloc(sizeof(ArraySlice));
if (new_slice == NULL) {
return ARRLIST_BAD_ALLOC;
}
slice->arr = arr;
slice->start = start;
slice->end = start + len;
slice->current = start;
slice->is_safe = true;
new_slice->arr = arr;
new_slice->start = start;
new_slice->end = start + len;
new_slice->current = start;
new_slice->is_safe = true;
arr->borrows++;
return slice;
*slice = new_slice;
return ARRLIST_OK;
}
ArraySlice *arraylist_slice_unsafe(ArrayList *arr, size_t start, size_t len) {
if (arr == NULL) {
return NULL;
ArrayListErr arraylist_slice_unsafe(ArraySlice **slice, ArrayList *arr, size_t start, size_t len) {
if (arr == NULL || slice == NULL) {
return ARRLIST_NULL_ARG;
}
if (arr->len == 0 || len == 0) {
return NULL;
if (arr->len == 0) {
return ARRLIST_INVALID_ARR;
}
if (start > SIZE_MAX / arr->elem_size || len > SIZE_MAX / arr->elem_size) {
return NULL;
if (start > SIZE_MAX - len) {
return ARRLIST_INVALID_CAPACITY;
}
if (start + len > arr->len) {
return NULL;
if (start + len > arr->len || len == 0) {
return ARRLIST_INVALID_START;
}
ArraySlice *slice = malloc(sizeof(ArraySlice));
if (slice == NULL) {
return NULL;
ArraySlice *new_slice = malloc(sizeof(ArraySlice));
if (new_slice == NULL) {
return ARRLIST_BAD_ALLOC;
}
slice->arr = arr;
slice->start = start;
slice->end = start + len;
slice->current = start;
slice->is_safe = false;
new_slice->arr = arr;
new_slice->start = start;
new_slice->end = start + len;
new_slice->current = start;
new_slice->is_safe = false;
return slice;
*slice = new_slice;
return ARRLIST_OK;
}
ArrayListErr arrayslice_destroy(ArraySlice **slice) {
@@ -578,20 +587,30 @@ ArrayListErr arrayslice_advance(ArraySlice *slice, size_t n) {
return ARRLIST_OK;
}
ArrayList *arrayslice_to_arraylist(const ArraySlice *slice) {
ArrayListErr arrayslice_to_arraylist(ArrayList **arr, const ArraySlice *slice) {
if (slice == NULL || slice->arr == NULL) {
return NULL;
return ARRLIST_NULL_ARG;
}
if (arr == NULL) {
return ARRLIST_NULL_ARG;
}
if (slice->start >= slice->end) {
return NULL;
return ARRLIST_INVALID_SLICE;
}
size_t len = slice->end - slice->start;
ArrayList *new_arr = arraylist_init(arraylist_capacity(slice->arr), slice->arr->elem_size);
if (new_arr == NULL) {
return NULL;
ArrayList *new_arr;
ArrayListErr init_err = arraylist_init(
&new_arr,
arraylist_capacity(slice->arr),
slice->arr->elem_size
);
if (init_err != ARRLIST_OK) {
return init_err;
}
memcpy(
@@ -602,5 +621,6 @@ ArrayList *arrayslice_to_arraylist(const ArraySlice *slice) {
new_arr->len = len;
return new_arr;
*arr = new_arr;
return ARRLIST_OK;
}

File diff suppressed because it is too large Load Diff