morph/src/include/dynarray.h

61 lines
1.7 KiB
C

// Taken from https://github.com/eignnx/dynarray
#ifndef _H_DYNARRAY
#define _H_DYNARRAY
#include <stddef.h>
#include <stdlib.h> // malloc
#include <string.h> // memcpy
/* Structure of a dynarray:
* size_t capacity
* size_t length
* size_t stride
* void *memory
*/
enum { CAPACITY, LENGTH, STRIDE, DYNARRAY_FIELDS };
typedef struct da_debug_s {
size_t capacity;
size_t length;
size_t stride;
void* data;
} da_debug_t;
void* _dynarray_create(size_t length, size_t stride);
void _dynarray_destroy(void* arr);
size_t _dynarray_field_get(void* arr, size_t field);
void _dynarray_field_set(void* arr, size_t field, size_t value);
void* _dynarray_resize(void* arr);
void* _dynarray_push(void* arr, void* xptr);
// OK = 0; ERR = 1
int _dynarray_pop(void* arr, void* dest);
void* _dynarray_reverse(void* arr);
#define DYNARRAY_DEFAULT_CAP 1
#define DYNARRAY_RESIZE_FACTOR 2
#define dynarray_create(type) _dynarray_create(DYNARRAY_DEFAULT_CAP, sizeof(type))
#define dynarray_create_prealloc(type, capacity) _dynarray_create(capacity, sizeof(type))
#define dynarray_destroy(arr) _dynarray_destroy(arr)
#define dynarray_push(arr, x) arr = _dynarray_push(arr, &x)
#define dynarray_push_rval(arr, x) \
do { \
__auto_type temp = x; \
arr = _dynarray_push(arr, &temp); \
} while (0)
#define dynarray_pop(arr, xptr) _dynarray_pop(arr, xptr)
#define dynarray_reverse(arr) _dynarray_reverse(arr)
#define dynarray_capacity(arr) _dynarray_field_get(arr, CAPACITY)
#define dynarray_length(arr) _dynarray_field_get(arr, LENGTH)
#define dynarray_stride(arr) _dynarray_field_get(arr, STRIDE)
#endif // _H_DYNARRAY