27 template<
typename... T_>
28 requires ((std::is_base_of_v<T,T_>
29 && !std::is_same_v<Collection<T>,T_>) && ...)
30 Collection(
const T_&... x)
32 (add_shared_ptr(std::make_shared<T_>(x)), ...);
35 template<
typename... T_>
36 requires (std::is_same_v<std::shared_ptr<T>,std::shared_ptr<T_>> && ...)
37 Collection(
const std::shared_ptr<T_>&... x)
39 (add_shared_ptr(x), ...);
42 Collection(
const Collection<T>& c)
44 for(
const auto& ci : c._v)
45 add_shared_ptr(std::dynamic_pointer_cast<T>(ci->copy()));
49 requires std::is_base_of_v<T,T_>
52 add_shared_ptr(std::make_shared<T>(x));
55 void add_shared_ptr(std::shared_ptr<T> shrd_ptr)
58 _v.push_back(shrd_ptr);
59 _v_raw.push_back(shrd_ptr.get());
62 void add_raw_ptr(T *x)
68 using iterator =
typename std::vector<T*>::iterator;
69 using const_iterator =
typename std::vector<T*>::const_iterator;
73 return const_cast<T&
>(
const_cast<const Collection<T>*
>(
this)->front());
76 const T& front()
const
78 assert(!_v_raw.empty());
79 return *_v_raw.front();
84 return const_cast<T&
>(
const_cast<const Collection<T>*
>(
this)->back());
89 assert(!_v_raw.empty());
90 return *_v_raw.back();
95 return const_cast<iterator
>(
const_cast<const Collection<T>*
>(
this)->begin());
98 const_iterator begin()
const
100 return _v_raw.cbegin();
103 const_iterator end()
const
105 return _v_raw.cend();
110 return const_cast<iterator
>(
const_cast<const Collection<T>*
>(
this)->end());
115 std::vector<std::shared_ptr<T>> _v;
116 std::vector<T*> _v_raw;