4#ifndef MALENA_MULTICUSTOMFLAGGABLE_H
5#define MALENA_MULTICUSTOMFLAGGABLE_H
8#include <unordered_map>
35 template<
typename Enum>
38 std::unordered_map<Enum, bool, EnumClassHash> _states;
48 bool checkFlag(Enum flag)
const {
auto it = _states.find(flag);
return it != _states.end() && it->second; }
51 void setFlag(Enum flag,
bool value) { _states[flag] = value; }
94 template<
typename... Enums>
136 template<
typename T,
typename =
void>
137 struct extract_TraitManifest {
using type = void; };
140 struct extract_TraitManifest<T, std::void_t<typename T::manifest_type>>
141 {
using type =
typename T::manifest_type; };
148 template<
typename M,
typename =
void>
149 struct extract_ManifestFlags {
using type = void; };
152 struct extract_ManifestFlags<M, std::void_t<typename M::Flag>>
153 {
using type =
typename M::Flag; };
157 template<
typename T,
typename Acc>
158 struct AppendIfNotVoid {
using type = Acc; };
160 template<
typename T,
typename... Acc>
161 struct AppendIfNotVoid<T, std::tuple<Acc...>>
163 using type = std::conditional_t<
166 std::tuple<Acc..., T>
170 template<
typename... Ts>
174 struct FilterVoid<> {
using type = std::tuple<>; };
176 template<
typename T,
typename... Rest>
177 struct FilterVoid<T, Rest...>
179 using type =
typename AppendIfNotVoid<
181 typename FilterVoid<Rest...>::type
185 template<
typename Tuple>
186 struct TupleToMultiFlaggable;
188 template<
typename... Enums>
189 struct TupleToMultiFlaggable<std::tuple<Enums...>>
190 {
using type = MultiCustomFlaggable<Enums...>; };
216 template<
typename ComponentManifest,
typename... Traits>
220 typename extract_ManifestFlags<ComponentManifest>::type,
221 typename extract_ManifestFlags<
222 typename extract_TraitManifest<Traits>::type
226 using type =
typename TupleToMultiFlaggable<AllFlagsTuple>::type;
bool checkFlag(...) const
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.
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