#include <string>
#include <vector>

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

public:
    explicit FixedAllocator(std::uint64_t page_size) {
        size_page = page_size;
        page_allocator_ = new PageAllocator(sizeof(Tp) * page_size);
    }
    Tp* Allocate() {
        if (_free_pool.empty()) {
            Tp* next = dynamic_cast<Tp*>(page_allocator_->Allocate());
            for (uint i = 0; i < _page_size; ++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;
};