#include <string>

template<typename Tp>
class FixedAllocator {
    PageAllocator* page_allocator_;

 public:
    explicit FixedAllocator(std::uint64_t size_page) {
        size_page = size_page;
        page_allocator_ = new PageAllocator(sizeof(Tp) * size_page);
    }
    Tp* Allocate() {
        if (_free_pool.empty()) {
            Tp* next = dynamic_cast<Tp*>(page_allocator_->Allocate());
            for (uint i = 0; i < size_page; ++i) {
                _free_pool.emplace_back(&next[i]);
            }
        }
        auto rval = _free_pool.back();
        _free_pool.pop_back();
        return rval;
    }
    void Deallocate(Tp* p) {
        _free_pool.emplace_back(p);
    }
    const PageAllocator& InnerAllocator() const noexcept {
        return *page_allocator_;
    }
    ~FixedAllocator() {
        delete (page_allocator_);
    }

 private:
    std::uint64_t size_page;
    std::vector<Tp*> _free_pool;
};