vortex_vector/null/
vector.rs1use std::fmt::Debug;
7use std::ops::BitAnd;
8use std::ops::RangeBounds;
9
10use vortex_mask::Mask;
11
12use crate::VectorOps;
13use crate::null::NullScalar;
14use crate::null::NullVectorMut;
15
16#[derive(Debug, Clone)]
23pub struct NullVector {
24 pub(super) len: usize,
26 pub(super) validity: Mask,
29}
30
31impl NullVector {
32 pub fn new(len: usize) -> Self {
34 Self {
35 len,
36 validity: Mask::AllFalse(len),
37 }
38 }
39}
40
41impl VectorOps for NullVector {
42 type Mutable = NullVectorMut;
43 type Scalar = NullScalar;
44
45 fn len(&self) -> usize {
46 self.len
47 }
48
49 fn validity(&self) -> &Mask {
50 &self.validity
51 }
52
53 fn mask_validity(&mut self, mask: &Mask) {
54 self.validity = self.validity.bitand(mask);
55 }
56
57 fn scalar_at(&self, index: usize) -> NullScalar {
58 assert!(index < self.len, "Index out of bounds in `NullVector`");
59 NullScalar
60 }
61
62 fn slice(&self, range: impl RangeBounds<usize> + Clone + Debug) -> Self {
63 let len = crate::vector_ops::range_bounds_to_len(range, self.len());
64 Self::new(len)
65 }
66
67 fn clear(&mut self) {
68 self.len = 0;
69 self.validity = Mask::AllFalse(0);
70 }
71
72 fn try_into_mut(self) -> Result<NullVectorMut, Self> {
73 Ok(NullVectorMut::new(self.len))
74 }
75
76 fn into_mut(self) -> NullVectorMut {
77 NullVectorMut::new(self.len)
78 }
79}