Some enum_bitfield helper operators

Added:
  set += flag -> set = set | flag
  set -= flag -> set = set & ~flag
  set && flag -> (set & flag) == flag
This commit is contained in:
Justin C. Miller
2018-09-12 20:57:15 -07:00
parent 5808599005
commit c2f85ce61b

View File

@@ -75,6 +75,28 @@ operator ^= (E &lhs, F rhs)
return lhs; return lhs;
} }
template <typename E, typename F>
typename std::enable_if<is_enum_bitfield<E>::value,E>::type&
operator -= (E &lhs, F rhs)
{
lhs = static_cast<E>(
static_cast<typename std::underlying_type<E>::type>(lhs) &
~static_cast<typename std::underlying_type<E>::type>(rhs));
return lhs;
}
template <typename E, typename F>
typename std::enable_if<is_enum_bitfield<E>::value,E>::type&
operator += (E &lhs, F rhs)
{
lhs = static_cast<E>(
static_cast<typename std::underlying_type<E>::type>(lhs) |
static_cast<typename std::underlying_type<E>::type>(rhs));
return lhs;
}
template <typename E> template <typename E>
typename std::enable_if<is_enum_bitfield<E>::value,bool>::type typename std::enable_if<is_enum_bitfield<E>::value,bool>::type
operator ! (E rhs) operator ! (E rhs)
@@ -88,3 +110,11 @@ bitfield_has(E set, E flag)
{ {
return (set & flag) == flag; return (set & flag) == flag;
} }
// Overload the logical-and operator to be 'bitwise-and, bool-cast'
template <typename E>
typename std::enable_if<is_enum_bitfield<E>::value,bool>::type
operator && (E set, E flag)
{
return (set & flag) == flag;
}