//! Mask types macro_rules! impl_mask_ty { ($id:ident : $elem_ty:ident | #[$doc:meta]) => { #[$doc] #[derive(Copy, Clone)] pub struct $id($elem_ty); impl crate::sealed::Seal for $id {} impl crate::sealed::Mask for $id { #[inline] fn test(&self) -> bool { $id::test(self) } } impl $id { /// Instantiate a mask with `value` #[inline] pub fn new(x: bool) -> Self { if x { $id(!0) } else { $id(0) } } /// Test if the mask is set #[inline] pub fn test(&self) -> bool { self.0 != 0 } } impl Default for $id { #[inline] fn default() -> Self { $id(0) } } #[allow(clippy::partialeq_ne_impl)] impl PartialEq<$id> for $id { #[inline] fn eq(&self, other: &Self) -> bool { self.0 == other.0 } #[inline] fn ne(&self, other: &Self) -> bool { self.0 != other.0 } } impl Eq for $id {} impl PartialOrd<$id> for $id { #[inline] fn partial_cmp(&self, other: &Self) -> Option { use crate::cmp::Ordering; if self == other { Some(Ordering::Equal) } else if self.0 > other.0 { // Note: // * false = 0_i // * true == !0_i == -1_i Some(Ordering::Less) } else { Some(Ordering::Greater) } } #[inline] fn lt(&self, other: &Self) -> bool { self.0 > other.0 } #[inline] fn gt(&self, other: &Self) -> bool { self.0 < other.0 } #[inline] fn le(&self, other: &Self) -> bool { self.0 >= other.0 } #[inline] fn ge(&self, other: &Self) -> bool { self.0 <= other.0 } } impl Ord for $id { #[inline] fn cmp(&self, other: &Self) -> crate::cmp::Ordering { match self.partial_cmp(other) { Some(x) => x, None => unsafe { crate::hint::unreachable_unchecked() }, } } } impl crate::hash::Hash for $id { #[inline] fn hash(&self, state: &mut H) { (self.0 != 0).hash(state); } } impl crate::fmt::Debug for $id { #[inline] fn fmt(&self, fmtter: &mut crate::fmt::Formatter<'_>) -> Result<(), crate::fmt::Error> { write!(fmtter, "{}({})", stringify!($id), self.0 != 0) } } }; } impl_mask_ty!(m8: i8 | /// 8-bit wide mask. ); impl_mask_ty!(m16: i16 | /// 16-bit wide mask. ); impl_mask_ty!(m32: i32 | /// 32-bit wide mask. ); impl_mask_ty!(m64: i64 | /// 64-bit wide mask. ); impl_mask_ty!(m128: i128 | /// 128-bit wide mask. ); impl_mask_ty!(msize: isize | /// isize-wide mask. );