#include <cstdint>
class PageAllocator {
public:
explicit PageAllocator(std::uint64_t page_size);
void* Allocate();
};
template<typename Tp>
class FixedAllocator {
PageAllocator page_allocator_;
std::uint64_t page_size;
public:
explicit FixedAllocator(std::uint64_t page_size) : page_size(page_size) {}
Tp* Allocate() {
Tp* p;
try {
p = new char[sizeof(Tp) * page_size];
}
catch(...) {
p = reinterpret_cast<Tp*>(page_allocator_.Allocate());
}
return p;
}
void Deallocate(Tp* p) {
delete p;
}
const PageAllocator& InnerAllocator() const noexcept {
return page_allocator_;
}
};