SDEngine
Game Engine
Loading...
Searching...
No Matches
arena.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <type_traits>
4
5#include <sys/mman.h>
6
7#include "../../../build/release-unity/SD/generated/SD/export.hpp"
8#include "core/base.hpp"
9#include "core/types.hpp"
10
11template<typename T>
12FORCE_INLINE T constexpr align_pow2(T x, T b) {
13 return (x + b - 1) & ~(b - 1);
14}
15
16consteval U64 kb(U64 n) {
17 return n << 10;
18}
19consteval U64 mb(U64 n) {
20 return n << 20;
21}
22consteval U64 gb(U64 n) {
23 return n << 30;
24}
25consteval U64 tb(U64 n) {
26 return n << 40;
27}
28
29template<typename T>
30FORCE_INLINE T constexpr min(T a, T b) {
31 return a < b ? a : b;
32}
33
34template<typename T>
35FORCE_INLINE T constexpr max(T a, T b) {
36 return a > b ? a : b;
37}
38
39template<typename T>
40FORCE_INLINE T constexpr clamp_top(T a, T x) {
41 return min(a, x);
42}
43template<typename T>
44FORCE_INLINE T constexpr clamp_bot(T x, T b) {
45 return max(x, b);
46}
47
48template<typename T>
49FORCE_INLINE T constexpr clamp(T a, T x, T b) {
50 if (x < a) {
51 return a;
52 }
53 if (x > b) {
54 return b;
55 }
56 return x;
57}
58
59
60enum class ArenaFlags : U64 {
61 NONE = 0,
62 NO_CHAIN = (1 << 0),
63 LARGE_PAGES = (1 << 1),
64};
66
75
76
77struct Arena;
78struct Temp {
81
82 void end(this Temp temp);
83};
84
85struct SD_EXPORT Arena {
96 const char* name;
97
98 void* push(this Arena& arena, U64 size, U64 align, bool zero);
99 U64 pos(this Arena& arena);
100 void pop_to(this Arena& arena, U64 pos);
101 void clear(this Arena& arena);
102 void pop(this Arena& arena, U64 amount);
103
104 [[nodiscard]] Temp temp_begin(this Arena& arena);
105
106 //~ helpers
107 template<typename T>
108 T* push_array_no_zero_aligned(this Arena& arena, U64 count, U64 align) {
109 return static_cast<T*>(arena.push(sizeof(T) * count, align, false));
110 }
111 template<typename T>
112 T* push_array_aligned(this Arena& arena, U64 count, U64 align) {
113 return static_cast<T*>(arena.push(sizeof(T) * count, align, true));
114 }
115 template<typename T>
116 T* push_array_no_zero(this Arena& arena, U64 count) {
117 return arena.push_array_no_zero_aligned<T>(count, max(8uz, alignof(T)));
118 }
119 template<typename T>
120 T* push_array(this Arena& arena, U64 count) {
121 return arena.push_array_aligned<T>(count, max(8uz, alignof(T)));
122 }
123};
124
125template<typename T>
126T* arena_push(Arena* arena) {
127 return arena->push_array<T>(1);
128}
129template<typename T>
131 return arena->push_array_no_zero<T>(1);
132}
133
134SD_EXPORT Arena* arena_alloc(ArenaParams params = {});
135SD_EXPORT void arena_release(Arena* arena);
FORCE_INLINE T constexpr align_pow2(T x, T b)
Definition arena.hpp:12
T * arena_push(Arena *arena)
Definition arena.hpp:126
ArenaFlags
Definition arena.hpp:60
SD_EXPORT Arena * arena_alloc(ArenaParams params={})
Definition arena.cpp:91
FORCE_INLINE T constexpr clamp_bot(T x, T b)
Definition arena.hpp:44
consteval U64 mb(U64 n)
Definition arena.hpp:19
T * arena_push_no_zero(Arena *arena)
Definition arena.hpp:130
consteval U64 gb(U64 n)
Definition arena.hpp:22
FORCE_INLINE T constexpr clamp(T a, T x, T b)
Definition arena.hpp:49
FORCE_INLINE T constexpr min(T a, T b)
Definition arena.hpp:30
consteval U64 tb(U64 n)
Definition arena.hpp:25
consteval U64 kb(U64 n)
Definition arena.hpp:16
FORCE_INLINE T constexpr clamp_top(T a, T x)
Definition arena.hpp:40
SD_EXPORT void arena_release(Arena *arena)
Definition arena.cpp:142
FORCE_INLINE T constexpr max(T a, T b)
Definition arena.hpp:35
#define BITMASK_ENUM(Type)
Definition base.hpp:42
Definition arena.hpp:67
ArenaFlags flags
Definition arena.hpp:68
sd::SourceLocation location
Definition arena.hpp:72
void * optional_backing_buffer
Definition arena.hpp:71
U64 reserve_size
Definition arena.hpp:69
U64 commit_size
Definition arena.hpp:70
const char * name
Definition arena.hpp:73
Definition arena.hpp:85
T * push_array(this Arena &arena, U64 count)
Definition arena.hpp:120
void * push(this Arena &arena, U64 size, U64 align, bool zero)
Definition arena.cpp:150
U64 position
Definition arena.hpp:92
T * push_array_no_zero(this Arena &arena, U64 count)
Definition arena.hpp:116
U64 reserved
Definition arena.hpp:94
U64 reserve_size
Definition arena.hpp:90
U64 commit_size
Definition arena.hpp:89
sd::SourceLocation location
Definition arena.hpp:95
ArenaFlags flags
Definition arena.hpp:88
T * push_array_no_zero_aligned(this Arena &arena, U64 count, U64 align)
Definition arena.hpp:108
Arena * current
Definition arena.hpp:87
U64 committed
Definition arena.hpp:93
T * push_array_aligned(this Arena &arena, U64 count, U64 align)
Definition arena.hpp:112
Arena * prev
Definition arena.hpp:86
U64 base_position
Definition arena.hpp:91
const char * name
Definition arena.hpp:96
Definition arena.hpp:78
Arena * arena
Definition arena.hpp:79
void end(this Temp temp)
Definition arena.cpp:260
U64 pos
Definition arena.hpp:80
Definition base.hpp:148
static consteval SourceLocation current(const char *file=__builtin_FILE(), unsigned line=__builtin_LINE())
Definition base.hpp:152
std::uint64_t U64
Definition types.hpp:16