#pragma once #include template class FixedAllocator { private: PageAllocator page_allocator_; Tp *page; std::vector pool; std::uint64_t page_size_; size_t pos{}; public: explicit FixedAllocator(std::uint64_t page_size) : page_allocator_(page_size), page_size_(page_size) { page = (Tp *)page_allocator_.Allocate(); } Tp *Allocate() { if (pool.empty()) { if (page_size_ <= pos) { pos = 0; page = (Tp *)page_allocator_.Allocate(); } pos++; return page + pos - 1; } Tp* r = pool[pool.size() - 1]; pool.pop_back(); return r; } void Deallocate(Tp *p) { pool.emplace_back(p); } [[nodiscard]] const PageAllocator &InnerAllocator() const noexcept { return page_allocator_; } };