aboutsummaryrefslogtreecommitdiff
path: root/experimental/lfpAlloc/Pool.hpp
blob: 370dab7ab64fede413388294b26325b4e59c8b5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#ifndef LF_POOL_ALLOC_POOL
#define LF_POOL_ALLOC_POOL

#include <lfpAlloc/Utils.hpp>
#include <lfpAlloc/ChunkList.hpp>

namespace lfpAlloc {
template <std::size_t Size, std::size_t AllocationsPerChunk>
class Pool {
    using ChunkList_t = ChunkList<Size, AllocationsPerChunk>;

public:
    static constexpr auto CellSize =
        (Size > sizeof(void*)) ? Size - sizeof(void*) : 0;
    using Cell_t = Cell<CellSize>;

    Pool() : head_(nullptr) {}

    ~Pool() { ChunkList_t::getInstance().deallocateChain(head_); }

    void* allocate() {
        // Head loaded from head_
        Cell_t* currentHead = head_;
        Cell_t* next;

        // Out of cells to allocate
        if (!currentHead) {
            currentHead = ChunkList_t::getInstance().allocateChain();
        }

        next = currentHead->next_;
        head_ = next;
        return &currentHead->val_;
    }

    void deallocate(void* p) noexcept {
        auto newHead = reinterpret_cast<Cell_t*>(p);
        Cell_t* currentHead = head_;
        newHead->next_ = currentHead;
        head_ = newHead;
    }

private:
    Cell_t* head_;
};
}

#endif