18class [[deprecated (
"Use a pre-filled MPMCQueue instead")]] ObjectPool
22 std::is_default_constructible_v<T>,
23 "T must be default-constructible");
25 ObjectPool (
size_t initial_capacity = 64) { reserve (initial_capacity); }
30 if (available_.pop_front (
object))
32 if constexpr (EnableDebug)
34 num_in_use.fetch_add (1, std::memory_order_relaxed);
39 if (size_ == capacity_)
47 void release (T *
object)
49 available_.push_back (
object);
50 if constexpr (EnableDebug)
52 num_in_use.fetch_add (-1);
56 void reserve (
size_t size)
58 available_.reserve (size);
65 auto get_num_in_use ()
const {
return num_in_use.load (); }
66 auto get_capacity ()
const {
return capacity_.load (); }
67 auto get_size ()
const {
return size_.load (); }
72 std::lock_guard<std::mutex> lock (expand_mutex_);
75 if (size_ == capacity_)
77 size_t old_capacity = capacity_;
82 capacity_.store (capacity_ * 2);
84 buffer_.reserve (capacity_);
86 for (
size_t i = old_capacity; i < capacity_; ++i)
88 buffer_.emplace_back (std::make_unique<T> ());
89 available_.push_back (buffer_.back ().get ());
92 size_.store (capacity_.load ());
96 std::vector<std::unique_ptr<T>> buffer_;
98 std::atomic<size_t> capacity_{ 0 };
99 std::atomic<size_t> size_{ 0 };
100 std::mutex expand_mutex_;
103 std::atomic<size_t> num_in_use;