#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;
};