pub trait Flags: Default + Clone + Copy + Sized {
const BIT_SIZE: usize;
fn u8_bitmask(&self) -> u8;
fn from_u8(value: u8) -> Option<Self>;
fn from_u8_remove_flags(value: &mut u8) -> Option<Self> {
let flags = Self::from_u8(*value);
if let Some(f) = flags {
*value &= !f.u8_bitmask();
}
flags
}
}
#[derive(Default, Clone, Copy, PartialEq, Eq)]
pub struct EmptyFlags;
impl Flags for EmptyFlags {
const BIT_SIZE: usize = 0;
#[inline]
fn u8_bitmask(&self) -> u8 {
0
}
#[inline]
fn from_u8(_: u8) -> Option<Self> {
Some(EmptyFlags)
}
}