vortex_compute/take/vector/
pvector.rs1use vortex_dtype::NativePType;
5use vortex_dtype::UnsignedPType;
6use vortex_vector::VectorOps;
7use vortex_vector::primitive::PVector;
8
9use crate::take::Take;
10
11impl<T: NativePType, I: UnsignedPType> Take<PVector<I>> for &PVector<T> {
12 type Output = PVector<T>;
13
14 fn take(self, indices: &PVector<I>) -> PVector<T> {
15 if indices.validity().all_true() {
16 self.take(indices.elements().as_slice())
17 } else {
18 take_nullable(self, indices)
19 }
20 }
21}
22
23impl<T: NativePType, I: UnsignedPType> Take<[I]> for &PVector<T> {
24 type Output = PVector<T>;
25
26 fn take(self, indices: &[I]) -> PVector<T> {
27 let taken_elements = self.elements().take(indices);
28 let taken_validity = self.validity().take(indices);
29
30 debug_assert_eq!(taken_elements.len(), taken_validity.len());
31
32 unsafe { PVector::new_unchecked(taken_elements, taken_validity) }
35 }
36}
37
38fn take_nullable<T: NativePType, I: UnsignedPType>(
39 pvector: &PVector<T>,
40 indices: &PVector<I>,
41) -> PVector<T> {
42 let taken_elements = pvector.elements().take(indices.elements().as_slice());
45 let taken_validity = pvector.validity().take(indices);
46
47 debug_assert_eq!(taken_elements.len(), taken_validity.len());
48
49 unsafe { PVector::new_unchecked(taken_elements, taken_validity) }
52}