smgl 0.11.0
Structured Metadata Engine and Graph Objects Library
Loading...
Searching...
No Matches
FactoryImpl.hpp
1namespace smgl
2{
3namespace policy
4{
5
6template <class I, class P>
8 const I& unknownId)
9 : unknownId_{unknownId}
10{
11}
12
13template <class I, class P>
15{
16 return "Unknown object type passed to Factory";
17}
18
19template <class I, class P>
24
25template <class I, class P>
30} // namespace policy
31
32namespace detail
33{
34
35template <
36 class B,
37 typename I,
38 class A,
39 typename P,
40 template <typename, class>
41 class E>
43{
44 typeToIDMap_.reserve(count);
45 idToCreatorMap_.reserve(count);
46}
47
48template <
49 class B,
50 typename I,
51 class A,
52 typename P,
53 template <typename, class>
54 class E>
56{
57 typeToIDMap_.reserve(count + typeToIDMap_.size());
58 idToCreatorMap_.reserve(count + idToCreatorMap_.size());
59}
60
61template <
62 class B,
63 typename I,
64 class A,
65 typename P,
66 template <typename, class>
67 class E>
69 const I& id, P creator, const std::type_info& info)
70{
71 auto res = idToCreatorMap_.insert({id, creator}).second;
72 if (res) {
73 res = typeToIDMap_.insert({info.hash_code(), id}).second;
74 if (not res) {
75 idToCreatorMap_.erase(id);
76 }
77 }
78 return res;
79}
80
81template <
82 class B,
83 typename I,
84 class A,
85 typename P,
86 template <typename, class>
87 class E>
89{
90 // emulate std::erase_if from C++20
91 auto oldSize = typeToIDMap_.size();
92 for (auto it = typeToIDMap_.begin(), last = typeToIDMap_.end();
93 it != last;) {
94 if (it->second == id) {
95 it = typeToIDMap_.erase(it);
96 } else {
97 ++it;
98 }
99 }
100 auto cnt = oldSize - typeToIDMap_.size();
101 return cnt == 1 and idToCreatorMap_.erase(id) == 1;
102}
103
104template <
105 class B,
106 typename I,
107 class A,
108 typename P,
109 template <typename, class>
110 class E>
112{
113 auto it = idToCreatorMap_.find(id);
114 if (it != idToCreatorMap_.end()) {
115 return (it->second)();
116 }
117 return this->OnUnknownType(id);
118}
119template <
120 class B,
121 typename I,
122 class A,
123 typename P,
124 template <typename, class>
125 class E>
127{
128 auto it = typeToIDMap_.find(info.hash_code());
129 if (it != typeToIDMap_.end()) {
130 return it->second;
131 }
132 return this->OnUnnamedType(info);
133}
134
135template <
136 class B,
137 typename I,
138 class A,
139 typename P,
140 template <typename, class>
141 class E>
143{
144 std::vector<I> keys;
145 for (const auto& t : idToCreatorMap_) {
146 keys.push_back(t.first);
147 }
148 return keys;
149}
150
151template <
152 class B,
153 typename I,
154 class A,
155 typename P,
156 template <typename, class>
157 class E>
159{
160 return idToCreatorMap_.find(id) != idToCreatorMap_.end();
161}
162
163template <
164 class B,
165 typename I,
166 class A,
167 typename P,
168 template <typename, class>
169 class E>
171{
172 return typeToIDMap_.find(info.hash_code()) != typeToIDMap_.end();
173}
174
175} // namespace detail
176} // namespace smgl
Abstract Factory class.
Definition Factory.hpp:74
IdentifierType IDType
Definition Factory.hpp:77
Default exception thrown when registered type not found.
Definition Factory.hpp:19
Default factory error policy.
Definition Factory.hpp:15
static IdentifierType OnUnnamedType(const std::type_info &info)
static ProductType OnUnknownType(const IdentifierType &id)
T hash_code(T... args)
T name(T... args)
Project top-level namespace.
T push_back(T... args)