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:
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user