17 #ifndef CYBER_BASE_OBJECT_POOL_H_ 18 #define CYBER_BASE_OBJECT_POOL_H_ 37 class 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;
68 template <
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);
85 template <
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);
102 template <
typename T>
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_);
113 template <
typename T>
119 reinterpret_cast<Node *
>(object)->next = free_head_;
120 free_head_ =
reinterpret_cast<Node *
>(object);
123 template <
typename T>
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;
141 #endif // CYBER_BASE_OBJECT_POOL_H_ ObjectPool(uint32_t num_objects, Args &&... args)
Definition: object_pool.h:69
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
virtual ~ObjectPool()
Definition: object_pool.h:103
std::shared_ptr< T > GetObject()
Definition: object_pool.h:124
#define FOR_EACH(i, begin, end)
Definition: for_each.h:44
std::function< void(T *)> InitFunc
Definition: object_pool.h:39
std::shared_ptr< ObjectPool< T > > ObjectPoolPtr
Definition: object_pool.h:40
Definition: object_pool.h:37
#define cyber_unlikely(x)
Definition: macros.h:28