#pragma once

Add #include <vector>

template<typename Tp>
class FixedAllocator {
    PageAllocator page_allocator_;

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

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

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

    const PageAllocator &InnerAllocator() const noexcept {
        return this->page_allocator_;
    }
    
 private:
    std::uint64_t page_size{};
    std::vector<Tp *> pages{};
};