summaryrefslogtreecommitdiff
path: root/utility/collection.hpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2021-01-31 13:52:55 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2021-02-04 19:29:49 +0000
commit6663bdedd1e21259ebca63d07b6f781c15e476c8 (patch)
tree6b23e4359140dd48d81dde43372e5f06313147d8 /utility/collection.hpp
parentRestructure to allow a resource path and testing (diff)
downloadilt-6663bdedd1e21259ebca63d07b6f781c15e476c8.tar.bz2
ilt-6663bdedd1e21259ebca63d07b6f781c15e476c8.tar.xz
ilt-6663bdedd1e21259ebca63d07b6f781c15e476c8.zip
Collection can be shared/unique pointers
Diffstat (limited to 'utility/collection.hpp')
-rw-r--r--utility/collection.hpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/utility/collection.hpp b/utility/collection.hpp
index 48eae0e..79c331a 100644
--- a/utility/collection.hpp
+++ b/utility/collection.hpp
@@ -3,10 +3,11 @@
#include <algorithm>
#include <memory>
+#include <type_traits>
-template<typename Object> class Collection {
+template<typename Object, bool shared = true> class Collection {
public:
- using Ptr = std::shared_ptr<Object>;
+ using Ptr = std::conditional_t<shared, std::shared_ptr<Object>, std::unique_ptr<Object>>;
using Objects = std::vector<Ptr>;
Objects objects;
@@ -14,9 +15,14 @@ public:
auto
create(Params &&... params)
{
- auto obj = std::make_shared<T>(std::forward<Params>(params)...);
- objects.emplace_back(obj);
- return obj;
+ if constexpr (shared) {
+ auto obj = std::make_shared<T>(std::forward<Params>(params)...);
+ objects.emplace_back(obj);
+ return obj;
+ }
+ else {
+ return static_cast<T *>(objects.emplace_back(std::make_unique<T>(std::forward<Params>(params)...)).get());
+ }
}
template<typename T = Object, typename M = void, typename... Params>