Apollo 10.0
自动驾驶开放平台
apollo::cyber::base::ObjectPool< T > 模板类 参考

#include <object_pool.h>

类 apollo::cyber::base::ObjectPool< T > 继承关系图:
apollo::cyber::base::ObjectPool< T > 的协作图:

Public 类型

using InitFunc = std::function< void(T *)>
 
using ObjectPoolPtr = std::shared_ptr< ObjectPool< T > >
 

Public 成员函数

template<typename... Args>
 ObjectPool (uint32_t num_objects, Args &&... args)
 
template<typename... Args>
 ObjectPool (uint32_t num_objects, InitFunc f, Args &&... args)
 
virtual ~ObjectPool ()
 
std::shared_ptr< T > GetObject ()
 

详细描述

template<typename T>
class apollo::cyber::base::ObjectPool< T >

在文件 object_pool.h37 行定义.

成员类型定义说明

◆ InitFunc

template<typename T >
using apollo::cyber::base::ObjectPool< T >::InitFunc = std::function<void(T *)>

在文件 object_pool.h39 行定义.

◆ ObjectPoolPtr

template<typename T >
using apollo::cyber::base::ObjectPool< T >::ObjectPoolPtr = std::shared_ptr<ObjectPool<T> >

在文件 object_pool.h40 行定义.

构造及析构函数说明

◆ ObjectPool() [1/2]

template<typename T >
template<typename... Args>
apollo::cyber::base::ObjectPool< T >::ObjectPool ( uint32_t  num_objects,
Args &&...  args 
)
explicit

在文件 object_pool.h69 行定义.

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();
75 }
76
77 FOR_EACH(i, 0, num_objects_) {
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);
81 }
82}
Definition node.h:31
#define FOR_EACH(i, begin, end)
Definition for_each.h:44

◆ ObjectPool() [2/2]

template<typename T >
template<typename... Args>
apollo::cyber::base::ObjectPool< T >::ObjectPool ( uint32_t  num_objects,
InitFunc  f,
Args &&...  args 
)

在文件 object_pool.h86 行定义.

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();
92 }
93
94 FOR_EACH(i, 0, num_objects_) {
95 T *obj = new (object_arena_ + i * size) T(std::forward<Args>(args)...);
96 f(obj);
97 reinterpret_cast<Node *>(obj)->next = free_head_;
98 free_head_ = reinterpret_cast<Node *>(obj);
99 }
100}
double f

◆ ~ObjectPool()

template<typename T >
apollo::cyber::base::ObjectPool< T >::~ObjectPool ( )
virtual

在文件 object_pool.h103 行定义.

103 {
104 if (object_arena_ != nullptr) {
105 const size_t size = sizeof(Node);
106 FOR_EACH(i, 0, num_objects_) {
107 reinterpret_cast<Node *>(object_arena_ + i * size)->object.~T();
108 }
109 std::free(object_arena_);
110 }
111}

成员函数说明

◆ GetObject()

template<typename T >
std::shared_ptr< T > apollo::cyber::base::ObjectPool< T >::GetObject ( )

在文件 object_pool.h124 行定义.

124 {
125 if (cyber_unlikely(free_head_ == nullptr)) {
126 return nullptr;
127 }
128
129 auto self = this->shared_from_this();
130 auto obj =
131 std::shared_ptr<T>(reinterpret_cast<T *>(free_head_),
132 [self](T *object) { self->ReleaseObject(object); });
133 free_head_ = free_head_->next;
134 return obj;
135}
#define cyber_unlikely(x)
Definition macros.h:30

该类的文档由以下文件生成: