| 1 | //! An example of implementing the `BitFlags` trait manually for a flags type. |
| 2 | //! |
| 3 | //! This example doesn't use any macros. |
| 4 | |
| 5 | use std::{fmt, str}; |
| 6 | |
| 7 | use bitflags::{Flag, Flags}; |
| 8 | |
| 9 | // First: Define your flags type. It just needs to be `Sized + 'static`. |
| 10 | pub struct ManualFlags(u32); |
| 11 | |
| 12 | // Not required: Define some constants for valid flags |
| 13 | impl ManualFlags { |
| 14 | pub const A: ManualFlags = ManualFlags(0b00000001); |
| 15 | pub const B: ManualFlags = ManualFlags(0b00000010); |
| 16 | pub const C: ManualFlags = ManualFlags(0b00000100); |
| 17 | pub const ABC: ManualFlags = ManualFlags(0b00000111); |
| 18 | } |
| 19 | |
| 20 | // Next: Implement the `BitFlags` trait, specifying your set of valid flags |
| 21 | // and iterators |
| 22 | impl Flags for ManualFlags { |
| 23 | const FLAGS: &'static [Flag<Self>] = &[ |
| 24 | Flag::new("A" , Self::A), |
| 25 | Flag::new("B" , Self::B), |
| 26 | Flag::new("C" , Self::C), |
| 27 | ]; |
| 28 | |
| 29 | type Bits = u32; |
| 30 | |
| 31 | fn bits(&self) -> u32 { |
| 32 | self.0 |
| 33 | } |
| 34 | |
| 35 | fn from_bits_retain(bits: u32) -> Self { |
| 36 | Self(bits) |
| 37 | } |
| 38 | } |
| 39 | |
| 40 | // Not required: Add parsing support |
| 41 | impl str::FromStr for ManualFlags { |
| 42 | type Err = bitflags::parser::ParseError; |
| 43 | |
| 44 | fn from_str(input: &str) -> Result<Self, Self::Err> { |
| 45 | bitflags::parser::from_str(input) |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | // Not required: Add formatting support |
| 50 | impl fmt::Display for ManualFlags { |
| 51 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| 52 | bitflags::parser::to_writer(self, f) |
| 53 | } |
| 54 | } |
| 55 | |
| 56 | fn main() { |
| 57 | println!( |
| 58 | "{}" , |
| 59 | ManualFlags::A.union(ManualFlags::B).union(ManualFlags::C) |
| 60 | ); |
| 61 | } |
| 62 | |