summaryrefslogtreecommitdiff
path: root/base/base_arena.h
blob: 19c4f3d2f0361b931e4056ea7ca66490f9b5ec33 (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
#ifndef ARENA_H
#define ARENA_H

#include "base.h"

/**
 * Arena Helper macro's
 * */

#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define ALIGN_UP_POW2(n, p) (((u64)(n) + ((u64)(p) - 1)) & (~((u64)(p) - 1)))

#define PUSH_STRUCT(arena, T) (T *)arena_push((arena), sizeof(T), 0)
#define PUSH_STRUCT_NZ(arena, T) (T *)arena_push((arena), sizeof(T), 1)
#define PUSH_ARRAY(arena, T, n) (T *)arena_push((arena), sizeof(T) * (n), 0)
#define PUSH_ARRAY_NZ(arena, T, n) (T *)arena_push((arena), sizeof(T) * (n), 1)

#define ARENA_BASE_POS (sizeof(mem_arena))
#define ARENA_ALIGN (sizeof(void *))

typedef struct mem_arena mem_arena;

struct mem_arena
{
  u64 capacity;
  u64 pos;
};

local_internal mem_arena *
arena_create(u64 capacity);

local_internal void
arena_destroy(mem_arena *arena);

local_internal void *
arena_push(mem_arena *arena, u64 size, b32 non_zero);

local_internal void
arena_pop(mem_arena *arena, u64 size);

local_internal void
arena_pop_to(mem_arena *arena, u64 pos);

local_internal void
arena_clear(mem_arena *arena);


#endif