Skip to main content

vortex_fastlanes/delta/vtable/
slice.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use std::cmp::min;
5use std::ops::Range;
6
7use vortex_array::ArrayRef;
8use vortex_array::IntoArray;
9use vortex_array::arrays::SliceReduce;
10use vortex_error::VortexResult;
11
12use crate::DeltaArray;
13use crate::delta::vtable::DeltaVTable;
14
15impl SliceReduce for DeltaVTable {
16    fn slice(array: &Self::Array, range: Range<usize>) -> VortexResult<Option<ArrayRef>> {
17        let physical_start = range.start + array.offset();
18        let physical_stop = range.end + array.offset();
19
20        let start_chunk = physical_start / 1024;
21        let stop_chunk = physical_stop.div_ceil(1024);
22
23        let bases = array.bases();
24        let deltas = array.deltas();
25        let lanes = array.lanes();
26
27        let new_bases = bases.slice(
28            min(start_chunk * lanes, array.bases_len())..min(stop_chunk * lanes, array.bases_len()),
29        )?;
30
31        let new_deltas = deltas.slice(
32            min(start_chunk * 1024, array.deltas_len())..min(stop_chunk * 1024, array.deltas_len()),
33        )?;
34
35        // SAFETY: slicing valid bases/deltas preserves correctness
36        Ok(Some(unsafe {
37            DeltaArray::new_unchecked(new_bases, new_deltas, physical_start % 1024, range.len())
38                .into_array()
39        }))
40    }
41}