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_; + }; + +}