FCT
载入中...
搜索中...
未找到
ObjectPool.h
浏览该文件的文档.
1//
2// Created by Administrator on 2025/5/8.
3//
4#ifndef OBJECTPOOL_H
5#define OBJECTPOOL_H
8namespace FCT
9{
10 constexpr size_t SingleChunkObjectNums = 1024;
11 template<typename T>
13 {
14 public:
19 ObjectPoolChunk(const ObjectPoolChunk& other) = delete;
21 : m_size(other.m_size), m_objects(other.m_objects)
22 {
23 other.m_objects = nullptr;
24 other.m_size = 0;
25 }
27 {
28 if (m_objects)
29 {
30 clear();
32 }
33 }
34 template<typename... Args>
35 T* addSingle(size_t index,Args... args)
36 {
37 m_size = index + 1;
38 return New<T>(m_objects + index,
39 std::forward<Args>(args)...);
40 }
41 T* addSingle(size_t index)
42 {
43 m_size = index + 1;
44 return New<T>(m_objects + index);
45 }
46 T* get(size_t index) const
47 {
48 return m_objects + index;
49 }
50 void clear()
51 {
52 if (m_objects)
53 {
54 for (size_t i = 0; i < m_size; ++i)
55 {
56 Destroy(m_objects + i);
57 }
58 m_size = 0;
59 }
60 }
61 protected:
62 size_t m_size;
64 };
65 template<typename T, typename... Args>
67 {
68 public:
69 using DestroyCallback = std::function<void(T*)>;
70 explicit ObjectPool(Args... args) :
71 m_size(0),
72 m_destroyCallback(nullptr),
73 m_constructorArgs(std::forward<Args>(args)...)
74 {
75
76 }
78 {
79
80 }
81 T* alloc()
82 {
83 size_t index;
84 if (m_freeIndices.pop(index))
85 {
86
87 return m_chunks[index / SingleChunkObjectNums].get(index % SingleChunkObjectNums);
88 }
89 else
90 {
91 return addSingle();
92 }
93 }
95 {
96 m_destroyCallback = std::move(callback);
97 }
98 protected:
100 {
101 T* ret;
103 {
104 ret = std::apply([this](auto&&... args)
105 {
107 .addSingle(m_size % SingleChunkObjectNums,
108 std::forward<decltype(args)>(args)...);
110 } else
111 {
112 m_chunks.emplace_back();
113 ret = std::apply([this](auto&&... args)
114 {
115 return m_chunks.back()
116 .addSingle(m_size % SingleChunkObjectNums,
117 std::forward<decltype(args)>(args)...);
119 }
121 {
123 {
124 size_t index = m_size;
125 ret->setDeleter([this,index](T* ptr)
126 {
128 m_freeIndices.push(index);
129 });
130 }
131 } else
132 {
133 //不应该出现这个 分支
134 }
135 m_size++;
136 return ret;
137 }
138 size_t m_size;
139 std::vector<ObjectPoolChunk<T>> m_chunks;
140 boost::lockfree::queue<size_t,boost::lockfree::capacity<1024>> m_freeIndices;
142 std::tuple<Args...> m_constructorArgs;
143 };
144}
145#endif //OBJECTPOOL_H
T * addSingle(size_t index, Args... args)
ObjectPoolChunk(const ObjectPoolChunk &other)=delete
T * addSingle(size_t index)
T * get(size_t index) const
ObjectPoolChunk(ObjectPoolChunk &&other) noexcept
std::vector< ObjectPoolChunk< T > > m_chunks
void setDestroyCallback(DestroyCallback callback)
ObjectPool(Args... args)
boost::lockfree::queue< size_t, boost::lockfree::capacity< 1024 > > m_freeIndices
std::tuple< Args... > m_constructorArgs
std::function< void(T *)> DestroyCallback
DestroyCallback m_destroyCallback
constexpr size_t SingleChunkObjectNums
T * New(T *ptr)
T * AllocatorNew(size_t size)
void AllocatorDelete(T *ptr)
void Destroy(T *ptr)