Loading...
Searching...
No Matches
MultiCustomFlaggable.h
Go to the documentation of this file.
1// Copyright (c) 2025 Dave R. Smith. All rights reserved.
2// Malena Framework — Proprietary Software. See LICENSE for terms.
3
4#ifndef MALENA_MULTICUSTOMFLAGGABLE_H
5#define MALENA_MULTICUSTOMFLAGGABLE_H
6
8#include <unordered_map>
9#include <tuple>
10#include <type_traits>
12
13namespace ml
14{
15 // =========================================================================
16 // SingleFlaggable
17 // =========================================================================
18
35 template<typename Enum>
37 {
38 std::unordered_map<Enum, bool, EnumClassHash> _states;
39
40 public:
42 void enableFlag(Enum flag) { _states[flag] = true; }
43
45 void disableFlag(Enum flag) { _states[flag] = false; }
46
48 bool checkFlag(Enum flag) const { auto it = _states.find(flag); return it != _states.end() && it->second; }
49
51 void setFlag(Enum flag, bool value) { _states[flag] = value; }
52
54 void toggleFlag(Enum flag) { _states[flag] = !checkFlag(flag); }
55 };
56
57 // =========================================================================
58 // MultiCustomFlaggable
59 // =========================================================================
60
94 template<typename... Enums>
95 class MultiCustomFlaggable : public SingleFlaggable<Enums>...
96 {
97 public:
98 using SingleFlaggable<Enums>::enableFlag...;
99 using SingleFlaggable<Enums>::disableFlag...;
100 using SingleFlaggable<Enums>::checkFlag...;
101 using SingleFlaggable<Enums>::setFlag...;
102 using SingleFlaggable<Enums>::toggleFlag...;
103 };
104
113 template<>
115 {
116 public:
117 void enableFlag(...) {}
118 void disableFlag(...) {}
119 bool checkFlag(...) const { return false; }
120 void setFlag(...) {}
121 void toggleFlag(...) {}
122 };
123
124 // =========================================================================
125 // Trait manifest detection helpers
126 // =========================================================================
127
129
136 template<typename T, typename = void>
137 struct extract_TraitManifest { using type = void; };
138
139 template<typename T>
140 struct extract_TraitManifest<T, std::void_t<typename T::manifest_type>>
141 { using type = typename T::manifest_type; };
142
148 template<typename M, typename = void>
149 struct extract_ManifestFlags { using type = void; };
150
151 template<typename M>
152 struct extract_ManifestFlags<M, std::void_t<typename M::Flag>>
153 { using type = typename M::Flag; };
154
155 // ── Void filtering ────────────────────────────────────────────────────────
156
157 template<typename T, typename Acc>
158 struct AppendIfNotVoid { using type = Acc; };
159
160 template<typename T, typename... Acc>
161 struct AppendIfNotVoid<T, std::tuple<Acc...>>
162 {
163 using type = std::conditional_t<
164 std::is_void_v<T>,
165 std::tuple<Acc...>,
166 std::tuple<Acc..., T>
167 >;
168 };
169
170 template<typename... Ts>
171 struct FilterVoid;
172
173 template<>
174 struct FilterVoid<> { using type = std::tuple<>; };
175
176 template<typename T, typename... Rest>
177 struct FilterVoid<T, Rest...>
178 {
179 using type = typename AppendIfNotVoid<
180 T,
181 typename FilterVoid<Rest...>::type
182 >::type;
183 };
184
185 template<typename Tuple>
186 struct TupleToMultiFlaggable;
187
188 template<typename... Enums>
189 struct TupleToMultiFlaggable<std::tuple<Enums...>>
190 { using type = MultiCustomFlaggable<Enums...>; };
191
193
194 // =========================================================================
195 // GatherFlags
196 // =========================================================================
197
216 template<typename ComponentManifest, typename... Traits>
218 {
219 using AllFlagsTuple = typename FilterVoid<
220 typename extract_ManifestFlags<ComponentManifest>::type,
221 typename extract_ManifestFlags<
222 typename extract_TraitManifest<Traits>::type
223 >::type...
224 >::type;
225
226 using type = typename TupleToMultiFlaggable<AllFlagsTuple>::type;
227 };
228
229} // namespace ml
230
231#endif // MALENA_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:22
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