use core::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Not}; #[derive(Copy, Clone, PartialEq, Debug)] #[repr(transparent)] pub struct Block(pub(super) usize); impl Block { #[inline] pub const fn is_empty(self) -> bool { self.0 == Self::NONE.0 } #[inline] pub fn andnot(self, other: Self) -> Self { Self(!other.0 & self.0) } } impl Not for Block { type Output = Block; #[inline] fn not(self) -> Self::Output { Self(self.0.not()) } } impl BitAnd for Block { type Output = Block; #[inline] fn bitand(self, other: Self) -> Self::Output { Self(self.0.bitand(other.0)) } } impl BitAndAssign for Block { #[inline] fn bitand_assign(&mut self, other: Self) { self.0.bitand_assign(other.0); } } impl BitOr for Block { type Output = Block; #[inline] fn bitor(self, other: Self) -> Self::Output { Self(self.0.bitor(other.0)) } } impl BitOrAssign for Block { #[inline] fn bitor_assign(&mut self, other: Self) { self.0.bitor_assign(other.0) } } impl BitXor for Block { type Output = Block; #[inline] fn bitxor(self, other: Self) -> Self::Output { Self(self.0.bitxor(other.0)) } } impl BitXorAssign for Block { #[inline] fn bitxor_assign(&mut self, other: Self) { self.0.bitxor_assign(other.0) } }