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
|