vortex_vector/null/
vector.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4//! Definition and implementation of [`NullVector`].
5
6use 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/// An immutable vector of null values.
17///
18/// Since a "null" value does not require any data storage, the nulls are stored internally with a
19/// single `length` counter.
20///
21/// The mutable equivalent of this type is [`NullVectorMut`].
22#[derive(Debug, Clone)]
23pub struct NullVector {
24    /// The total number of nulls.
25    pub(super) len: usize,
26    /// The validity mask. We only store this in order to implement the
27    /// [`validity()`](Self::validity) method.
28    pub(super) validity: Mask,
29}
30
31impl NullVector {
32    /// Creates a new immutable vector of nulls with the given length.
33    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}