@@ -94,6 +94,62 @@ impl<S, D, I> IndexMut<I> for ArrayBase<S, D>
94
94
}
95
95
}
96
96
97
+ impl < ' a , A , D > ArrayView < ' a , A , D >
98
+ where
99
+ D : Dimension ,
100
+ {
101
+ /// Get a reference of a element through the view.
102
+ ///
103
+ /// This is a replacement of `Index::index` since it forces us a wrong lifetime
104
+ /// https://github.com/bluss/rust-ndarray/issues/371
105
+ pub fn elem < I : NdIndex < D > > ( & self , index : I ) -> & ' a A {
106
+ debug_bounds_check ! ( self , index) ;
107
+ unsafe {
108
+ & * self . as_ptr ( ) . offset (
109
+ index
110
+ . index_checked ( & self . dim , & self . strides )
111
+ . unwrap_or_else ( || array_out_of_bounds ( ) ) ,
112
+ )
113
+ }
114
+ }
115
+
116
+ /// Get a reference of a element through the view without boundary check
117
+ ///
118
+ /// This is a replacement of `Index::index` since it forces us a wrong lifetime
119
+ /// https://github.com/bluss/rust-ndarray/issues/371
120
+ pub fn uelem < I : NdIndex < D > > ( & self , index : I ) -> & ' a A {
121
+ debug_bounds_check ! ( self , index) ;
122
+ unsafe { & * self . as_ptr ( ) . offset ( index. index_unchecked ( & self . strides ) ) }
123
+ }
124
+ }
125
+
126
+ impl < ' a , A , D > ArrayViewMut < ' a , A , D >
127
+ where
128
+ D : Dimension ,
129
+ {
130
+ /// Convert a mutable array view to a mutable reference of a element.
131
+ pub fn into_elem < I : NdIndex < D > > ( mut self , index : I ) -> & ' a mut A {
132
+ debug_bounds_check ! ( self , index) ;
133
+ unsafe {
134
+ & mut * self . as_mut_ptr ( ) . offset (
135
+ index
136
+ . index_checked ( & self . dim , & self . strides )
137
+ . unwrap_or_else ( || array_out_of_bounds ( ) ) ,
138
+ )
139
+ }
140
+ }
141
+
142
+ /// Convert a mutable array view to a mutable reference of a element without boundary check
143
+ pub fn into_elem_unchecked < I : NdIndex < D > > ( mut self , index : I ) -> & ' a mut A {
144
+ debug_bounds_check ! ( self , index) ;
145
+ unsafe {
146
+ & mut * self . as_mut_ptr ( ) . offset (
147
+ index. index_unchecked ( & self . strides ) ,
148
+ )
149
+ }
150
+ }
151
+ }
152
+
97
153
/// Return `true` if the array shapes and all elements of `self` and
98
154
/// `rhs` are equal. Return `false` otherwise.
99
155
impl < S , S2 , D > PartialEq < ArrayBase < S2 , D > > for ArrayBase < S , D >
0 commit comments