aboutsummaryrefslogtreecommitdiffstats
path: root/code/base/base_arenas.h
blob: 911f2ecf8e04868d421fed2f573438891ae83108 (plain) (blame)
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
/* date = December 6th 2025 2:11 pm */

#if !defined(ARENAS_H)
#define ARENAS_H

typedef struct arena arena;
struct arena
{
    void *Base;
    u64 Pos;
    u64 Size;
};

typedef struct arena_alloc_params arena_alloc_params;
struct arena_alloc_params
{
    u64 DefaultSize;
    u64 Size;
    u64 Offset;
};

#define ArenaAllocDefaultSize MB(64)

#if COMPILER_MSVC
# if LANG_CPP
#  define StructCast(t) t
# elif LANG_C
#  define StructCast(t) (t)
# endif
#else
# define StructCast(t) (t)
#endif

#define ArenaAlloc(...) ArenaAlloc_(StructCast(arena_alloc_params){.DefaultSize = ArenaAllocDefaultSize, ##__VA_ARGS__})
internal arena *ArenaAlloc_(arena_alloc_params Params);
internal void  *ArenaPush(arena *Arena, u64 Size, u64 Alignment, b32 Zero);
internal u64 BeginScratch(arena *Arena);
internal void EndScratch(arena *Arena, u64 BackPos);

#define Scratch(Arena) for(u64 _J_ = BeginScratch((Arena)), _I_ = 0; !_I_; _I_ += 1, (EndScratch(Arena, _J_)))

#define PushArray(Arena, t, Count) (t *)ArenaPush((Arena), (Count)*(sizeof(t)), AlignOf(t), false)
#define PushStruct(Arena, t) PushArray(Arena, t, 1)
#define PushArrayZero(Arena, t, Count) (t *)ArenaPush((Arena), (Count)*(sizeof(t)), AlignOf(t), true)
#define PushStructZero(Arena, t) PushArrayZero(Arena, t, 1)

#endif //ARENAS_H