Macro bitflags::bitflags
[−]
[src]
macro_rules! bitflags { ($(#[$attr:meta])* pub struct $BitFlags:ident: $T:ty { $($(#[$Flag_attr:meta])* const $Flag:ident = $value:expr;)+ }) => { ... }; ($(#[$attr:meta])* struct $BitFlags:ident: $T:ty { $($(#[$Flag_attr:meta])* const $Flag:ident = $value:expr;)+ }) => { ... }; }
The macro used to generate the flag structure.
See the crate level docs for complete documentation.
Example
#[macro_use] extern crate bitflags; bitflags! { struct Flags: u32 { const FLAG_A = 0b00000001; const FLAG_B = 0b00000010; const FLAG_C = 0b00000100; const FLAG_ABC = FLAG_A.bits | FLAG_B.bits | FLAG_C.bits; } } fn main() { let e1 = FLAG_A | FLAG_C; let e2 = FLAG_B | FLAG_C; assert_eq!((e1 | e2), FLAG_ABC); // union assert_eq!((e1 & e2), FLAG_C); // intersection assert_eq!((e1 - e2), FLAG_A); // set difference assert_eq!(!e2, FLAG_A); // set complement }
The generated struct
s can also be extended with type and trait
implementations:
#[macro_use] extern crate bitflags; use std::fmt; bitflags! { struct Flags: u32 { const FLAG_A = 0b00000001; const FLAG_B = 0b00000010; } } impl Flags { pub fn clear(&mut self) { self.bits = 0; // The `bits` field can be accessed from within the // same module where the `bitflags!` macro was invoked. } } impl fmt::Display for Flags { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "hi!") } } fn main() { let mut flags = FLAG_A | FLAG_B; flags.clear(); assert!(flags.is_empty()); assert_eq!(format!("{}", flags), "hi!"); assert_eq!(format!("{:?}", FLAG_A | FLAG_B), "FLAG_A | FLAG_B"); assert_eq!(format!("{:?}", FLAG_B), "FLAG_B"); }