diff --git a/src/include/marr.h b/src/include/marr.h new file mode 100644 index 0000000..6f82073 --- /dev/null +++ b/src/include/marr.h @@ -0,0 +1,43 @@ +#ifndef _H_MARR +#define _H_MARR + +#include + +#define MARR_DEFAULT_CAP 32 + +typedef struct marr_da_s { + void* data; + size_t cap; + size_t len; + size_t stride; +} marr_da_t; + +marr_da_t* _marr_new(size_t stride, size_t cap); +int _marr_push_front(marr_da_t* da, void* val); +int _marr_push_back(marr_da_t* da, void* val); +int _marr_pop_front(marr_da_t* da, void* dest); +int _marr_pop_back(marr_da_t* da, void* dest); +int _marr_append(marr_da_t* to, marr_da_t* from); +int _marr_resize(marr_da_t* da, size_t new_cap); +int _marr_remove(marr_da_t* da, size_t idx); +bool _marr_contains(marr_da_t* da, void* val); +bool _marr_map(marr_da_t* da, marr_da_t* da_out, bool (*func)(void* item, void* data), void* data); + +#define marr_new(type) (type*)_marr_new(sizeof(type), MARR_DEFAULT_CAP); +#define marr_new_with_capacity(type, cap) (type*)_marr_new(sizeof(type), cap); +#define marr_push_front(da, val) _marr_push_front((marr_da_t)da, val); +#define marr_push_back(da, val) _marr_push_back((marr_da_t)da, val); +#define marr_pop_front(da, dest) _marr_pop_front((marr_da_t)da, dest); +#define marr_pop_back(da, dest) _marr_pop_back((marr_da_t)da, dest); +#define marr_append(to, from) _marr_append((marr_da_t)to, (marr_da_t)from); +#define marr_resize(da, new_size) _marr_resize((marr_da_t)da, new_size); +#define marr_remove(da, idx) _marr_remove((marr_da_t)da, idx); +#define marr_contains(da, val) _marr_contains((marr_da_t)da, val); +#define marr_map(da, da_out, fnc, data) _marr_map((marr_da_t)da, (marr_da_t)da_out, fnc, data); + +#define marr_len(da) (((marr_da_t*)(da))->len) +#define marr_cap(da) (((marr_da_t*)(da))->cap) +#define marr_stride(da) (((marr_da_t*)(da))->stride) +#define marr_as_ptr(type, da) (type*)(((marr_da_t*)(da))->data) + +#endif // !_H_MARR diff --git a/src/marr.c b/src/marr.c new file mode 100644 index 0000000..e2b587a --- /dev/null +++ b/src/marr.c @@ -0,0 +1,35 @@ +#include +#include + +marr_da_t* _marr_new(size_t stride, size_t cap) { + marr_da_t* da = malloc(sizeof(marr_da_t)); + da->data = malloc(stride * cap); + if (!da->data) { + return NULL; + } + da->cap = cap; + da->len = 0; + return da; +} + +int _marr_push_front(marr_da_t* da, void* val) {} + +int _marr_push_back(marr_da_t* da, void* val); +int _marr_pop_front(marr_da_t* da, void* dest); +int _marr_pop_back(marr_da_t* da, void* dest); +int _marr_append(marr_da_t* to, marr_da_t* from); + +int _marr_resize(marr_da_t* da, size_t new_cap) { + if (new_cap <= da->cap) { + return 1; + } + da->data = realloc(da->data, new_cap * da->stride); + if (!da->data) { + return 1; + } + return 0; +} + +int _marr_remove(marr_da_t* da, size_t idx); +bool _marr_contains(marr_da_t* da, void* val); +bool _marr_map(marr_da_t* da, marr_da_t* da_out, bool (*func)(void* item, void* data), void* data);