Skip to content

Commit 180dcc3

Browse files
committed
Optimized string FromIterator impls
1 parent b866f7d commit 180dcc3

File tree

1 file changed

+23
-18
lines changed

1 file changed

+23
-18
lines changed

src/liballoc/string.rs

+23-18
Original file line numberDiff line numberDiff line change
@@ -1732,18 +1732,31 @@ impl<'a> FromIterator<&'a str> for String {
17321732
#[stable(feature = "extend_string", since = "1.4.0")]
17331733
impl FromIterator<String> for String {
17341734
fn from_iter<I: IntoIterator<Item = String>>(iter: I) -> String {
1735-
let mut buf = String::new();
1736-
buf.extend(iter);
1737-
buf
1735+
let iterator = iter.into_iter();
1736+
1737+
match iterator.next() {
1738+
None => String::new(),
1739+
Some(buf) => {
1740+
buf.extend(iterator);
1741+
buf
1742+
}
1743+
}
17381744
}
17391745
}
17401746

17411747
#[stable(feature = "herd_cows", since = "1.19.0")]
17421748
impl<'a> FromIterator<Cow<'a, str>> for String {
17431749
fn from_iter<I: IntoIterator<Item = Cow<'a, str>>>(iter: I) -> String {
1744-
let mut buf = String::new();
1745-
buf.extend(iter);
1746-
buf
1750+
let iterator = iter.into_iter();
1751+
1752+
match iterator.next() {
1753+
None => String::new(),
1754+
Some(cow) => {
1755+
let buf = cow.into_owned();
1756+
buf.extend(iterator);
1757+
buf
1758+
}
1759+
}
17471760
}
17481761
}
17491762

@@ -1753,9 +1766,7 @@ impl Extend<char> for String {
17531766
let iterator = iter.into_iter();
17541767
let (lower_bound, _) = iterator.size_hint();
17551768
self.reserve(lower_bound);
1756-
for ch in iterator {
1757-
self.push(ch)
1758-
}
1769+
iterator.for_each(move |c| self.push(c));
17591770
}
17601771
}
17611772

@@ -1769,27 +1780,21 @@ impl<'a> Extend<&'a char> for String {
17691780
#[stable(feature = "rust1", since = "1.0.0")]
17701781
impl<'a> Extend<&'a str> for String {
17711782
fn extend<I: IntoIterator<Item = &'a str>>(&mut self, iter: I) {
1772-
for s in iter {
1773-
self.push_str(s)
1774-
}
1783+
iter.into_iter().for_each(move |s| self.push_str(s));
17751784
}
17761785
}
17771786

17781787
#[stable(feature = "extend_string", since = "1.4.0")]
17791788
impl Extend<String> for String {
17801789
fn extend<I: IntoIterator<Item = String>>(&mut self, iter: I) {
1781-
for s in iter {
1782-
self.push_str(&s)
1783-
}
1790+
iter.into_iter().for_each(move |s| self.push_str(&s));
17841791
}
17851792
}
17861793

17871794
#[stable(feature = "herd_cows", since = "1.19.0")]
17881795
impl<'a> Extend<Cow<'a, str>> for String {
17891796
fn extend<I: IntoIterator<Item = Cow<'a, str>>>(&mut self, iter: I) {
1790-
for s in iter {
1791-
self.push_str(&s)
1792-
}
1797+
iter.into_iter().for_each(move |s| self.push_str(&s));
17931798
}
17941799
}
17951800

0 commit comments

Comments
 (0)