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