polars_arrow/legacy/array/
slice.rs

1use crate::array::Array;
2
3/// Utility trait to slice concrete arrow arrays whilst keeping their
4/// concrete type. E.g. don't return `Box<dyn Array>`.
5pub trait SlicedArray {
6    /// Slices this [`Array`].
7    /// # Implementation
8    /// This operation is `O(1)` over `len`.
9    /// # Panic
10    /// This function panics iff `offset + length > self.len()`.
11    fn slice_typed(&self, offset: usize, length: usize) -> Self
12    where
13        Self: Sized;
14
15    /// Slices the [`Array`].
16    /// # Implementation
17    /// This operation is `O(1)`.
18    ///
19    /// # Safety
20    /// The caller must ensure that `offset + length <= self.len()`
21    unsafe fn slice_typed_unchecked(&self, offset: usize, length: usize) -> Self
22    where
23        Self: Sized;
24}
25
26impl<T: Array + Clone> SlicedArray for T {
27    fn slice_typed(&self, offset: usize, length: usize) -> Self {
28        let mut arr = self.clone();
29        arr.slice(offset, length);
30        arr
31    }
32
33    unsafe fn slice_typed_unchecked(&self, offset: usize, length: usize) -> Self {
34        let mut arr = self.clone();
35        arr.slice_unchecked(offset, length);
36        arr
37    }
38}