vortex_array/arrays/bool/vtable/
operations.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use std::ops::Range;
5
6use vortex_scalar::Scalar;
7
8use crate::ArrayRef;
9use crate::IntoArray;
10use crate::arrays::BoolArray;
11use crate::arrays::BoolVTable;
12use crate::vtable::OperationsVTable;
13use crate::vtable::ValidityHelper;
14
15impl OperationsVTable<BoolVTable> for BoolVTable {
16    fn slice(array: &BoolArray, range: Range<usize>) -> ArrayRef {
17        BoolArray::from_bit_buffer(
18            array.bit_buffer().slice(range.clone()),
19            array.validity().slice(range),
20        )
21        .into_array()
22    }
23
24    fn scalar_at(array: &BoolArray, index: usize) -> Scalar {
25        Scalar::bool(array.bit_buffer().value(index), array.dtype().nullability())
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use std::iter;
32
33    use super::*;
34    use crate::ToCanonical;
35    use crate::assert_arrays_eq;
36
37    #[test]
38    fn test_slice_hundred_elements() {
39        let arr = BoolArray::from_iter(iter::repeat_n(Some(true), 100));
40        let sliced_arr = arr.slice(8..16).to_bool();
41        assert_eq!(sliced_arr.len(), 8);
42        assert_eq!(sliced_arr.bit_buffer().len(), 8);
43        assert_eq!(sliced_arr.bit_buffer().offset(), 0);
44    }
45
46    #[test]
47    fn test_slice() {
48        let arr = BoolArray::from_iter([Some(true), Some(true), None, Some(false), None]);
49        let sliced_arr = arr.slice(1..4).to_bool();
50
51        assert_arrays_eq!(
52            sliced_arr,
53            BoolArray::from_iter([Some(true), None, Some(false)])
54        );
55    }
56}