#include <vector>
#include <iostream>

template<typename Tp>
class FixedAllocator {
  PageAllocator page_allocator_;

 public:
  explicit FixedAllocator(std::uint64_t page_size) :
      page_allocator_(PageAllocator(page_size)),
      page_size(page_size) {}

  Tp *Allocate() {
    if (pages.empty()) {
      Tp *tmp1 = static_cast<Tp *>(page_allocator_.Allocate());
      for (uint64_t i = 0 ; i < page_size ; ++i) {
        pages.push_back(++tmp1);
      }
    }
    Tp *tmp2 = pages.back();
    pages.pop_back();
    return tmp2;
  }

  void Deallocate(Tp *p) {
    pages.push_back(p);
  }

  [[nodiscard]] const PageAllocator &InnerAllocator() const noexcept {
    return page_allocator_;
  }

 private:
  std::uint64_t page_size{};
  std::vector<Tp *> pages{};
};