19class [[deprecated (
"Use a pre-filled MPMCQueue instead")]] ObjectPool
23 std::is_default_constructible_v<T>,
24 "T must be default-constructible");
26 ObjectPool (
size_t initial_capacity = 64) { reserve (initial_capacity); }
31 if (available_.pop_front (
object))
33 if constexpr (EnableDebug)
35 num_in_use.fetch_add (1, std::memory_order_relaxed);
40 if (size_ == capacity_)
48 void release (T *
object)
50 available_.push_back (
object);
51 if constexpr (EnableDebug)
53 num_in_use.fetch_add (-1);
57 void reserve (
size_t size)
59 available_.reserve (size);
66 auto get_num_in_use ()
const {
return num_in_use.load (); }
67 auto get_capacity ()
const {
return capacity_.load (); }
68 auto get_size ()
const {
return size_.load (); }
73 std::lock_guard<std::mutex> lock (expand_mutex_);
76 if (size_ == capacity_)
78 size_t old_capacity = capacity_;
83 capacity_.store (capacity_ * 2);
85 buffer_.reserve (capacity_);
87 for (
size_t i = old_capacity; i < capacity_; ++i)
89 buffer_.emplace_back (std::make_unique<T> ());
90 available_.push_back (buffer_.back ().get ());
93 size_.store (capacity_.load ());
97 std::vector<std::unique_ptr<T>> buffer_;
99 std::atomic<size_t> capacity_{ 0 };
100 std::atomic<size_t> size_{ 0 };
101 std::mutex expand_mutex_;
104 std::atomic<size_t> num_in_use;