27#define PERCEPTION_BASE_DISABLE_POOL
32static const size_t kPoolDefaultExtendNum = 10;
33static const size_t kPoolDefaultSize = 100;
41template <
class ObjectType,
size_t N = kPoolDefaultSize,
42 class Initializer = ObjectPoolDefaultInitializer<ObjectType>>
53 std::shared_ptr<ObjectType>
Get()
override {
55#ifndef PERCEPTION_BASE_DISABLE_POOL
58 std::lock_guard<std::mutex> lock(
mutex_);
60 Add(1 + kPoolDefaultExtendNum);
68 return std::shared_ptr<ObjectType>(ptr, [&](
ObjectType* obj_ptr) {
69 std::lock_guard<std::mutex> lock(
mutex_);
73 return std::shared_ptr<ObjectType>(
new ObjectType);
80 std::vector<std::shared_ptr<ObjectType>>* data)
override {
81#ifndef PERCEPTION_BASE_DISABLE_POOL
82 std::vector<ObjectType*> buffer(num,
nullptr);
84 std::lock_guard<std::mutex> lock(
mutex_);
86 Add(num -
queue_.size() + kPoolDefaultExtendNum);
88 for (
size_t i = 0; i < num; ++i) {
89 buffer[i] =
queue_.front();
95 for (
size_t i = 0; i < num; ++i) {
98 std::shared_ptr<ObjectType>(buffer[i], [&](
ObjectType* obj_ptr) {
99 std::lock_guard<std::mutex> lock(
mutex_);
104 for (
size_t i = 0; i < num; ++i) {
114 std::list<std::shared_ptr<ObjectType>>* data)
override {
115#ifndef PERCEPTION_BASE_DISABLE_POOL
116 std::vector<ObjectType*> buffer(num,
nullptr);
118 std::lock_guard<std::mutex> lock(
mutex_);
119 if (
queue_.size() < num) {
120 Add(num -
queue_.size() + kPoolDefaultExtendNum);
122 for (
size_t i = 0; i < num; ++i) {
123 buffer[i] =
queue_.front();
129 for (
size_t i = 0; i < num; ++i) {
131 is_front ? data->emplace_front(std::shared_ptr<ObjectType>(
134 std::lock_guard<std::mutex> lock(
mutex_);
137 : data->emplace_back(std::shared_ptr<ObjectType>(
139 std::lock_guard<std::mutex> lock(
mutex_);
144 for (
size_t i = 0; i < num; ++i) {
145 is_front ? data->emplace_front(
new ObjectType)
155 std::deque<std::shared_ptr<ObjectType>>* data)
override {
156#ifndef PERCEPTION_BASE_DISABLE_POOL
157 std::vector<ObjectType*> buffer(num,
nullptr);
159 std::lock_guard<std::mutex> lock(
mutex_);
160 if (
queue_.size() < num) {
161 Add(num -
queue_.size() + kPoolDefaultExtendNum);
163 for (
size_t i = 0; i < num; ++i) {
164 buffer[i] =
queue_.front();
168 for (
size_t i = 0; i < num; ++i) {
170 is_front ? data->emplace_front(std::shared_ptr<ObjectType>(
173 std::lock_guard<std::mutex> lock(
mutex_);
176 : data->emplace_back(std::shared_ptr<ObjectType>(
178 std::lock_guard<std::mutex> lock(
mutex_);
183 for (
size_t i = 0; i < num; ++i) {
184 is_front ? data->emplace_front(
new ObjectType)
189#ifndef PERCEPTION_BASE_DISABLE_POOL
192 std::lock_guard<std::mutex> lock(
mutex_);
214#ifndef PERCEPTION_BASE_DISABLE_POOL
215 void Add(
size_t num) {
216 for (
size_t i = 0; i < num; ++i) {
227#ifndef PERCEPTION_BASE_DISABLE_POOL
virtual void set_capacity(size_t capacity)
virtual size_t RemainedNum()
std::list< ObjectType * > extended_cache_
ConcurrentObjectPool(const size_t default_size)
void BatchGet(size_t num, bool is_front, std::list< std::shared_ptr< ObjectType > > *data) override
void BatchGet(size_t num, std::vector< std::shared_ptr< ObjectType > > *data) override
std::queue< ObjectType * > queue_
static ConcurrentObjectPool & Instance()
const size_t kDefaultCacheSize
~ConcurrentObjectPool() override
void BatchGet(size_t num, bool is_front, std::deque< std::shared_ptr< ObjectType > > *data) override
static const Initializer kInitializer
std::shared_ptr< ObjectType > Get() override
void operator()(T *t) const