class ObjdectPool
{
public:
using DelType = std::function<void(T *)>;
void add(std::unique_ptr<T> t)
{
m_pool.push_back(std::move(t));
}
std::shared_ptr<T> get()
{
std::lock_guard<std::mutex> lock_g(this->mtx_);
if (m_pool.empty())
{
throw std::logic_error("no object");
}
std::unique_ptr<T, DelType> s_ptr(m_pool.back().release(), [=](T *t) {
std::lock_guard<std::mutex> lock_d(this->mtx_);
m_pool.push_back(std::unique_ptr<T>(t));
});
std::shared_ptr<T> ptr = std::move(s_ptr);
m_pool.pop_back();
return ptr;
}
bool empty() const {
return m_pool.empty();
}
int size() const {
return m_pool.size();
}
private:
std::vector<std::unique_ptr<T>> m_pool;
std::mutex mtx_;
};