@@ -89,6 +89,7 @@ pub fn size_of_shape_checked<D: Dimension>(dim: &D) -> Result<usize, ShapeError>
8989 . try_fold ( 1usize , |acc, & d| acc. checked_mul ( d) )
9090 . ok_or_else ( || from_kind ( ErrorKind :: Overflow ) ) ?;
9191 if size_nonzero > :: std:: isize:: MAX as usize {
92+ // TODO More specific error
9293 Err ( from_kind ( ErrorKind :: Overflow ) )
9394 } else {
9495 Ok ( dim. size ( ) )
@@ -137,7 +138,7 @@ pub(crate) fn can_index_slice_not_custom<D: Dimension>(data_len: usize, dim: &D)
137138 let len = size_of_shape_checked ( dim) ?;
138139 // Condition 2.
139140 if len > data_len {
140- return Err ( from_kind ( ErrorKind :: OutOfBounds ) ) ;
141+ return Err ( ShapeError :: shape_length_exceeds_data_length ( data_len , len ) ) ;
141142 }
142143 Ok ( ( ) )
143144}
@@ -170,6 +171,7 @@ where
170171{
171172 // Condition 1.
172173 if dim. ndim ( ) != strides. ndim ( ) {
174+ // TODO More specific error for dimension stride dimensionality mismatch
173175 return Err ( from_kind ( ErrorKind :: IncompatibleLayout ) ) ;
174176 }
175177
@@ -185,19 +187,23 @@ where
185187 let off = d. saturating_sub ( 1 ) . checked_mul ( s. abs ( ) as usize ) ?;
186188 acc. checked_add ( off)
187189 } )
190+ // TODO More specific error
188191 . ok_or_else ( || from_kind ( ErrorKind :: Overflow ) ) ?;
189192 // Condition 2a.
190193 if max_offset > isize:: MAX as usize {
194+ // TODO More specific error
191195 return Err ( from_kind ( ErrorKind :: Overflow ) ) ;
192196 }
193197
194198 // Determine absolute difference in units of bytes between least and
195199 // greatest address accessible by moving along all axes
196200 let max_offset_bytes = max_offset
197201 . checked_mul ( elem_size)
202+ // TODO More specific error
198203 . ok_or_else ( || from_kind ( ErrorKind :: Overflow ) ) ?;
199204 // Condition 2b.
200205 if max_offset_bytes > isize:: MAX as usize {
206+ // TODO More specific error
201207 return Err ( from_kind ( ErrorKind :: Overflow ) ) ;
202208 }
203209
@@ -256,15 +262,16 @@ fn can_index_slice_impl<D: Dimension>(
256262 // Check condition 3.
257263 let is_empty = dim. slice ( ) . iter ( ) . any ( |& d| d == 0 ) ;
258264 if is_empty && max_offset > data_len {
259- return Err ( from_kind ( ErrorKind :: OutOfBounds ) ) ;
265+ return Err ( ShapeError :: shape_length_exceeds_data_length ( data_len , max_offset ) ) ;
260266 }
261267 if !is_empty && max_offset >= data_len {
262- return Err ( from_kind ( ErrorKind :: OutOfBounds ) ) ;
268+ return Err ( ShapeError :: shape_length_exceeds_data_length ( data_len . wrapping_sub ( 1 ) , max_offset ) ) ;
263269 }
264270
265271 // Check condition 4.
266272 if !is_empty && dim_stride_overlap ( dim, strides) {
267- return Err ( from_kind ( ErrorKind :: Unsupported ) ) ;
273+ // TODO: More specific error kind Strides result in overlapping elements
274+ return Err ( ShapeError :: from_kind ( ErrorKind :: Unsupported ) ) ;
268275 }
269276
270277 Ok ( ( ) )
@@ -293,6 +300,7 @@ where
293300{
294301 for & stride in strides. slice ( ) {
295302 if ( stride as isize ) < 0 {
303+ // TODO: More specific error kind Non-negative strides required
296304 return Err ( from_kind ( ErrorKind :: Unsupported ) ) ;
297305 }
298306 }
0 commit comments