From 7935895480b74fb9fe02e5f26a82265a72604d77 Mon Sep 17 00:00:00 2001 From: fschildt Date: Fri, 17 Oct 2025 12:03:56 +0200 Subject: add arena allocator --- src/common/Arena.hpp | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/common/Arena.hpp (limited to 'src/common') diff --git a/src/common/Arena.hpp b/src/common/Arena.hpp new file mode 100644 index 0000000..b5e1eb7 --- /dev/null +++ b/src/common/Arena.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include +#include +#include + +#include + + +class Arena { +public: + Arena(size_t size) : buffer(size) + { + } + + template + size_t + Align() const + { + size_t alignment = alignof(T); + return (offset + alignment - 1) & ~(alignment - 1); + } + + template + T& + Allocate(Args&&... args) + { + offset = Align(); + assert(offset + sizeof(T) <= buffer.size() && "Arena out of memory"); + + T* ptr = new (&buffer[offset]) T(std::forward(args)...); + objects.emplace_back(ptr, [](void* p) { static_cast(p)->~T(); }); + + offset += sizeof(T); + return *ptr; + } + + void + Reset() + { + for (auto& [ptr, dtor] : objects) { + dtor(ptr); + } + objects.clear(); + offset = 0; + } + + + size_t offset = 0; + std::vector buffer; + std::vector> objects; +}; + -- cgit v1.2.3