#include <string>
#include <vector>
template<typename Tp>
class FixedAllocator {
PageAllocator* page_allocator_;
public:
explicit FixedAllocator(std::uint64_t page_size) {
size_page = page_size;
page_allocator_ = new PageAllocator(sizeof(Tp) * page_size);
}
Tp* Allocate() {
if (_free_pool.empty()) {
Tp* next = dynamic_cast<Tp*>(page_allocator_->Allocate());
for (uint 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_;
}
~FixedAllocator() {
delete (page_allocator_);
}
private:
std::uint64_t size_page;
std::vector<Tp*> _free_pool;
};