vortex_array/arrays/slice/
mod.rs1mod array;
12mod rules;
13mod slice_;
14mod vtable;
15
16use std::ops::Range;
17
18pub use array::*;
19use vortex_error::VortexResult;
20pub use vtable::*;
21
22use crate::ArrayRef;
23use crate::Canonical;
24use crate::ExecutionCtx;
25use crate::IntoArray;
26use crate::kernel::ExecuteParentKernel;
27use crate::matcher::Matcher;
28use crate::optimizer::rules::ArrayParentReduceRule;
29use crate::vtable::VTable;
30
31pub trait SliceReduce: VTable {
32 fn slice(array: &Self::Array, range: Range<usize>) -> VortexResult<Option<ArrayRef>>;
44}
45
46pub trait SliceKernel: VTable {
47 fn slice(
58 array: &Self::Array,
59 range: Range<usize>,
60 ctx: &mut ExecutionCtx,
61 ) -> VortexResult<Option<ArrayRef>>;
62}
63
64fn precondition<V: VTable>(array: &V::Array, range: &Range<usize>) -> Option<ArrayRef> {
65 if range.start == 0 && range.end == array.len() {
66 return Some(array.to_array());
67 };
68 if range.start == range.end {
69 return Some(Canonical::empty(array.dtype()).into_array());
70 }
71 None
72}
73
74#[derive(Default, Debug)]
76pub struct SliceReduceAdaptor<V>(pub V);
77
78impl<V> ArrayParentReduceRule<V> for SliceReduceAdaptor<V>
79where
80 V: SliceReduce,
81{
82 type Parent = Slice;
83
84 fn reduce_parent(
85 &self,
86 array: &V::Array,
87 parent: <Self::Parent as Matcher>::Match<'_>,
88 child_idx: usize,
89 ) -> VortexResult<Option<ArrayRef>> {
90 assert_eq!(child_idx, 0);
91 if let Some(result) = precondition::<V>(array, &parent.range) {
92 return Ok(Some(result));
93 }
94 <V as SliceReduce>::slice(array, parent.range.clone())
95 }
96}
97
98#[derive(Default, Debug)]
100pub struct SliceExecuteAdaptor<V>(pub V);
101
102impl<V> ExecuteParentKernel<V> for SliceExecuteAdaptor<V>
103where
104 V: SliceKernel,
105{
106 type Parent = Slice;
107
108 fn execute_parent(
109 &self,
110 array: &V::Array,
111 parent: <Self::Parent as Matcher>::Match<'_>,
112 child_idx: usize,
113 ctx: &mut ExecutionCtx,
114 ) -> VortexResult<Option<ArrayRef>> {
115 assert_eq!(child_idx, 0);
116 if let Some(result) = precondition::<V>(array, &parent.range) {
117 return Ok(Some(result));
118 }
119 <V as SliceKernel>::slice(array, parent.range.clone(), ctx)
120 }
121}