#pragma once

#include <iostream>
#include <vector>

template <typename Tp>
class FixedAllocator {
 public:
  explicit FixedAllocator(std::uint64_t page_size)
      : p_a_(page_size), page_s_(page_size) {}
  Tp* Allocate() {
    if (v_.empty()) {
      Tp* temp;
      temp = static_cast<Tp*>(p_a_.Allocate());
      for (size_t i = 0; i < page_s_; i++) {
        temp += i;
        v_.push_back(temp);
      }
    }
    auto tempp = v_.end();
    Tp* aaa = v_[v_.size() - 1];
    v_.erase(tempp - 1);
    return aaa;
  }
  void Deallocate(Tp* p) { v_.push_back(p); }
  const PageAllocator& InnerAllocator() const noexcept { return p_a_; }

 private:
  PageAllocator p_a_;
  std::vector<Tp*> v_;
  size_t page_s_;
};