1#ifndef MULTICUSTOMFLAGGABLE_H
2#define MULTICUSTOMFLAGGABLE_H
4#include <unordered_map>
31 template<
typename Enum>
34 std::unordered_map<Enum, bool, EnumClassHash> _states;
44 bool checkFlag(Enum flag)
const {
auto it = _states.find(flag);
return it != _states.end() && it->second; }
47 void setFlag(Enum flag,
bool value) { _states[flag] = value; }
89 template<
typename... Enums>
135 template<
typename T,
typename =
void>
136 struct extract_TraitManifest {
using type = void; };
139 struct extract_TraitManifest<T, std::void_t<typename T::manifest_type>>
140 {
using type =
typename T::manifest_type; };
147 template<
typename M,
typename =
void>
148 struct extract_ManifestFlags {
using type = void; };
151 struct extract_ManifestFlags<M, std::void_t<typename M::Flag>>
152 {
using type =
typename M::Flag; };
156 template<
typename T,
typename Acc>
157 struct AppendIfNotVoid {
using type = Acc; };
159 template<
typename T,
typename... Acc>
160 struct AppendIfNotVoid<T, std::tuple<Acc...>>
162 using type = std::conditional_t<
165 std::tuple<Acc..., T>
169 template<
typename... Ts>
173 struct FilterVoid<> {
using type = std::tuple<>; };
175 template<
typename T,
typename... Rest>
176 struct FilterVoid<T, Rest...>
178 using type =
typename AppendIfNotVoid<
180 typename FilterVoid<Rest...>::type
184 template<
typename Tuple>
185 struct TupleToMultiFlaggable;
187 template<
typename... Enums>
188 struct TupleToMultiFlaggable<std::tuple<Enums...>>
189 {
using type = MultiCustomFlaggable<Enums...>; };
215 template<
typename ComponentManifest,
typename... Traits>
219 typename extract_ManifestFlags<ComponentManifest>::type,
220 typename extract_ManifestFlags<
221 typename extract_TraitManifest<Traits>::type
225 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