use std::ops::{BitAnd, BitOr, BitXor, Not}; use bitflags::{Bits, Flag, Flags}; // Define a custom container that can be used in flags types // Note custom bits types can't be used in `bitflags!` // without making the trait impls `const`. This is currently // unstable #[derive(Clone, Copy, Debug)] pub struct CustomBits([bool; 3]); impl Bits for CustomBits { const EMPTY: Self = CustomBits([false; 3]); const ALL: Self = CustomBits([true; 3]); } impl PartialEq for CustomBits { fn eq(&self, other: &Self) -> bool { self.0 == other.0 } } impl BitAnd for CustomBits { type Output = Self; fn bitand(self, other: Self) -> Self { CustomBits([ self.0[0] & other.0[0], self.0[1] & other.0[1], self.0[2] & other.0[2], ]) } } impl BitOr for CustomBits { type Output = Self; fn bitor(self, other: Self) -> Self { CustomBits([ self.0[0] | other.0[0], self.0[1] | other.0[1], self.0[2] | other.0[2], ]) } } impl BitXor for CustomBits { type Output = Self; fn bitxor(self, other: Self) -> Self { CustomBits([ self.0[0] & other.0[0], self.0[1] & other.0[1], self.0[2] & other.0[2], ]) } } impl Not for CustomBits { type Output = Self; fn not(self) -> Self { CustomBits([!self.0[0], !self.0[1], !self.0[2]]) } } #[derive(Clone, Copy, Debug)] pub struct CustomFlags(CustomBits); impl CustomFlags { pub const A: Self = CustomFlags(CustomBits([true, false, false])); pub const B: Self = CustomFlags(CustomBits([false, true, false])); pub const C: Self = CustomFlags(CustomBits([false, false, true])); } impl Flags for CustomFlags { const FLAGS: &'static [Flag] = &[ Flag::new("A", Self::A), Flag::new("B", Self::B), Flag::new("C", Self::C), ]; type Bits = CustomBits; fn bits(&self) -> Self::Bits { self.0 } fn from_bits_retain(bits: Self::Bits) -> Self { CustomFlags(bits) } } fn main() { println!("{:?}", CustomFlags::A.union(CustomFlags::C)); }