Skip to content

Commit 6054658

Browse files
committed
Use v.for_each(|elem| ...) instead of for elem in v in Vec::extend_desugared`.
This makes use of specialized Iterator methods (when available).
1 parent 6bc90aa commit 6054658

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

src/liballoc/vec.rs

+8-7
Original file line numberDiff line numberDiff line change
@@ -1918,26 +1918,27 @@ impl<'a, T: 'a> SpecExtend<&'a T, slice::Iter<'a, T>> for Vec<T>
19181918
}
19191919

19201920
impl<T> Vec<T> {
1921-
fn extend_desugared<I: Iterator<Item = T>>(&mut self, mut iterator: I) {
1921+
fn extend_desugared<I: Iterator<Item = T>>(&mut self, iterator: I) {
19221922
// This is the case for a general iterator.
19231923
//
19241924
// This function should be the moral equivalent of:
19251925
//
19261926
// for item in iterator {
19271927
// self.push(item);
19281928
// }
1929-
while let Some(element) = iterator.next() {
1929+
let (lower, _) = iterator.size_hint();
1930+
self.reserve(lower);
1931+
// rust-lang/rust#59605: `for_each` call leverages specialized
1932+
// override, if any, of `for_each` or `fold` for Iterator `I`.
1933+
iterator.for_each(|element| {
19301934
let len = self.len();
1931-
if len == self.capacity() {
1932-
let (lower, _) = iterator.size_hint();
1933-
self.reserve(lower.saturating_add(1));
1934-
}
1935+
if len == self.capacity() { self.reserve(1); }
19351936
unsafe {
19361937
ptr::write(self.get_unchecked_mut(len), element);
19371938
// NB can't overflow since we would have had to alloc the address space
19381939
self.set_len(len + 1);
19391940
}
1940-
}
1941+
});
19411942
}
19421943

19431944
/// Creates a splicing iterator that replaces the specified range in the vector

0 commit comments

Comments
 (0)