summaryrefslogtreecommitdiff
path: root/dynarr.h
blob: 2041b9792e4d0997802625a947e0508a1acbd5e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#ifndef DYNARR_H
#define DYNARR_H

#include <stdlib.h>
#include <stdbit.h>
#include <stdio.h>

#include "arena.h"
#include "wrmr.h"

typedef struct {
	u32 len, cap;
	void *data;
} DynArrHdr;

#define DYNARR(t) struct { u32 len, cap; t *data; }

#define DA_INIT_CAP 32

#define DA_FIT(da, c)\
	((TYPEOF((da)->data))da_fit((DynArrHdr*)(da), c, sizeof(*(da)->data)))

#define DA_GROW(da, n) DA_FIT(da, (da)->len + n)
#define DA_PUSH(da, ...) (DA_GROW(da, 1)[(da)->len++] = (__VA_ARGS__))

#define DA_AFIT(da, a, c)\
	((TYPEOF((da)->data))da_afit(\
		(DynArrHdr*)(da), a, c,\
		sizeof(*(da)->data),\
		_Alignof(TYPEOF(*(da)->data))\
	))

#define DA_AGROW(da, a, n) DA_AFIT(da, a, (da)->len + n)
#define DA_APUSH(da, a, ...) (DA_AGROW(da, a, 1)[(da)->len++] = (__VA_ARGS__))

static inline void *da_fit(DynArrHdr *da, u32 n, u32 sz) {
	u32 c = stdc_bit_ceil(n);
	void *p = realloc(da->data, c * sz);
	if (!p) {
		fprintf(stderr, "dynamic array resize failure\n");
		abort();
	}
	da->cap = c;
	da->data = p;
	return p;
}

static inline void *da_afit(DynArrHdr *da, Arena *a, u32 n, u32 sz, u32 align) {
	u32 c = stdc_bit_ceil(n);
	da->data = arena_realloc(a, da->data, da->cap * sz, c * sz, align); 
	da->cap = c;
	return da->data;
}

#endif