36 #include "Core/Macro/Macro.h" 50 using DataPointer = uint8_t*;
55 DataPointer base =
nullptr;
59 DataPointer top =
nullptr;
71 uintptr_t AlignAddress(uintptr_t address,
size_t align)
73 const size_t mask = align - 1;
74 MX_ASSERT((align & mask) == 0);
75 return (address + align) & ~mask;
84 uint8_t* AlignPointer(uint8_t* ptr,
size_t align)
86 return reinterpret_cast<uint8_t*
>(AlignAddress((uintptr_t)ptr, align));
100 void Init(DataPointer data,
size_t bytes)
113 : base(data), top(data), size(bytes)
132 [[nodiscard]] DataPointer
RawAlloc(
size_t bytes,
size_t align = 1)
134 MX_ASSERT(this->base !=
nullptr);
136 DataPointer aligned = AlignPointer(this->top, align);
137 aligned[-1] = (uint8_t)(aligned - this->top);
138 this->top = aligned + bytes;
140 MX_ASSERT(this->top <= this->base + this->size);
153 MX_ASSERT(ptr >= this->base && ptr < this->base + this->size);
154 size_t shift = ptr[-1];
155 this->top = ptr - shift;
163 template<
typename T,
typename... Args>
164 [[nodiscard]] T*
Alloc(Args&&... args)
166 DataPointer ptr =
RawAlloc(
sizeof(T),
alignof(T));
167 return new (ptr) T(std::forward<Args>(args)...);
177 template<
typename T,
typename... Args>
180 auto deleter = [
this](T* ptr) { this->
Free(ptr); };
181 using SmartPtr = std::unique_ptr<T, decltype(deleter)>;
182 return SmartPtr(this->Alloc<T>(std::forward<Args>(args)...), std::move(deleter));
195 RawFree(reinterpret_cast<uint8_t*>(ptr));
204 for (
size_t i = 0; i < this->size; i++)
206 out << std::hex << (int)this->base[i];
208 out << std::dec <<
"\n --- dumped " << size <<
" bytes --- \n";
void Init(DataPointer data, size_t bytes)
Definition: StackAllocator.h:100
void Dump(std::ostream &out)
Definition: StackAllocator.h:202
void RawFree(uint8_t *ptr)
Definition: StackAllocator.h:151
void Free(T *ptr)
Definition: StackAllocator.h:192
auto StackAlloc(Args &&... args)
Definition: StackAllocator.h:178
StackAllocator()
Definition: StackAllocator.h:93
DataPointer GetBase()
Definition: StackAllocator.h:121
StackAllocator(DataPointer data, size_t bytes)
Definition: StackAllocator.h:112
Definition: StackAllocator.h:47
DataPointer RawAlloc(size_t bytes, size_t align=1)
Definition: StackAllocator.h:132
T * Alloc(Args &&... args)
Definition: StackAllocator.h:164
Definition: Application.cpp:49