vortex_array/arrays/bool/vtable/
operations.rs1use 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}