Skip to content

Commit 64926da

Browse files
authored
Rollup merge of rust-lang#59740 - cuviper:folded-extend, r=scottmcm
Use for_each to extend collections This updates the `Extend` implementations to use `for_each` for many collections: `BinaryHeap`, `BTreeMap`, `BTreeSet`, `LinkedList`, `Path`, `TokenStream`, `VecDeque`, and `Wtf8Buf`. Folding with `for_each` enables better performance than a `for`-loop for some iterators, especially if they can just forward to internal iterators, like `Chain` and `FlatMap` do.
2 parents 46c5015 + 0730a01 commit 64926da

File tree

8 files changed

+10
-22
lines changed

8 files changed

+10
-22
lines changed

src/liballoc/collections/binary_heap.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -1177,9 +1177,7 @@ impl<T: Ord> BinaryHeap<T> {
11771177

11781178
self.reserve(lower);
11791179

1180-
for elem in iterator {
1181-
self.push(elem);
1182-
}
1180+
iterator.for_each(move |elem| self.push(elem));
11831181
}
11841182
}
11851183

src/liballoc/collections/btree/map.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1727,9 +1727,9 @@ impl<K: Ord, V> FromIterator<(K, V)> for BTreeMap<K, V> {
17271727
impl<K: Ord, V> Extend<(K, V)> for BTreeMap<K, V> {
17281728
#[inline]
17291729
fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
1730-
for (k, v) in iter {
1730+
iter.into_iter().for_each(move |(k, v)| {
17311731
self.insert(k, v);
1732-
}
1732+
});
17331733
}
17341734
}
17351735

src/liballoc/collections/btree/set.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -883,9 +883,9 @@ impl<'a, T> IntoIterator for &'a BTreeSet<T> {
883883
impl<T: Ord> Extend<T> for BTreeSet<T> {
884884
#[inline]
885885
fn extend<Iter: IntoIterator<Item = T>>(&mut self, iter: Iter) {
886-
for elem in iter {
886+
iter.into_iter().for_each(move |elem| {
887887
self.insert(elem);
888-
}
888+
});
889889
}
890890
}
891891

src/liballoc/collections/linked_list.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -1107,9 +1107,7 @@ impl<T> Extend<T> for LinkedList<T> {
11071107

11081108
impl<I: IntoIterator> SpecExtend<I> for LinkedList<I::Item> {
11091109
default fn spec_extend(&mut self, iter: I) {
1110-
for elt in iter {
1111-
self.push_back(elt);
1112-
}
1110+
iter.into_iter().for_each(move |elt| self.push_back(elt));
11131111
}
11141112
}
11151113

src/liballoc/collections/vec_deque.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -2677,9 +2677,7 @@ impl<'a, T> IntoIterator for &'a mut VecDeque<T> {
26772677
#[stable(feature = "rust1", since = "1.0.0")]
26782678
impl<A> Extend<A> for VecDeque<A> {
26792679
fn extend<T: IntoIterator<Item = A>>(&mut self, iter: T) {
2680-
for elt in iter {
2681-
self.push_back(elt);
2682-
}
2680+
iter.into_iter().for_each(move |elt| self.push_back(elt));
26832681
}
26842682
}
26852683

src/libproc_macro/lib.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,7 @@ impl iter::FromIterator<TokenTree> for TokenStream {
160160
impl iter::FromIterator<TokenStream> for TokenStream {
161161
fn from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self {
162162
let mut builder = bridge::client::TokenStreamBuilder::new();
163-
for stream in streams {
164-
builder.push(stream.0);
165-
}
163+
streams.into_iter().for_each(|stream| builder.push(stream.0));
166164
TokenStream(builder.build())
167165
}
168166
}

src/libstd/path.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -1551,9 +1551,7 @@ impl<P: AsRef<Path>> iter::FromIterator<P> for PathBuf {
15511551
#[stable(feature = "rust1", since = "1.0.0")]
15521552
impl<P: AsRef<Path>> iter::Extend<P> for PathBuf {
15531553
fn extend<I: IntoIterator<Item = P>>(&mut self, iter: I) {
1554-
for p in iter {
1555-
self.push(p.as_ref())
1556-
}
1554+
iter.into_iter().for_each(move |p| self.push(p.as_ref()));
15571555
}
15581556
}
15591557

src/libstd/sys_common/wtf8.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -388,9 +388,7 @@ impl Extend<CodePoint> for Wtf8Buf {
388388
let (low, _high) = iterator.size_hint();
389389
// Lower bound of one byte per code point (ASCII only)
390390
self.bytes.reserve(low);
391-
for code_point in iterator {
392-
self.push(code_point);
393-
}
391+
iterator.for_each(move |code_point| self.push(code_point));
394392
}
395393
}
396394

0 commit comments

Comments
 (0)