refactor: changed arrayslice init

This commit is contained in:
2026-05-14 06:59:25 -06:00
parent 36bd2a37c7
commit 0a0350c1c1
2 changed files with 32 additions and 30 deletions

View File

@@ -20,6 +20,8 @@ typedef enum {
ARRLIST_INVALID_CAPACITY, ARRLIST_INVALID_CAPACITY,
ARRLIST_IS_BORROWED, ARRLIST_IS_BORROWED,
ARRLIST_INVALID_SLICE, ARRLIST_INVALID_SLICE,
ARRLIST_INVALID_ARR,
ARRLIST_INVALID_START,
} ArrayListErr; } ArrayListErr;
ArrayListErr arraylist_init(ArrayList **arr, size_t capacity, size_t elem_size); ArrayListErr arraylist_init(ArrayList **arr, size_t capacity, size_t elem_size);

View File

@@ -434,68 +434,68 @@ ArrayListErr arraylist_reserve(ArrayList *arr, size_t size_to_reserve) {
return ARRLIST_OK; return ARRLIST_OK;
} }
ArraySlice *arraylist_slice(ArrayList *arr, size_t start, size_t len) { ArrayListErr arraylist_slice(ArraySlice **slice, ArrayList *arr, size_t start, size_t len) {
if (arr == NULL) { if (arr == NULL) {
return NULL; return ARRLIST_NULL_ARG;
} }
if (arr->len == 0 || len == 0) { if (arr->len == 0 || len == 0) {
return NULL; return ARRLIST_INVALID_ARR;
} }
if (start > SIZE_MAX / arr->elem_size || len > SIZE_MAX / arr->elem_size) { if (start > SIZE_MAX / arr->elem_size || len > SIZE_MAX / arr->elem_size) {
return NULL; return ARRLIST_INVALID_CAPACITY;
} }
if (start + len > arr->len) { if (start + len > arr->len) {
return NULL; return ARRLIST_INVALID_START;
} }
ArraySlice *slice = malloc(sizeof(ArraySlice)); ArraySlice *new_slice = malloc(sizeof(ArraySlice));
if (slice == NULL) { if (new_slice == NULL) {
return NULL; return ARRLIST_BAD_ALLOC;
} }
slice->arr = arr; new_slice->arr = arr;
slice->start = start; new_slice->start = start;
slice->end = start + len; new_slice->end = start + len;
slice->current = start; new_slice->current = start;
slice->is_safe = true; new_slice->is_safe = false;
arr->borrows++; *slice = new_slice;
return ARRLIST_OK;
return slice;
} }
ArraySlice *arraylist_slice_unsafe(ArrayList *arr, size_t start, size_t len) { ArrayListErr arraylist_slice_unsafe(ArraySlice **slice, ArrayList *arr, size_t start, size_t len) {
if (arr == NULL) { if (arr == NULL) {
return NULL; return ARRLIST_NULL_ARG;
} }
if (arr->len == 0 || len == 0) { if (arr->len == 0 || len == 0) {
return NULL; return ARRLIST_INVALID_ARR;
} }
if (start > SIZE_MAX / arr->elem_size || len > SIZE_MAX / arr->elem_size) { if (start > SIZE_MAX / arr->elem_size || len > SIZE_MAX / arr->elem_size) {
return NULL; return ARRLIST_INVALID_CAPACITY;
} }
if (start + len > arr->len) { if (start + len > arr->len) {
return NULL; return ARRLIST_INVALID_START;
} }
ArraySlice *slice = malloc(sizeof(ArraySlice)); ArraySlice *new_slice = malloc(sizeof(ArraySlice));
if (slice == NULL) { if (new_slice == NULL) {
return NULL; return ARRLIST_BAD_ALLOC;
} }
slice->arr = arr; new_slice->arr = arr;
slice->start = start; new_slice->start = start;
slice->end = start + len; new_slice->end = start + len;
slice->current = start; new_slice->current = start;
slice->is_safe = false; new_slice->is_safe = false;
return slice; *slice = new_slice;
return ARRLIST_OK;
} }
ArrayListErr arrayslice_destroy(ArraySlice **slice) { ArrayListErr arrayslice_destroy(ArraySlice **slice) {