#pragma once
#include <vector>
#include <set>
#include <stack>
template<typename Tp>
class FixedAllocator {
public:
explicit FixedAllocator(std::uint64_t page_size) :
page_allocator_(page_size * sizeof(Tp)), page_size_(page_size) {}
Tp* Allocate() {
if (free_memory_.empty()) {
Tp* free_memory = (Tp*)(page_allocator_.Allocate());
for (uint64_t i = 0; i < page_size_; i++) {
free_memory_.push(free_memory + i);
memory_.insert(free_memory + i);
}
}
Tp* free_memory = free_memory_.top();
free_memory_.pop();
memory_.insert(free_memory);
return free_memory;
}
void Deallocate(Tp* p) {
free_memory_.push(p);
memory_.erase(p);
}
const PageAllocator& InnerAllocator() const noexcept {
return page_allocator_;
}
private:
PageAllocator page_allocator_;
uint64_t page_size_;
std::stack<Tp*> free_memory_;
std::set<Tp*> memory_;
};