#include <vector>
#include <iostream>
template<typename Tp>
class FixedAllocator {
PageAllocator page_allocator_;
public:
explicit FixedAllocator(std::uint64_t page_size) :
page_allocator_(PageAllocator(page_size)),
page_size(page_size) {}
Tp *Allocate() {
if (pages.empty()) {
Tp *tmp1 = static_cast<Tp *>(page_allocator_.Allocate());
for (uint64_t i = 0 ; i < page_size ; ++i) {
pages.push_back(++tmp1);
}
}
Tp *tmp2 = pages.back();
pages.pop_back();
return tmp2;
}
void Deallocate(Tp *p) {
pages.push_back(p);
}
[[nodiscard]] const PageAllocator &InnerAllocator() const noexcept {
return page_allocator_;
}
private:
std::uint64_t page_size{};
std::vector<Tp *> pages{};
};