
Allows for the easy creation of bitflag-based enums through the use of an easy-to-use Flags
trait that is auto-implemented on all types that are capable of stable bit-twiddling.
The Flags trait is auto-implemented mplemented on types that are capable of bitwise twiddling
as a way of turning on and off different bit-specific flags, such as u8
, u16
, u32
, u64
,
etc.
To integrate with bit-flags
, custom enum types should implent From<T>
where T
is the type
that implements bit_flags::Flags
. You can then call has_flag
, set_flag
, and unset_flag
on T
using flags defined by the custom enum type, like so:
use bit_flags::Flags;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
enum MyFlags {
Flag1 = 1 << 0, Flag2 = 1 << 1, Flag3 = 1 << 2, Flag4 = 1 << 3, }
impl From<MyFlags> for u8 {
fn from(flag: MyFlags) -> Self {
flag as u8
}
}
let mut flags: u8 = MyFlags::Flag1 as u8 | MyFlags::Flag2 as u8;
assert!(flags.has_flag(MyFlags::Flag1));
assert!(flags.has_flag(MyFlags::Flag2));
assert!(!flags.has_flag(MyFlags::Flag3));
flags.set_flag(MyFlags::Flag3);
assert!(flags.has_flag(MyFlags::Flag3));
flags.set_flag(MyFlags::Flag1);
assert!(flags.has_flag(MyFlags::Flag1));
flags.unset_flag(MyFlags::Flag2);
assert!(!flags.has_flag(MyFlags::Flag2));
flags |= MyFlags::Flag4 as u8; flags &= !(MyFlags::Flag1 as u8); assert!(flags.has_flag(MyFlags::Flag4));
assert!(!flags.has_flag(MyFlags::Flag1));
assert!(flags.has_flag(MyFlags::Flag3));
assert!(!flags.has_flag(MyFlags::Flag2));
You can also use multi-byte flags:
use bit_flags::Flags;
#[repr(u16)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
enum MyFlags {
Flag1 = 1 << 0, Flag2 = 1 << 1, Flag3 = 1 << 2, Flag4 = 1 << 3, Flag5 = 1 << 4, Flag6 = 1 << 5, Flag7 = 1 << 6, Flag8 = 1 << 7, Flag9 = 1 << 8, Flag10 = 1 << 9, Flag11 = 1 << 10, Flag12 = 1 << 11, Flag13 = 1 << 12, Flag14 = 1 << 13, Flag15 = 1 << 14, Flag16 = 1 << 15, }
impl From<MyFlags> for u16 {
fn from(flag: MyFlags) -> Self {
flag as u16
}
}
let mut flags: u16 = MyFlags::Flag1 as u16 | MyFlags::Flag2 as u16;
assert!(flags.has_flag(MyFlags::Flag1));
assert!(flags.has_flag(MyFlags::Flag2));
assert!(!flags.has_flag(MyFlags::Flag3));
flags.set_flag(MyFlags::Flag15);
assert!(flags.has_flag(MyFlags::Flag15));
flags.unset_flag(MyFlags::Flag1);
assert!(!flags.has_flag(MyFlags::Flag1));
assert_eq!(flags, MyFlags::Flag2 as u16 | MyFlags::Flag15 as u16);