README.md
1bitflags
2========
3
4[](https://github.com/bitflags/bitflags/actions)
5[](https://crates.io/crates/bitflags)
6[](https://docs.rs/bitflags)
7
8
9`bitflags` generates flags enums with well-defined semantics and ergonomic end-user APIs.
10
11You can use `bitflags` to:
12
13- provide more user-friendly bindings to C APIs where flags may or may not be fully known in advance.
14- generate efficient options types with string parsing and formatting support.
15
16You can't use `bitflags` to:
17
18- guarantee only bits corresponding to defined flags will ever be set. `bitflags` allows access to the underlying bits type so arbitrary bits may be set.
19- define bitfields. `bitflags` only generates types where set bits denote the presence of some combination of flags.
20
21- [Documentation](https://docs.rs/bitflags)
22- [Specification](https://github.com/bitflags/bitflags/blob/main/spec.md)
23- [Release notes](https://github.com/bitflags/bitflags/releases)
24
25## Usage
26
27Add this to your `Cargo.toml`:
28
29```toml
30[dependencies]
31bitflags = "2.6.0"
32```
33
34and this to your source code:
35
36```rust
37use bitflags::bitflags;
38```
39
40## Example
41
42Generate a flags structure:
43
44```rust
45use bitflags::bitflags;
46
47// The `bitflags!` macro generates `struct`s that manage a set of flags.
48bitflags! {
49 /// Represents a set of flags.
50 #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
51 struct Flags: u32 {
52 /// The value `A`, at bit position `0`.
53 const A = 0b00000001;
54 /// The value `B`, at bit position `1`.
55 const B = 0b00000010;
56 /// The value `C`, at bit position `2`.
57 const C = 0b00000100;
58
59 /// The combination of `A`, `B`, and `C`.
60 const ABC = Self::A.bits() | Self::B.bits() | Self::C.bits();
61 }
62}
63
64fn main() {
65 let e1 = Flags::A | Flags::C;
66 let e2 = Flags::B | Flags::C;
67 assert_eq!((e1 | e2), Flags::ABC); // union
68 assert_eq!((e1 & e2), Flags::C); // intersection
69 assert_eq!((e1 - e2), Flags::A); // set difference
70 assert_eq!(!e2, Flags::A); // set complement
71}
72```
73
74## Rust Version Support
75
76The minimum supported Rust version is documented in the `Cargo.toml` file.
77This may be bumped in minor releases as necessary.
78