COROIO: coroio/arena.hpp Source File
COROIO
Loading...
Searching...
No Matches
arena.hpp
1#pragma once
2
3#include <stack>
4
5namespace NNet {
6
26template<typename T, size_t PoolSize = 1024>
27class TArenaAllocator {
28public:
29 TArenaAllocator() {
30 AllocatePool();
31 }
32
33 ~TArenaAllocator() {
34 for (auto block : Pools_) {
35 ::operator delete(block, std::align_val_t(alignof(T)));
36 }
37 }
38
39 void* Allocate() {
40 if (FreePages_.empty()) {
41 AllocatePool();
42 }
43 ++AllocatedObjects_;
44 void* ret = FreePages_.top();
45 FreePages_.pop();
46 return ret;
47 }
48
49 void Deallocate(void* obj) {
50 --AllocatedObjects_;
51 FreePages_.push(obj);
52 }
53
54 int Count() const {
55 return AllocatedObjects_;
56 }
57
58private:
59 void AllocatePool() {
60 char* pool = static_cast<char*>(::operator new(PoolSize * sizeof(T), std::align_val_t(alignof(T))));
61 Pools_.emplace_back(pool);
62 for (size_t i = 0; i < PoolSize; i++) {
63 FreePages_.push(&pool[i * sizeof(T)]);
64 }
65 }
66
67 std::vector<char*> Pools_;
68 std::stack<void*, std::vector<void*>> FreePages_;
69 int AllocatedObjects_ = 0;
70};
71
72} // namespace NNet