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