CPPX 2.1.0
A Modern C++ Utility Library
Loading...
Searching...
No Matches
node_pool.tpp
Go to the documentation of this file.
1#pragma once
2#include "../include/cppx.h"
3
4namespace stl_ext
5{
6
7template <typename T> NodePool<T>::~NodePool()
8{
9 destroy_all();
10}
11
12template <typename T>
14 : m_blocks(std::move(other.m_blocks)), m_free_list(std::move(other.m_free_list))
15{
16 other.m_blocks.clear();
17 other.m_free_list.clear();
18}
19
20template <typename T> NodePool<T> &NodePool<T>::operator=(NodePool &&other) noexcept
21{
22 if (this != &other)
23 {
24 destroy_all();
25 m_blocks = std::move(other.m_blocks);
26 m_free_list = std::move(other.m_free_list);
27 other.m_blocks.clear();
28 other.m_free_list.clear();
29 }
30 return *this;
31}
32
33template <typename T> template <typename... Args> Node<T> *NodePool<T>::allocate(Args &&...args)
34{
35 void *ptr = get_slot();
36 return new (ptr) Node<T>(std::forward<Args>(args)...);
37}
38
39template <typename T> void NodePool<T>::deallocate(Node<T> *node)
40{
41 if (!node)
42 return;
43 node->~Node();
44 m_free_list.push_back(static_cast<void *>(node));
45}
46
47template <typename T> void NodePool<T>::destroy_all()
48{
49 for (auto *blk : m_blocks)
50 delete blk;
51 m_blocks.clear();
52 m_free_list.clear();
53}
54
55template <typename T> void *NodePool<T>::get_slot()
56{
57 if (!m_free_list.empty())
58 {
59 void *ptr = m_free_list.back();
60 m_free_list.pop_back();
61 return ptr;
62 }
63 if (m_blocks.empty() || m_blocks.back()->used >= Block::CAPACITY)
64 {
65 m_blocks.push_back(new Block());
66 }
67 auto &blk = *m_blocks.back();
68 void *ptr = blk.data + blk.used * sizeof(Node<T>);
69 ++blk.used;
70 return ptr;
71}
72
73} // namespace stl_ext
NodePool()=default
void deallocate(Node< T > *node)
Definition node_pool.tpp:39
NodePool & operator=(const NodePool &)=delete
Node< T > * allocate(Args &&...args)
Definition node_pool.tpp:33
Definition cppx.h:17