@@ -89,6 +89,7 @@ pub fn size_of_shape_checked<D: Dimension>(dim: &D) -> Result<usize, ShapeError>
89
89
. try_fold ( 1usize , |acc, & d| acc. checked_mul ( d) )
90
90
. ok_or_else ( || from_kind ( ErrorKind :: Overflow ) ) ?;
91
91
if size_nonzero > :: std:: isize:: MAX as usize {
92
+ // TODO More specific error
92
93
Err ( from_kind ( ErrorKind :: Overflow ) )
93
94
} else {
94
95
Ok ( dim. size ( ) )
@@ -137,7 +138,7 @@ pub(crate) fn can_index_slice_not_custom<D: Dimension>(data_len: usize, dim: &D)
137
138
let len = size_of_shape_checked ( dim) ?;
138
139
// Condition 2.
139
140
if len > data_len {
140
- return Err ( from_kind ( ErrorKind :: OutOfBounds ) ) ;
141
+ return Err ( ShapeError :: shape_length_exceeds_data_length ( data_len , len ) ) ;
141
142
}
142
143
Ok ( ( ) )
143
144
}
@@ -170,6 +171,7 @@ where
170
171
{
171
172
// Condition 1.
172
173
if dim. ndim ( ) != strides. ndim ( ) {
174
+ // TODO More specific error for dimension stride dimensionality mismatch
173
175
return Err ( from_kind ( ErrorKind :: IncompatibleLayout ) ) ;
174
176
}
175
177
@@ -185,19 +187,23 @@ where
185
187
let off = d. saturating_sub ( 1 ) . checked_mul ( s. abs ( ) as usize ) ?;
186
188
acc. checked_add ( off)
187
189
} )
190
+ // TODO More specific error
188
191
. ok_or_else ( || from_kind ( ErrorKind :: Overflow ) ) ?;
189
192
// Condition 2a.
190
193
if max_offset > isize:: MAX as usize {
194
+ // TODO More specific error
191
195
return Err ( from_kind ( ErrorKind :: Overflow ) ) ;
192
196
}
193
197
194
198
// Determine absolute difference in units of bytes between least and
195
199
// greatest address accessible by moving along all axes
196
200
let max_offset_bytes = max_offset
197
201
. checked_mul ( elem_size)
202
+ // TODO More specific error
198
203
. ok_or_else ( || from_kind ( ErrorKind :: Overflow ) ) ?;
199
204
// Condition 2b.
200
205
if max_offset_bytes > isize:: MAX as usize {
206
+ // TODO More specific error
201
207
return Err ( from_kind ( ErrorKind :: Overflow ) ) ;
202
208
}
203
209
@@ -256,15 +262,16 @@ fn can_index_slice_impl<D: Dimension>(
256
262
// Check condition 3.
257
263
let is_empty = dim. slice ( ) . iter ( ) . any ( |& d| d == 0 ) ;
258
264
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 ) ) ;
260
266
}
261
267
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 ) ) ;
263
269
}
264
270
265
271
// Check condition 4.
266
272
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 ) ) ;
268
275
}
269
276
270
277
Ok ( ( ) )
@@ -293,6 +300,7 @@ where
293
300
{
294
301
for & stride in strides. slice ( ) {
295
302
if ( stride as isize ) < 0 {
303
+ // TODO: More specific error kind Non-negative strides required
296
304
return Err ( from_kind ( ErrorKind :: Unsupported ) ) ;
297
305
}
298
306
}
0 commit comments