Files
ArrayList/include/arraylist.h
laentropia 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

68 lines
2.3 KiB
C

#ifndef ARRAYLIST_H
#define ARRAYLIST_H
#include <inttypes.h>
#include <stddef.h>
#include <stdbool.h>
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;
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);
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