macro_rules! bitflags { ( $(#[$outer:meta])* $vis:vis struct $BitFlags:ident: $T:ty { $( $(#[$inner:ident $($args:tt)*])* const $Flag:tt = $value:expr; )* } $($t:tt)* ) => { ... }; ( $(#[$outer:meta])* impl $BitFlags:ident: $T:ty { $( $(#[$inner:ident $($args:tt)*])* const $Flag:tt = $value:expr; )* } $($t:tt)* ) => { ... }; () => { ... }; }
Expand description
Generate a flags type.
§struct mode
A declaration that begins with $vis struct will generate a struct for a flags type, along with
methods and trait implementations for it. The body of the declaration defines flags as constants,
where each constant is a flags value of the generated flags type.
§Examples
Generate a flags type using u8 as the bits type:
bitflags! {
    struct Flags: u8 {
        const A = 1;
        const B = 1 << 1;
        const C = 0b0000_0100;
    }
}Flags types are private by default and accept standard visibility modifiers. Flags themselves are always public:
bitflags! {
    pub struct Flags: u8 {
        // Constants are always `pub`
        const A = 1;
    }
}Flags may refer to other flags using their Flags::bits value:
bitflags! {
    struct Flags: u8 {
        const A = 1;
        const B = 1 << 1;
        const AB = Flags::A.bits() | Flags::B.bits();
    }
}A single bitflags invocation may include zero or more flags type declarations:
bitflags! {}
bitflags! {
    struct Flags1: u8 {
        const A = 1;
    }
    struct Flags2: u8 {
        const A = 1;
    }
}§impl mode
A declaration that begins with impl will only generate methods and trait implementations for the
struct defined outside of the bitflags macro.
The struct itself must be a newtype using the bits type as its field.
The syntax for impl mode is identical to struct mode besides the starting token.
§Examples
Implement flags methods and traits for a custom flags type using u8 as its underlying bits type:
struct Flags(u8);
bitflags! {
    impl Flags: u8 {
        const A = 1;
        const B = 1 << 1;
        const C = 0b0000_0100;
    }
}§Named and unnamed flags
Constants in the body of a declaration are flags. The identifier of the constant is the name of
the flag. If the identifier is _, then the flag is unnamed. Unnamed flags don’t appear in the
generated API, but affect how bits are truncated.
§Examples
Adding an unnamed flag that makes all bits known:
bitflags! {
    struct Flags: u8 {
        const A = 1;
        const B = 1 << 1;
        const _ = !0;
    }
}Flags types may define multiple unnamed flags:
bitflags! {
    struct Flags: u8 {
        const _ = 1;
        const _ = 1 << 1;
    }
}