codac 2.0.0
Loading...
Searching...
No Matches
codac2_Collection.h
Go to the documentation of this file.
1
9
10#pragma once
11
12#include <type_traits>
13#include <cassert>
14#include <vector>
15#include <memory>
16
17namespace codac2
18{
19 template<typename T>
20 class Collection : public std::vector<std::shared_ptr<T>>
21 {
22 public:
23
24 Collection()
25 { }
26
27 template<typename... T_>
28 requires ((!std::is_same_v<Collection<T>,T_>) && ...)
29 Collection(const T_&... x)
30 {
31 (push_back(x), ...);
32 }
33
34 template<typename... T_>
35 requires (std::is_same_v<std::shared_ptr<T>,std::shared_ptr<T_>> && ...)
36 Collection(const std::shared_ptr<T_>&... x)
37 : std::vector<std::shared_ptr<T>>({x...})
38 { }
39
40 Collection(const Collection<T>& c)
41 : std::vector<std::shared_ptr<T>>(c.size())
42 {
43 for(size_t i = 0 ; i < c.size() ; i++)
44 (*this)[i] = std::dynamic_pointer_cast<T>(c[i]->copy());
45 }
46
47 template<typename T_>
48 requires std::is_base_of_v<T,T_>
49 void push_back(const T_& x)
50 {
51 this->push_back(std::make_shared<T_>(x));
52 }
53
54 template<typename T_>
55 requires std::is_base_of_v<T,T_>
56 void push_back(const std::shared_ptr<T_>& x)
57 {
58 this->std::vector<std::shared_ptr<T>>::push_back(x);
59 }
60 };
61}
Definition codac2_OctaSym.h:21