Skip to content

Commit 94e093a

Browse files
authoredJan 29, 2021
Rollup merge of #81306 - SkiFire13:fuse-flatten, r=cuviper
Fuse inner iterator in FlattenCompat and improve related tests Fixes #81248
2 parents 788036d + 5aa625b commit 94e093a

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed
 

‎library/core/src/iter/adapters/flatten.rs

+14-2
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,13 @@ where
265265
}
266266
}
267267
match self.iter.next() {
268-
None => return self.backiter.as_mut()?.next(),
268+
None => match self.backiter.as_mut()?.next() {
269+
None => {
270+
self.backiter = None;
271+
return None;
272+
}
273+
elt @ Some(_) => return elt,
274+
},
269275
Some(inner) => self.frontiter = Some(inner.into_iter()),
270276
}
271277
}
@@ -353,7 +359,13 @@ where
353359
}
354360
}
355361
match self.iter.next_back() {
356-
None => return self.frontiter.as_mut()?.next_back(),
362+
None => match self.frontiter.as_mut()?.next_back() {
363+
None => {
364+
self.frontiter = None;
365+
return None;
366+
}
367+
elt @ Some(_) => return elt,
368+
},
357369
next => self.backiter = next.map(IntoIterator::into_iter),
358370
}
359371
}

‎library/core/tests/iter/adapters/flatten.rs

+17
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ fn test_flatten_non_fused_outer() {
6464
assert_eq!(iter.next_back(), Some(1));
6565
assert_eq!(iter.next(), Some(0));
6666
assert_eq!(iter.next(), None);
67+
assert_eq!(iter.next(), None);
68+
69+
let mut iter = NonFused::new(once(0..2)).flatten();
70+
71+
assert_eq!(iter.next(), Some(0));
72+
assert_eq!(iter.next_back(), Some(1));
73+
assert_eq!(iter.next_back(), None);
74+
assert_eq!(iter.next_back(), None);
6775
}
6876

6977
#[test]
@@ -74,6 +82,15 @@ fn test_flatten_non_fused_inner() {
7482
assert_eq!(iter.next(), Some(0));
7583
assert_eq!(iter.next(), Some(1));
7684
assert_eq!(iter.next(), None);
85+
assert_eq!(iter.next(), None);
86+
87+
let mut iter = once(0..1).chain(once(1..3)).flat_map(NonFused::new);
88+
89+
assert_eq!(iter.next(), Some(0));
90+
assert_eq!(iter.next_back(), Some(2));
91+
assert_eq!(iter.next_back(), Some(1));
92+
assert_eq!(iter.next_back(), None);
93+
assert_eq!(iter.next_back(), None);
7794
}
7895

7996
#[test]

0 commit comments

Comments
 (0)
Please sign in to comment.