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
|
#ifndef BASE_ARENA_H
#define BASE_ARENA_H
//- arena
typedef struct MemArena MemArena;
typedef struct ScratchArena ScratchArena;
struct MemArena
{
u64 current_position;
u64 previous_position;
u64 capacity;
u8 *base_position;
};
struct ScratchArena
{
MemArena *arena;
u64 start_position;
};
//-
#if defined(PLATFORM_UNIX)
#define ArenaCreate(capacity) unix_arena_create(capacity)
#define ArenaDestroy(arena) unix_arena_destroy(arena)
#elif defined(PLATFORM_WINDOWS)
#define ArenaCreate(capacity) win32_arena_create(capacity)
#define ArenaDestroy(arena) win32_arena_destroy(arena)
#endif
internal void *arena_alloc(MemArena *arena, u64 size, b32 zero);
internal void arena_pop(MemArena *arena, u64 size);
internal void arena_pop_to(MemArena *arena, u64 pos);
internal void arena_clear(MemArena *arena);
internal ScratchArena scratch_start(MemArena *arena);
internal void scratch_end(ScratchArena *temp);
internal MemArena *arena_resize_align(MemArena *arena, void *old_memory, u64 new_size, u64 old_size, umm alignment);
internal MemArena *arena_resize(MemArena *arena, void *old_memory, u64 new_size, u64 old_size);
#define Align(pointer, alignment) align((u64)(pointer), (umm)(alignment))
#define PushStruct(arena, type) (type *)arena_alloc((arena), sizeof(type), 0)
#define PushStructZero(arena, type) (type *)arena_alloc((arena), sizeof(type), 1)
#define PushArray(arena, type, len) (type *)arena_alloc((arena), sizeof(type) * (len), 0)
#define PushArrayZero(arena, type, len) (type *)arena_alloc((arena), sizeof(type) * (len), 1)
#define KiB(n) (((u64)(n)) << 10)
#define MiB(n) (((u64)(n)) << 20)
#define GiB(n) (((u64)(n)) << 30)
internal b32 is_pow(umm x);
internal u64 align(u64 pointer, umm alignment);
#endif /* BASE_ARENA_H */
|