enumflags2 implements the classic bitflags datastructure. Annotate an enum
BitFlags<YourEnum> will be able to hold arbitrary combinations
of your enum within the space of a single integer.
- Uses enums to represent individual flags—a set of flags is a separate type from a single flag.
- Automatically chooses a free bit when you don't specify.
- Detects incorrect BitFlags at compile time.
- Has a similar API compared to the popular bitflags crate.
- Does not expose the generated types explicity. The user interacts exclusively with
- The debug formatter prints the binary flag value as well as the flag enums:
BitFlags(0b1111, [A, B, C, D]).
- Optional support for serialization with the
use ; // Flags can be combined with |, this creates a BitFlags of your type: let a_b: = A | B; let a_c = A | C; let b_c_d = make_bitflags!; // The debug output lets you inspect both the numeric value and // the actual flags: assert_eq!; // But if you'd rather see only one of those, that's available too: assert_eq!; assert_eq!; // Iterate over the flags like a normal set assert_eq!; // Query the contents with contains and intersects assert!; assert!; assert!; assert!; assert!;
Optional Feature Flags
const fn-compatible APIs
Background: The subset of
const fn features currently stabilized is pretty limited.
Most notably, const traits are still at the RFC stage,
which makes it impossible to use any overloaded operators in a const
Naming convention: If a separate, more limited function is provided
for usage in a
const fn, the name is suffixed with
Blanket implementations: If you attempt to write a
const fn ranging
T: BitFlag, you will be met with an error explaining that currently,
the only allowed trait bound for a
const fn is
?Sized. You will probably
want to write a separate implementation for
BitFlags<T, u16>, etc — probably generated by a macro.
This strategy is often used by
enumflags2 itself; to avoid clutter, only
one of the copies is shown in the documentation.
By default, creating an instance of
Default will result in an empty
set. If that's undesirable, you may customize this: