#pragma once #include // Enable bitwise ops only for enum classes with the ENABLE_BITMASK_OPERATORS trait template struct EnableBitMaskOperators { static const bool enable = false; }; #define ENABLE_BITMASK_OPERATORS(x) \ template <> \ struct EnableBitMaskOperators { \ static const bool enable = true; \ }; template typename std::enable_if::enable, Enum>::type operator|(Enum lhs, Enum rhs) { using underlying = typename std::underlying_type::type; return static_cast(static_cast(lhs) | static_cast(rhs)); } template typename std::enable_if::enable, Enum&>::type operator|=(Enum& lhs, Enum rhs) { lhs = lhs | rhs; return lhs; } template typename std::enable_if::enable, Enum>::type operator&(Enum lhs, Enum rhs) { using underlying = typename std::underlying_type::type; return static_cast(static_cast(lhs) & static_cast(rhs)); } template typename std::enable_if::enable, Enum>::type operator~(Enum e) { using underlying = typename std::underlying_type::type; return static_cast(~static_cast(e)); } template typename std::enable_if::enable, Enum&>::type operator&=(Enum& lhs, Enum rhs) { lhs = lhs & rhs; return lhs; }