#ifndef COLLECTION_H #define COLLECTION_H #include #include #include template class Collection { public: using Ptr = std::conditional_t, std::unique_ptr>; using Objects = std::vector; Objects objects; template auto create(Params &&... params) { if constexpr (shared) { auto obj = std::make_shared(std::forward(params)...); objects.emplace_back(obj); return obj; } else { return static_cast(objects.emplace_back(std::make_unique(std::forward(params)...)).get()); } } template auto apply(const M & m, Params &&... params) const { return std::count_if(objects.begin(), objects.end(), [&m, ¶ms...](auto && op) { if (auto o = dynamic_cast(op.get())) { std::invoke(m, o, std::forward(params)...); return true; } return false; }); } template auto applyOne(const M & m, Params &&... params) const { return std::find_if(objects.begin(), objects.end(), [&m, ¶ms...](auto && op) { if (auto o = dynamic_cast(op.get())) { return std::invoke(m, o, std::forward(params)...); } return false; }); } template void removeAll() { objects.erase(std::remove_if(objects.begin(), objects.end(), [](auto && op) { return dynamic_cast(op.get()); }), objects.end()); } auto end() const { return objects.end(); } }; #endif