Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- template<typename Tp>
- class FixedAllocator {
- PageAllocator page_allocator_;
- std::vector<Tp*> freemem_, usedmem_;
- const std::uint64_t pages;
- public:
- explicit FixedAllocator(std::uint64_t page_size) :
- page_allocator_(page_size * sizeof(Tp)),
- freemem_(), usedmem_(), pages(page_size){
- Tp* p = reinterpret_cast<Tp*>(page_allocator_.Allocate());
- freemem_.push_back(p);
- for (std::uint64_t i = 0; i < page_size - 1; i++) {
- p++;
- freemem_.push_back(p);
- }
- }
- Tp* Allocate() {
- Tp* p;
- if (freemem_.empty()) {
- Tp* pp = reinterpret_cast<Tp*>(page_allocator_.Allocate());
- freemem_.push_back(pp);
- for (std::uint64_t i = 0; i < pages - 1; i++) {
- pp++;
- freemem_.push_back(pp);
- }
- }
- p = freemem_[freemem_.size() - 1];
- freemem_.pop_back();
- usedmem_.push_back(p);
- return p;
- }
- void Deallocate(Tp* p) {
- freemem_.push_back(p);
- for (std::uint64_t i = 0; i < usedmem_.size(); i++) {
- if (usedmem_[i] == p) {
- usedmem_.erase(usedmem_.begin() + i);
- }
- }
- }
- const PageAllocator& InnerAllocator() const noexcept {
- return page_allocator_;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement