vortex_mask/
bitops.rs

1use std::ops::{BitAnd, Not};
2
3use vortex_error::vortex_panic;
4
5use crate::{AllOr, Mask};
6
7impl BitAnd for &Mask {
8    type Output = Mask;
9
10    fn bitand(self, rhs: Self) -> Self::Output {
11        if self.len() != rhs.len() {
12            vortex_panic!("Masks must have the same length");
13        }
14
15        match (self.boolean_buffer(), rhs.boolean_buffer()) {
16            (AllOr::All, _) => rhs.clone(),
17            (_, AllOr::All) => self.clone(),
18            (AllOr::None, _) => Mask::new_false(self.len()),
19            (_, AllOr::None) => Mask::new_false(self.len()),
20            (AllOr::Some(lhs), AllOr::Some(rhs)) => Mask::from_buffer(lhs & rhs),
21        }
22    }
23}
24
25impl Not for &Mask {
26    type Output = Mask;
27
28    fn not(self) -> Self::Output {
29        match self.boolean_buffer() {
30            AllOr::All => Mask::new_false(self.len()),
31            AllOr::None => Mask::new_true(self.len()),
32            AllOr::Some(buffer) => Mask::from_buffer(!buffer),
33        }
34    }
35}