Loading...
Searching...
No Matches
MultiCustomFlaggable.h
Go to the documentation of this file.
1#ifndef MULTICUSTOMFLAGGABLE_H
2#define MULTICUSTOMFLAGGABLE_H
3
4#include <unordered_map>
5#include <tuple>
6#include <type_traits>
8
9namespace ml
10{
11 // =========================================================================
12 // SingleFlaggable
13 // =========================================================================
14
31 template<typename Enum>
33 {
34 std::unordered_map<Enum, bool, EnumClassHash> _states;
35
36 public:
38 void enableFlag(Enum flag) { _states[flag] = true; }
39
41 void disableFlag(Enum flag) { _states[flag] = false; }
42
44 bool checkFlag(Enum flag) const { auto it = _states.find(flag); return it != _states.end() && it->second; }
45
47 void setFlag(Enum flag, bool value) { _states[flag] = value; }
48
50 void toggleFlag(Enum flag) { _states[flag] = !checkFlag(flag); }
51 };
52
53 // =========================================================================
54 // MultiCustomFlaggable
55 // =========================================================================
56
89 template<typename... Enums>
94 class MultiCustomFlaggable : public SingleFlaggable<Enums>...
95 {
96 public:
97 using SingleFlaggable<Enums>::enableFlag...;
98 using SingleFlaggable<Enums>::disableFlag...;
99 using SingleFlaggable<Enums>::checkFlag...;
100 using SingleFlaggable<Enums>::setFlag...;
101 using SingleFlaggable<Enums>::toggleFlag...;
102 };
103
112 template<>
114 {
115 public:
116 void enableFlag(...) {}
117 void disableFlag(...) {}
118 bool checkFlag(...) const { return false; }
119 void setFlag(...) {}
120 void toggleFlag(...) {}
121 };
122
123 // =========================================================================
124 // Trait manifest detection helpers
125 // =========================================================================
126
128
135 template<typename T, typename = void>
136 struct extract_TraitManifest { using type = void; };
137
138 template<typename T>
139 struct extract_TraitManifest<T, std::void_t<typename T::manifest_type>>
140 { using type = typename T::manifest_type; };
141
147 template<typename M, typename = void>
148 struct extract_ManifestFlags { using type = void; };
149
150 template<typename M>
151 struct extract_ManifestFlags<M, std::void_t<typename M::Flag>>
152 { using type = typename M::Flag; };
153
154 // ── Void filtering ────────────────────────────────────────────────────────
155
156 template<typename T, typename Acc>
157 struct AppendIfNotVoid { using type = Acc; };
158
159 template<typename T, typename... Acc>
160 struct AppendIfNotVoid<T, std::tuple<Acc...>>
161 {
162 using type = std::conditional_t<
163 std::is_void_v<T>,
164 std::tuple<Acc...>,
165 std::tuple<Acc..., T>
166 >;
167 };
168
169 template<typename... Ts>
170 struct FilterVoid;
171
172 template<>
173 struct FilterVoid<> { using type = std::tuple<>; };
174
175 template<typename T, typename... Rest>
176 struct FilterVoid<T, Rest...>
177 {
178 using type = typename AppendIfNotVoid<
179 T,
180 typename FilterVoid<Rest...>::type
181 >::type;
182 };
183
184 template<typename Tuple>
185 struct TupleToMultiFlaggable;
186
187 template<typename... Enums>
188 struct TupleToMultiFlaggable<std::tuple<Enums...>>
189 { using type = MultiCustomFlaggable<Enums...>; };
190
192
193 // =========================================================================
194 // GatherFlags
195 // =========================================================================
196
215 template<typename ComponentManifest, typename... Traits>
217 {
218 using AllFlagsTuple = typename FilterVoid<
219 typename extract_ManifestFlags<ComponentManifest>::type,
220 typename extract_ManifestFlags<
221 typename extract_TraitManifest<Traits>::type
222 >::type...
223 >::type;
224
225 using type = typename TupleToMultiFlaggable<AllFlagsTuple>::type;
226 };
227
228} // namespace ml
229
230#endif // MULTICUSTOMFLAGGABLE_H
Aggregates flag stores for multiple enum types into one class.
Flag store for a single enum type.
void setFlag(Enum flag, bool value)
Set flag to an explicit value.
void toggleFlag(Enum flag)
Flip flag between true and false.
bool checkFlag(Enum flag) const
Return true if flag is set, false if unset or never written.
void disableFlag(Enum flag)
Set flag to false.
void enableFlag(Enum flag)
Set flag to true.
Definition Component.h:18
Collects all Flag enums from a component manifest and its traits.
typename TupleToMultiFlaggable< AllFlagsTuple >::type type
typename FilterVoid< typename extract_ManifestFlags< ComponentManifest >::type, typename extract_ManifestFlags< typename extract_TraitManifest< Traits >::type >::type... >::type AllFlagsTuple