#[derive(Clone, Copy, Debug)]
pub(crate) struct SignalSet(pub(crate) usize);
#[allow(dead_code)]
impl SignalSet {
pub fn empty() -> Self {
Self(0)
}
pub fn new(v: usize) -> Self {
Self(v)
}
pub fn reset(&mut self, v: usize) {
self.0 = v;
}
pub fn clear(&mut self) {
self.0 = 0;
}
pub fn contain_bit(&self, kth: usize) -> bool {
((self.0 >> kth) & 1) > 0
}
pub fn add_bit(&mut self, kth: usize) {
self.0 |= 1 << kth;
}
pub fn remove_bit(&mut self, kth: usize) {
self.0 &= !(1 << kth);
}
pub fn get_union(&mut self, set: SignalSet) {
self.0 |= set.0;
}
pub fn get_difference(&mut self, set: SignalSet) {
self.0 &= !(set.0);
}
pub fn set_new(&mut self, set: SignalSet) -> usize {
let old = self.0;
self.0 = set.0;
old
}
pub fn get_trailing_zeros(&self) -> u32 {
self.0.trailing_zeros()
}
pub fn find_first_one(&self, mask: SignalSet) -> Option<usize> {
let ans = (self.0 & !mask.0).trailing_zeros() as usize;
if ans == 64 {
None
} else {
Some(ans)
}
}
}
impl From<usize> for SignalSet {
fn from(v: usize) -> Self {
Self(v)
}
}