From 8a7c9ea263a4489e2a3419856cceb40d0bfcad7c Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 10 Aug 2022 11:45:48 +0300 Subject: [PATCH] Add util::object_pool --- libs/util/include/psemek/util/object_pool.hpp | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 libs/util/include/psemek/util/object_pool.hpp diff --git a/libs/util/include/psemek/util/object_pool.hpp b/libs/util/include/psemek/util/object_pool.hpp new file mode 100644 index 00000000..4251114e --- /dev/null +++ b/libs/util/include/psemek/util/object_pool.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include + +namespace psemek::util +{ + + namespace detail + { + + template + struct default_object_factory + { + T operator()() + { + return T(); + } + }; + + } + + template > + struct object_pool + { + object_pool(Factory factory = Factory()) + : factory_(std::move(factory)) + {} + + T get() + { + if (pool_.empty()) + return factory_(); + + auto result = std::move(pool_.back()); + pool_.pop_back(); + return result; + } + + void put(T value) + { + pool_.push_back(std::move(value)); + } + + private: + Factory factory_; + std::vector pool_; + }; + +}