1
0
Fork 0
mirror of https://github.com/bjornbytes/lovr.git synced 2024-07-02 12:33:52 +00:00
lovr/src/core/arr.h
2019-12-10 12:19:50 -08:00

44 lines
972 B
C

#include <stddef.h>
#pragma once
#define arr_t(T)\
struct { T* data; size_t length, capacity; }
#define arr_init(a)\
(a)->data = NULL,\
(a)->length = 0,\
(a)->capacity = 0
#define arr_free(a)\
free((a)->data)
#define arr_reserve(a, n)\
n > (a)->capacity ?\
_arr_reserve((void**) &((a)->data), n, &(a)->capacity, sizeof(*(a)->data)) :\
(void) 0
#define arr_expand(a, n)\
arr_reserve(a, (a)->length + n)
#define arr_push(a, x)\
arr_reserve(a, (a)->length + 1),\
(a)->data[(a)->length++] = x
#define arr_pop(a)\
(a)->data[--(a)->length]
#define arr_append(a, p, n)\
arr_reserve(a, (a)->length + n),\
memcpy((a)->data + (a)->length, p, n * sizeof(*(p))),\
(a)->length += n
#define arr_splice(a, i, n)\
memmove((a)->data + (i), (a)->data + ((i) + n), ((a)->length - (n)) * sizeof(*(a)->data)),\
(a)->length -= n
#define arr_clear(a)\
(a)->length = 0
void _arr_reserve(void** data, size_t n, size_t* capacity, size_t stride);