A bitmask enum attribute macro.
A bitmask can have unsigned integer types, the default type is usize
.
Don't know how to document in proc-macro
crates so if you want see a better documentation run cargo doc --open
and select your Bitmask
enum.
```rust
enum Bitmask { /* ... */ }
enum Bitmask { /* ... */ } ```
```rust use bitmask_enum::bitmask;
enum Bitmask { Flag1, // defaults to 0d00000001 Flag2, // defaults to 0d00000010 Flag3, // defaults to 0d00000100 }
// bitmask has const bitwise operator methods const CONST_BM: Bitmask = Bitmask::Flag2.or(Bitmask::Flag3);
fn main() { println!("{:#010b}", CONST_BM); // 0b00000110
// Bitmask that contains Flag1 and Flag3
let bm = Bitmask::Flag1 | Bitmask::Flag3;
println!("{:#010b}", bm); // 0b00000101
// Does bm contain / intersect CONST_BM
println!("{}", bm.contains(CONST_BM)); // true
// Does bm contain / intersect all of CONST_BM
println!("{}", bm.contains_all(CONST_BM)); // false
} ```
You can assign every flag a custom value.
```rust use bitmask_enum::bitmask;
enum Bitmask { Flag1 = 0b00010000, Flag2 = 0b00000100, Flag3 = 0b00000001,
// Needs const methods
// Self::Flag1 | Self::Flag3 not possible
// 0b00010000 | 0b00000001 possible
Flag13_1 = 0b00010000 | 0b00000001,
Flag13_2 = Self::Flag1.or(Self::Flag3),
}
fn main() { let bm = Bitmask::Flag1 | Bitmask::Flag3; println!("{:#010b}", bm); // 0b00010001 println!("{}", bm == Bitmask::Flag131); // true println!("{}", bm == Bitmask::Flag132); // true } ```