Skip to content

Commit 55aca3b

Browse files
authored
Merge pull request #575 from jturner314/improve-do-slice
Improve do_slice
2 parents 27c84a5 + 358c8d9 commit 55aca3b

File tree

1 file changed

+12
-8
lines changed

1 file changed

+12
-8
lines changed

src/dimension/mod.rs

+12-8
Original file line numberDiff line numberDiff line change
@@ -380,15 +380,19 @@ pub fn do_slice(dim: &mut usize, stride: &mut usize, slice: Slice) -> isize {
380380
offset += stride_offset(m - 1, *stride);
381381
}
382382

383-
let s_prim = s * step;
384-
385-
let d = m / step.abs() as usize;
386-
let r = m % step.abs() as usize;
387-
let m_prim = d + if r > 0 { 1 } else { 0 };
383+
// Update dimension.
384+
let abs_step = step.abs() as usize;
385+
*dim = if abs_step == 1 {
386+
m
387+
} else {
388+
let d = m / abs_step;
389+
let r = m % abs_step;
390+
d + if r > 0 { 1 } else { 0 }
391+
};
388392

389-
// Update dimension and stride coordinate
390-
*dim = m_prim;
391-
*stride = s_prim as usize;
393+
// Update stride. The additional check is necessary to avoid possible
394+
// overflow in the multiplication.
395+
*stride = if *dim <= 1 { 0 } else { (s * step) as usize };
392396

393397
offset
394398
}

0 commit comments

Comments
 (0)