ndarray/
split_at.rs

1
2use crate::imp_prelude::*;
3
4/// Arrays and similar that can be split along an axis
5pub(crate) trait SplitAt  {
6    fn split_at(self, axis: Axis, index: usize) -> (Self, Self) where Self: Sized;
7}
8
9pub(crate) trait SplitPreference : SplitAt {
10    fn can_split(&self) -> bool;
11    fn split_preference(&self) -> (Axis, usize);
12    fn split(self) -> (Self, Self) where Self: Sized {
13        let (axis, index) = self.split_preference();
14        self.split_at(axis, index)
15    }
16}
17
18impl<D> SplitAt for D
19where
20    D: Dimension,
21{
22    fn split_at(self, axis: Axis, index: Ix) -> (Self, Self) {
23        let mut d1 = self;
24        let mut d2 = d1.clone();
25        let i = axis.index();
26        let len = d1[i];
27        d1[i] = index;
28        d2[i] = len - index;
29        (d1, d2)
30    }
31}
32
33impl<'a, A, D> SplitAt for ArrayViewMut<'a, A, D>
34    where D: Dimension
35{
36    fn split_at(self, axis: Axis, index: usize) -> (Self, Self) {
37        self.split_at(axis, index)
38    }
39}
40
41
42impl<A, D> SplitAt for RawArrayViewMut<A, D>
43    where D: Dimension
44{
45    fn split_at(self, axis: Axis, index: usize) -> (Self, Self) {
46        self.split_at(axis, index)
47    }
48}