Advertisement
sve_vash

Untitled

Nov 21st, 2019
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.24 KB | None | 0 0
  1. #include <vector>
  2. template<typename Tp>
  3. class FixedAllocator {
  4. PageAllocator page_allocator_;
  5. std::vector<Tp*> freemem_, usedmem_;
  6. const std::uint64_t pages;
  7.  
  8. public:
  9. explicit FixedAllocator(std::uint64_t page_size) :
  10. page_allocator_(page_size * sizeof(Tp)),
  11. freemem_(), usedmem_(), pages(page_size){
  12. Tp* p = reinterpret_cast<Tp*>(page_allocator_.Allocate());
  13. freemem_.push_back(p);
  14. for (std::uint64_t i = 0; i < page_size - 1; i++) {
  15. p++;
  16. freemem_.push_back(p);
  17. }
  18. }
  19.  
  20. Tp* Allocate() {
  21. Tp* p;
  22. if (freemem_.empty()) {
  23. Tp* pp = reinterpret_cast<Tp*>(page_allocator_.Allocate());
  24. freemem_.push_back(pp);
  25. for (std::uint64_t i = 0; i < pages - 1; i++) {
  26. pp++;
  27. freemem_.push_back(pp);
  28. }
  29. }
  30.  
  31. p = freemem_[freemem_.size() - 1];
  32. freemem_.pop_back();
  33. usedmem_.push_back(p);
  34. return p;
  35. }
  36.  
  37. void Deallocate(Tp* p) {
  38. freemem_.push_back(p);
  39. for (std::uint64_t i = 0; i < usedmem_.size(); i++) {
  40. if (usedmem_[i] == p) {
  41. usedmem_.erase(usedmem_.begin() + i);
  42. }
  43. }
  44. }
  45.  
  46. const PageAllocator& InnerAllocator() const noexcept {
  47. return page_allocator_;
  48. }
  49. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement