20#define _LIEF_EN(N) class N : size_t
21#define _LIEF_EN_2(N, TYPE) class N : TYPE
24#define ENABLE_BITMASK_OPERATORS(X) \
26struct EnableBitMaskOperators<X> \
28 static const bool bit_mask_enabled = true; \
31template<
typename Enum>
34 static const bool bit_mask_enabled =
false;
37template<
typename Enum>
38typename std::enable_if<EnableBitMaskOperators<Enum>::bit_mask_enabled, Enum>::type
39operator |(Enum lhs, Enum rhs)
41 using underlying =
typename std::underlying_type<Enum>::type;
42 return static_cast<Enum
> (
43 static_cast<underlying
>(lhs) |
44 static_cast<underlying
>(rhs)
48template<
typename Enum>
49typename std::enable_if<EnableBitMaskOperators<Enum>::bit_mask_enabled, Enum>::type
50operator &(Enum lhs, Enum rhs)
52 using underlying =
typename std::underlying_type<Enum>::type;
53 return static_cast<Enum
> (
54 static_cast<underlying
>(lhs) &
55 static_cast<underlying
>(rhs)
59template<
typename Enum>
60typename std::enable_if<EnableBitMaskOperators<Enum>::bit_mask_enabled, Enum>::type
63 using underlying =
typename std::underlying_type<Enum>::type;
64 return static_cast<Enum
>(~static_cast<underlying>(e));
67template<
typename Enum>
68typename std::enable_if<EnableBitMaskOperators<Enum>::bit_mask_enabled,
typename std::add_lvalue_reference<Enum>::type>::type
69operator |=(Enum& lhs, Enum rhs)
71 using underlying =
typename std::underlying_type<Enum>::type;
72 lhs =
static_cast<Enum
>(
static_cast<underlying
>(lhs) |
static_cast<underlying
>(rhs));
76template<
typename Enum>
77typename std::enable_if<EnableBitMaskOperators<Enum>::bit_mask_enabled,
typename std::add_lvalue_reference<Enum>::type>::type
78operator &=(Enum& lhs, Enum rhs)
80 using underlying =
typename std::underlying_type<Enum>::type;
81 lhs =
static_cast<Enum
>(
static_cast<underlying
>(lhs) &
static_cast<underlying
>(rhs));
85template<
typename Enum>
86typename std::enable_if<EnableBitMaskOperators<Enum>::bit_mask_enabled,
bool>::type
89 using underlying =
typename std::underlying_type<Enum>::type;
90 return static_cast<underlying
>(e) > 0;