aboutsummaryrefslogtreecommitdiff
path: root/lib/arena.h
blob: 7535f8a41f37fccaa4a36718678d89cd99f56685 (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
// 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_append(a, da, item)												\
    do {																			\
        if ((da)->len >= (da)->cap) {												\
            size_t new_cap = (da)->cap == 0 ? ARENA_DA_INIT_CAP : (da)->cap*2;		\
            (da)->data = arena_realloc(												\
                (a), (da)->data,													\
                (da)->cap*sizeof(*(da)->data),										\
                new_cap*sizeof(*(da)->data));										\
            (da)->cap = new_cap;													\
        }																			\
																					\
        (da)->data[(da)->len++] = (item);											\
    } while (0)

#endif //ARENA_H_