61 lines
1.7 KiB
C
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
|