4#ifndef MALENA_MULTICUSTOMFLAGGABLE_H
5#define MALENA_MULTICUSTOMFLAGGABLE_H
8#include <unordered_map>
36 template<
typename Enum>
39 std::unordered_map<Enum, bool, EnumClassHash> _states;
49 bool checkFlag(Enum flag)
const {
auto it = _states.find(flag);
return it != _states.end() && it->second; }
52 void setFlag(Enum flag,
bool value) { _states[flag] = value; }
95 template<
typename... Enums>
136 template<
typename M,
typename =
void>
137 struct extract_ManifestFlags {
using type = void; };
140 struct extract_ManifestFlags<M, std::void_t<typename M::Flag>>
141 {
using type =
typename M::Flag; };
145 template<
typename T,
typename Acc>
146 struct AppendIfNotVoid {
using type = Acc; };
148 template<
typename T,
typename... Acc>
149 struct AppendIfNotVoid<T, std::tuple<Acc...>>
151 using type = std::conditional_t<
154 std::tuple<Acc..., T>
158 template<
typename... Ts>
162 struct FilterVoid<> {
using type = std::tuple<>; };
164 template<
typename T,
typename... Rest>
165 struct FilterVoid<T, Rest...>
167 using type =
typename AppendIfNotVoid<
169 typename FilterVoid<Rest...>::type
173 template<
typename Tuple>
174 struct TupleToMultiFlaggable;
176 template<
typename... Enums>
177 struct TupleToMultiFlaggable<std::tuple<Enums...>>
178 {
using type = MultiCustomFlaggable<Enums...>; };
204 template<
typename ComponentManifest,
typename... Traits>
208 typename extract_ManifestFlags<ComponentManifest>::type,
209 typename extract_ManifestFlags<
210 typename extract_TraitManifest<Traits>::type
214 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