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 - 1) & ~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 this->top = aligned + bytes;
139 MX_ASSERT(this->top <= this->base + this->size);
149 template<
typename T,
typename... Args>
150 [[nodiscard]] T*
Alloc(Args&&... args)
152 DataPointer ptr =
RawAlloc(
sizeof(T),
alignof(T));
153 return new (ptr) T(std::forward<Args>(args)...);
172 template<
typename T,
typename... Args>
175 constexpr
static auto deleter = [](T* ptr) { ptr->~T(); };
176 using SmartPtr = std::unique_ptr<T, decltype(deleter)>;
177 return SmartPtr(this->Alloc<T>(std::forward<Args>(args)...), deleter);
186 for (
size_t i = 0; i < this->size; i++)
188 out << std::hex << (int)this->base[i];
190 out << std::dec <<
"\n --- dumped " << size <<
" bytes --- \n";
void Free(T *value)
Definition: LinearAllocator.h:162
Definition: LinearAllocator.h:47
auto StackAlloc(Args &&... args)
Definition: LinearAllocator.h:173
LinearAllocator()
Definition: LinearAllocator.h:93
void Init(DataPointer data, size_t bytes)
Definition: LinearAllocator.h:100
void Dump(std::ostream &out)
Definition: LinearAllocator.h:184
LinearAllocator(DataPointer data, size_t bytes)
Definition: LinearAllocator.h:112
DataPointer GetBase()
Definition: LinearAllocator.h:121
DataPointer RawAlloc(size_t bytes, size_t align=1)
Definition: LinearAllocator.h:132
T * Alloc(Args &&... args)
Definition: LinearAllocator.h:150
Definition: Application.cpp:49