65 _dm { std::move(dm) },
77 _dm { std::move(other._dm) },
81 PooledDataMapper& operator=(PooledDataMapper
const&) =
delete;
82 PooledDataMapper& operator=(PooledDataMapper&&) =
delete;
83 ~PooledDataMapper() noexcept
104 void ReturnToPool() noexcept
106 _pool.Return(std::move(_dm));
110 std::unique_ptr<DataMapper> _dm;
116 void Return(std::unique_ptr<DataMapper> dm)
noexcept
117 requires(Config.growthStrategy == GrowthStrategy::UnboundedGrow)
119 std::scoped_lock lock(_mutex);
120 _idleDataMappers.push_back(std::move(dm));
124 void Return(std::unique_ptr<DataMapper> dm)
noexcept
125 requires(Config.growthStrategy == GrowthStrategy::BoundedWait)
128 std::scoped_lock lock(_mutex);
129 _idleDataMappers.push_back(std::move(dm));
136 void Return(std::unique_ptr<DataMapper> dm)
noexcept
137 requires(Config.growthStrategy == GrowthStrategy::BoundedOverflow)
139 std::scoped_lock lock(_mutex);
140 if (_idleDataMappers.size() < Config.maxSize)
141 _idleDataMappers.push_back(std::move(dm));
149 _idleDataMappers.reserve(Config.initialSize);
150 for ([[maybe_unused]]
auto const _: std::views::iota(0U, Config.initialSize))
151 _idleDataMappers.push_back(std::make_unique<DataMapper>());
160 Pool& operator=(
Pool const&) = delete;
168 requires(Config.growthStrategy == GrowthStrategy::BoundedWait)
170 std::unique_lock lock(_mutex);
171 if (_idleDataMappers.empty())
173 if (_checkedOut >= Config.maxSize)
176 _cv.wait(lock, [
this] {
return !_idleDataMappers.empty(); });
187 auto dm = std::move(_idleDataMappers.back());
188 _idleDataMappers.pop_back();
197 requires(Config.growthStrategy != GrowthStrategy::BoundedWait)
199 std::scoped_lock lock(_mutex);
200 if (_idleDataMappers.empty())
207 auto dm = std::move(_idleDataMappers.back());
208 _idleDataMappers.pop_back();
212#if defined(BUILD_TESTS)
213 [[nodiscard]]
size_t IdleCount() noexcept
215 std::scoped_lock lock(_mutex);
216 return _idleDataMappers.size();
222 std::condition_variable _cv;
223 std::vector<std::unique_ptr<DataMapper>> _idleDataMappers;
224 size_t _checkedOut {};