#pragma once #include #include #include #include #include namespace pdfengine { class LayoutArena { public: explicit LayoutArena(size_t blockSizeBytes = 65536); ~LayoutArena(); // Disable copy LayoutArena(const LayoutArena&) = delete; LayoutArena& operator=(const LayoutArena&) = delete; // Enable move LayoutArena(LayoutArena&&) noexcept; LayoutArena& operator=(LayoutArena&&) noexcept; template T* allocate(Args&&... args) { void* mem = allocateBytes(sizeof(T), alignof(T)); return ::new (mem) T(std::forward(args)...); } void* allocateBytes(size_t size, size_t alignment = alignof(std::max_align_t)); void clear() noexcept; [[nodiscard]] size_t totalAllocatedBytes() const noexcept; private: struct Chunk { std::unique_ptr data; size_t size = 0; size_t used = 0; }; size_t m_defaultChunkSize = 65536; std::vector m_chunks; size_t m_totalAllocated = 0; }; } // namespace pdfengine