6 struct enable_bitmask_operators{
7 static const bool enable=false;
10 #define enableEnumClassBitfield(E) template<> \
11 struct enable_bitmask_operators<E>{ \
12 static const bool enable=true; \
16 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E>
17 operator|(E lhs,E rhs){
18 typedef typename std::underlying_type_t<E> underlying;
19 return static_cast<E>(
20 static_cast<underlying>(lhs) | static_cast<underlying>(rhs));
24 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E>
25 operator&(E lhs,E rhs){
26 typedef typename std::underlying_type_t<E> underlying;
27 return static_cast<E>(
28 static_cast<underlying>(lhs) & static_cast<underlying>(rhs));
32 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E>
33 operator^(E lhs,E rhs){
34 typedef typename std::underlying_type_t<E> underlying;
35 return static_cast<E>(
36 static_cast<underlying>(lhs) ^ static_cast<underlying>(rhs));
40 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E>
42 typedef typename std::underlying_type_t<E> underlying;
43 return static_cast<E>(
44 ~static_cast<underlying>(lhs));
48 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E&>
49 operator|=(E& lhs,E rhs){
50 typedef typename std::underlying_type_t<E> underlying;
52 static_cast<underlying>(lhs) | static_cast<underlying>(rhs));
57 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E&>
58 operator&=(E& lhs,E rhs){
59 typedef typename std::underlying_type_t<E> underlying;
61 static_cast<underlying>(lhs) & static_cast<underlying>(rhs));
66 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E&>
67 operator^=(E& lhs,E rhs){
68 typedef typename std::underlying_type_t<E> underlying;
70 static_cast<underlying>(lhs) ^ static_cast<underlying>(rhs));