#ifndef ARRAYLIST_H #define ARRAYLIST_H #include #include #include typedef struct ArrayList ArrayList; typedef struct ArraySlice ArraySlice; typedef enum { ARRLIST_OK = 0, ARRLIST_OUT_OF_BOUNDS, ARRLIST_BAD_ALLOC, ARRLIST_ALLOC_OVERFLOW, ARRLIST_EMPTY, ARRLIST_NULL_ARG, ARRLIST_INVALID_ELEM_SIZE, ARRLIST_INVALID_CAPACITY, ARRLIST_IS_BORROWED, ARRLIST_INVALID_SLICE, } ArrayListErr; ArrayList *arraylist_init(size_t capacity, size_t elem_size); ArrayListErr arraylist_destroy(ArrayList **arr); ArrayListErr arraylist_clear(ArrayList *arr); ArrayList *arraylist_copy(const ArrayList *arr); size_t arraylist_size(const ArrayList *arr); size_t arraylist_capacity(const ArrayList *arr); bool arraylist_is_empty(const ArrayList *arr); ArrayListErr arraylist_push_back(ArrayList *arr, void *data); ArrayListErr arraylist_insert(ArrayList*arr, size_t index, void *data); ArrayListErr arraylist_push_front(ArrayList* arr, void *data); // Here out can be null for not having anything writen ArrayListErr arraylist_pop_back(ArrayList *arr, void *out); ArrayListErr arraylist_remove_at(ArrayList *arr, size_t index, void *out); ArrayListErr arraylist_pop_front(ArrayList *arr, void *out); ArrayListErr arraylist_get(const ArrayList *arr, size_t index, void *out); ArrayListErr arraylist_set(ArrayList *arr, size_t index, void *data); 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 arrayslice_destroy(ArraySlice **slice); bool arrayslice_is_valid(const ArraySlice *slice); size_t arrayslice_size(const ArraySlice *slice); // peek and next can be null, get can't, like, why would you use get without // actually getting something?, for validating an index?, use size idiot ArrayListErr arrayslice_peek(const ArraySlice *slice, void *out); 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); #endif