From c68183d9d641cd5ca7f2e7194ab9b1a842d024fa Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 8 Jan 2022 19:18:04 +0100 Subject: [PATCH] Base: [skip ci] add class Flags --- src/Base/Bitmask.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/Base/Bitmask.h b/src/Base/Bitmask.h index d4732ca418..9cdcf6d5af 100644 --- a/src/Base/Bitmask.h +++ b/src/Base/Bitmask.h @@ -20,6 +20,10 @@ * * ***************************************************************************/ + +#ifndef BASE_BITMASK_H +#define BASE_BITMASK_H + #include /*! @@ -33,6 +37,10 @@ ENABLE_BITMASK_OPERATORS(Color) Color yellow = Color::Red | Color::Green; + + Flags flags(yellow); + flags.testFlag(Color::Red); + flags.testFlag(Color::Green); @endcode */ @@ -95,3 +103,24 @@ constexpr enum_traits<>::t operator^=(T& a, T b) { template<> \ struct enum_traits : \ enum_traits<>::allow_bitops {}; + +namespace Base { +template +class Flags { + static_assert(std::is_enum::value, "Flags is only usable on enumeration types."); + Enum i; + +public: + constexpr inline Flags(Enum f) : i(f) {} + constexpr bool testFlag(Enum f) { + using u = typename std::underlying_type::type; + return (i & f) == f && (static_cast(f) != 0 || i == f); + } + constexpr inline void setFlag(Enum f, bool on = true) + { + on ? (i |= f) : (i &= ~f); + } +}; +} + +#endif