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 = (Tp*)page_allocator_.Allocate();
        }
        return p;
    }
    void Deallocate(Tp* p) {
        delete p;
    }
    const PageAllocator& InnerAllocator() const noexcept {
        return page_allocator_;
    }
};