Skip to content

Commit b84a662

Browse files
bors[bot]yegeunyangcuviper
committed
617: Handle the last chunk correctly r=nikomatsakis a=yegeun542 Minor change in ChunksMutProducer. `split_at` function currently panics when the last chunk is shorter than the other chunks. Co-authored-by: yyang542 <[email protected]> Co-authored-by: Josh Stone <[email protected]>
2 parents a902c03 + b6cc1c9 commit b84a662

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed

src/slice/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ impl<'data, T: 'data + Sync> Producer for ChunksProducer<'data, T> {
571571
}
572572

573573
fn split_at(self, index: usize) -> (Self, Self) {
574-
let elem_index = index * self.chunk_size;
574+
let elem_index = cmp::min(index * self.chunk_size, self.slice.len());
575575
let (left, right) = self.slice.split_at(elem_index);
576576
(
577577
ChunksProducer {
@@ -789,7 +789,7 @@ impl<'data, T: 'data + Send> Producer for ChunksMutProducer<'data, T> {
789789
}
790790

791791
fn split_at(self, index: usize) -> (Self, Self) {
792-
let elem_index = index * self.chunk_size;
792+
let elem_index = cmp::min(index * self.chunk_size, self.slice.len());
793793
let (left, right) = self.slice.split_at_mut(elem_index);
794794
(
795795
ChunksMutProducer {

tests/producer_split_at.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -162,20 +162,23 @@ fn slice_iter_mut() {
162162
#[test]
163163
fn slice_chunks() {
164164
let s: Vec<_> = (0..10).collect();
165-
let v: Vec<_> = s.chunks(2).collect();
166-
check(&v, || s.par_chunks(2));
165+
for len in 1..s.len() + 2 {
166+
let v: Vec<_> = s.chunks(len).collect();
167+
check(&v, || s.par_chunks(len));
168+
}
167169
}
168170

169171
#[test]
170172
fn slice_chunks_mut() {
171173
let mut s: Vec<_> = (0..10).collect();
172174
let mut v: Vec<_> = s.clone();
173-
let expected: Vec<_> = v.chunks_mut(2).collect();
174-
175-
map_triples(expected.len() + 1, |i, j, k| {
176-
Split::forward(s.par_chunks_mut(2), i, j, k, &expected);
177-
Split::reverse(s.par_chunks_mut(2), i, j, k, &expected);
178-
});
175+
for len in 1..s.len() + 2 {
176+
let expected: Vec<_> = v.chunks_mut(len).collect();
177+
map_triples(expected.len() + 1, |i, j, k| {
178+
Split::forward(s.par_chunks_mut(len), i, j, k, &expected);
179+
Split::reverse(s.par_chunks_mut(len), i, j, k, &expected);
180+
});
181+
}
179182
}
180183

181184
#[test]

0 commit comments

Comments
 (0)