#include <vector>
#include <string>


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

 public:
  explicit FixedAllocator(std::uint64_t page_size) {
    _page_size = page_size;
    page_allocator_ = new PageAllocator(sizeof(Tp) * page_size);
  }
  Tp *Allocate() {
    if (_free_pool.empty()) {
      Tp *next = static_cast<Tp *>(page_allocator_->Allocate());
      for (int 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_;
  }
 private:
  std::uint64_t _page_size;
  std::vector<Tp *> _free_pool;
};