MARR lib started

This commit is contained in:
Gvidas Juknevičius 2025-07-08 22:33:42 +03:00
parent 23d7e86c2c
commit cf6b35e7f8
Signed by: MCorange
GPG Key ID: 5BE6B533CB76FE86
2 changed files with 78 additions and 0 deletions

43
src/include/marr.h Normal file
View File

@ -0,0 +1,43 @@
#ifndef _H_MARR
#define _H_MARR
#include <stddef.h>
#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

35
src/marr.c Normal file
View File

@ -0,0 +1,35 @@
#include <marr.h>
#include <stdlib.h>
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);