1#ifndef AUX_ENUM_FLAGS_H
2#define AUX_ENUM_FLAGS_H
10struct EnableBitMaskOperators
12 static const bool enable =
false;
15#define ENABLE_BITMASK_OPERATORS(x) \
17struct EnableBitMaskOperators<x> \
19 static const bool enable = true; \
22template<
typename Enum>
23constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type
24operator &(Enum lhs, Enum rhs)
noexcept
26 using underlying =
typename std::underlying_type<Enum>::type;
27 return static_cast<Enum
> (
28 static_cast<underlying
>(lhs) &
29 static_cast<underlying
>(rhs)
33template<
typename Enum>
34constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type
35operator ^(Enum lhs, Enum rhs)
noexcept
37 using underlying =
typename std::underlying_type<Enum>::type;
38 return static_cast<Enum
> (
39 static_cast<underlying
>(lhs) ^
40 static_cast<underlying
>(rhs)
44template<
typename Enum>
45constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type
46operator ~(Enum rhs)
noexcept
49 using underlying =
typename std::underlying_type<Enum>::type;
50 return static_cast<Enum
> (
51 ~static_cast<underlying>(rhs)
55template<
typename Enum>
56constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type
57operator |(Enum lhs, Enum rhs)
noexcept
59 using underlying =
typename std::underlying_type<Enum>::type;
60 return static_cast<Enum
> (
61 static_cast<underlying
>(lhs) |
62 static_cast<underlying
>(rhs)
66template<
typename Enum>
67constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type&
68operator &=(Enum& lhs, Enum rhs)
noexcept
70 using underlying =
typename std::underlying_type<Enum>::type;
71 lhs =
static_cast<Enum
> (
72 static_cast<underlying
>(lhs) &
73 static_cast<underlying
>(rhs)
78template<
typename Enum>
79constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type&
80operator ^=(Enum& lhs, Enum rhs)
noexcept
82 using underlying =
typename std::underlying_type<Enum>::type;
83 lhs =
static_cast<Enum
> (
84 static_cast<underlying
>(lhs) ^
85 static_cast<underlying
>(rhs)
90template<
typename Enum>
91constexpr typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum&>::type
92operator |=(Enum& lhs, Enum rhs)
noexcept
94 using underlying =
typename std::underlying_type<Enum>::type;
95 lhs =
static_cast<Enum
> (
96 static_cast<underlying
>(lhs) |
97 static_cast<underlying
>(rhs)