use BitSetLike;
#[derive(Debug)]
pub struct BitSetAnd<A: BitSetLike, B: BitSetLike>(pub A, pub B);
impl<A: BitSetLike, B: BitSetLike> BitSetLike for BitSetAnd<A, B> {
#[inline]
fn layer3(&self) -> usize {
self.0.layer3() & self.1.layer3()
}
#[inline]
fn layer2(&self, i: usize) -> usize {
self.0.layer2(i) & self.1.layer2(i)
}
#[inline]
fn layer1(&self, i: usize) -> usize {
self.0.layer1(i) & self.1.layer1(i)
}
#[inline]
fn layer0(&self, i: usize) -> usize {
self.0.layer0(i) & self.1.layer0(i)
}
}
#[derive(Debug)]
pub struct BitSetOr<A: BitSetLike, B: BitSetLike>(pub A, pub B);
impl<A: BitSetLike, B: BitSetLike> BitSetLike for BitSetOr<A, B> {
#[inline]
fn layer3(&self) -> usize {
self.0.layer3() | self.1.layer3()
}
#[inline]
fn layer2(&self, i: usize) -> usize {
self.0.layer2(i) | self.1.layer2(i)
}
#[inline]
fn layer1(&self, i: usize) -> usize {
self.0.layer1(i) | self.1.layer1(i)
}
#[inline]
fn layer0(&self, i: usize) -> usize {
self.0.layer0(i) | self.1.layer0(i)
}
}
#[derive(Debug)]
pub struct BitSetNot<A: BitSetLike>(pub A);
impl<A: BitSetLike> BitSetLike for BitSetNot<A> {
#[inline]
fn layer3(&self) -> usize {
!0
}
#[inline]
fn layer2(&self, _: usize) -> usize {
!0
}
#[inline]
fn layer1(&self, _: usize) -> usize {
!0
}
#[inline]
fn layer0(&self, i: usize) -> usize {
!self.0.layer0(i)
}
}