17#ifndef CYBER_BASE_OBJECT_POOL_H_
18#define CYBER_BASE_OBJECT_POOL_H_
37class ObjectPool :
public std::enable_shared_from_this<ObjectPool<T>> {
42 template <
typename... Args>
43 explicit ObjectPool(uint32_t num_objects, Args &&... args);
45 template <
typename... Args>
60 void ReleaseObject(T *);
62 uint32_t num_objects_ = 0;
63 char *object_arena_ =
nullptr;
64 Node *free_head_ =
nullptr;
68template <
typename... Args>
70 : num_objects_(num_objects) {
71 const size_t size =
sizeof(Node);
72 object_arena_ =
static_cast<char *
>(std::calloc(num_objects_, size));
73 if (object_arena_ ==
nullptr) {
74 throw std::bad_alloc();
78 T *obj =
new (object_arena_ + i * size) T(std::forward<Args>(args)...);
79 reinterpret_cast<Node *
>(obj)->next = free_head_;
80 free_head_ =
reinterpret_cast<Node *
>(obj);
85template <
typename... Args>
87 : num_objects_(num_objects) {
88 const size_t size =
sizeof(Node);
89 object_arena_ =
static_cast<char *
>(std::calloc(num_objects_, size));
90 if (object_arena_ ==
nullptr) {
91 throw std::bad_alloc();
95 T *obj =
new (object_arena_ + i * size) T(std::forward<Args>(args)...);
97 reinterpret_cast<Node *
>(obj)->next = free_head_;
98 free_head_ =
reinterpret_cast<Node *
>(obj);
104 if (object_arena_ !=
nullptr) {
105 const size_t size =
sizeof(Node);
107 reinterpret_cast<Node *
>(object_arena_ + i * size)->
object.~T();
109 std::free(object_arena_);
119 reinterpret_cast<Node *
>(object)->next = free_head_;
120 free_head_ =
reinterpret_cast<Node *
>(object);
129 auto self = this->shared_from_this();
131 std::shared_ptr<T>(
reinterpret_cast<T *
>(free_head_),
132 [self](T *
object) { self->ReleaseObject(
object); });
133 free_head_ = free_head_->next;
Node is the fundamental building block of Cyber RT.
std::shared_ptr< ObjectPool< T > > ObjectPoolPtr
ObjectPool(uint32_t num_objects, Args &&... args)
std::function< void(T *)> InitFunc
std::shared_ptr< T > GetObject()
#define cyber_unlikely(x)
#define FOR_EACH(i, begin, end)