ndarray/dimension/
sequence.rs1use std::ops::Index;
2use std::ops::IndexMut;
3
4use crate::dimension::Dimension;
5
6pub(in crate::dimension) struct Forward<D>(pub(crate) D);
7pub(in crate::dimension) struct Reverse<D>(pub(crate) D);
8
9impl<D> Index<usize> for Forward<&D>
10where
11 D: Dimension,
12{
13 type Output = usize;
14
15 #[inline]
16 fn index(&self, index: usize) -> &usize {
17 &self.0[index]
18 }
19}
20
21impl<D> Index<usize> for Forward<&mut D>
22where
23 D: Dimension,
24{
25 type Output = usize;
26
27 #[inline]
28 fn index(&self, index: usize) -> &usize {
29 &self.0[index]
30 }
31}
32
33impl<D> IndexMut<usize> for Forward<&mut D>
34where
35 D: Dimension,
36{
37 #[inline]
38 fn index_mut(&mut self, index: usize) -> &mut usize {
39 &mut self.0[index]
40 }
41}
42
43impl<D> Index<usize> for Reverse<&D>
44where
45 D: Dimension,
46{
47 type Output = usize;
48
49 #[inline]
50 fn index(&self, index: usize) -> &usize {
51 &self.0[self.len() - index - 1]
52 }
53}
54
55impl<D> Index<usize> for Reverse<&mut D>
56where
57 D: Dimension,
58{
59 type Output = usize;
60
61 #[inline]
62 fn index(&self, index: usize) -> &usize {
63 &self.0[self.len() - index - 1]
64 }
65}
66
67impl<D> IndexMut<usize> for Reverse<&mut D>
68where
69 D: Dimension,
70{
71 #[inline]
72 fn index_mut(&mut self, index: usize) -> &mut usize {
73 let len = self.len();
74 &mut self.0[len - index - 1]
75 }
76}
77
78pub(in crate::dimension) trait Sequence: Index<usize> {
80 fn len(&self) -> usize;
81}
82
83pub(in crate::dimension) trait SequenceMut: Sequence + IndexMut<usize> { }
85
86impl<D> Sequence for Forward<&D> where D: Dimension {
87 #[inline]
88 fn len(&self) -> usize { self.0.ndim() }
89}
90
91impl<D> Sequence for Forward<&mut D> where D: Dimension {
92 #[inline]
93 fn len(&self) -> usize { self.0.ndim() }
94}
95
96impl<D> SequenceMut for Forward<&mut D> where D: Dimension { }
97
98impl<D> Sequence for Reverse<&D> where D: Dimension {
99 #[inline]
100 fn len(&self) -> usize { self.0.ndim() }
101}
102
103impl<D> Sequence for Reverse<&mut D> where D: Dimension {
104 #[inline]
105 fn len(&self) -> usize { self.0.ndim() }
106}
107
108impl<D> SequenceMut for Reverse<&mut D> where D: Dimension { }
109