#pragma once #include #include template class FixedAllocator { public: explicit FixedAllocator(std::uint64_t page_size) : page_size_(page_size), page_allocator_(PageAllocator(sizeof(Tp) * page_size_)) { } Tp *Allocate() { Tp *page; if (free_.size() == 0) { page = static_cast(page_allocator_.Allocate()); for (std::uint64_t i = 0; i < page_size_; i++) { free_.push_back(page+i); } } page = free_.front(); free_.erase(free_.begin()); return page; } void Deallocate(Tp *p) { free_.push_back(p); } const PageAllocator &InnerAllocator() const noexcept { return page_allocator_; } private: PageAllocator page_allocator_; const std::uint64_t page_size_; std::vector free_; };