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}