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
56
57
58
59
60
61
62
63
64
65
|
// Most of the code is from https://github.com/tsoding/arena
#ifndef ARENA_H_
#define ARENA_H_
#include <stdlib.h>
#include <stddef.h>
#include <stdint.h>
#include <assert.h>
#include <string.h>
typedef struct region region;
struct region {
region *next;
size_t cap;
size_t len;
uintptr_t data[];
};
typedef struct {
region *beg;
region *end;
size_t region_cap;
} arena;
arena arena_init_cap(size_t cap);
void *arena_alloc(arena *a, size_t size);
void arena_free(arena *a);
void *arena_realloc(arena *a, void *oldptr, size_t oldsz, size_t newsz);
#define new(a, t, c) (t *)arena_alloc(a, sizeof(t)*c)
#define ARENA_REGION_DEFAULT_CAPACITY (8*1024)
#define ARENA_DA_INIT_CAP (2)
#define arena_da_reserve(a, da, expected_size) \
do { \
if ((expected_size) >= (da)->cap) { \
size_t new_cap = (da)->cap == 0 ? ARENA_DA_INIT_CAP : (da)->cap*2; \
while (new_cap < expected_size) { \
new_cap *= 2; \
} \
(da)->data = arena_realloc( \
(a), (da)->data, \
(da)->cap*sizeof(*(da)->data), \
new_cap*sizeof(*(da)->data)); \
(da)->cap = new_cap; \
} \
} while (0)
#define arena_da_append(a, da, item) \
do { \
arena_da_reserve((a), (da), (da)->len + 1); \
(da)->data[(da)->len++] = (item); \
} while (0)
#define arena_da_append_many(a, da, items, items_len) \
do { \
arena_da_reserve((a), (da), (da)->len+len); \
memcpy((da)->data+(da)->len, (items), sizeof(*(da)->data)*items_len); \
(da)->len += len; \
} while (0)
#endif //ARENA_H_
|