Skip to content

Commit

Permalink
Auto merge of #27956 - withoutboats:extend_string, r=alexcrichton
Browse files Browse the repository at this point in the history
If you have an `Iterator<Item=String>` (say because those items were generated using `.to_string()` or similarly), borrow semantics do not permit you map that to an `Iterator<&'a str>`. These two implementations close a small gap in the `String` API.

At the same time I've also made the names of the parameters to `String`'s `Extend` and `FromIterator` implementations consistent.
  • Loading branch information
bors committed Aug 28, 2015
2 parents 8dba06a + 8af543a commit 20a8412
Showing 1 changed file with 24 additions and 6 deletions.
30 changes: 24 additions & 6 deletions src/libcollections/string.rs
Original file line number Diff line number Diff line change
Expand Up @@ -768,18 +768,27 @@ impl fmt::Display for FromUtf16Error {

#[stable(feature = "rust1", since = "1.0.0")]
impl FromIterator<char> for String {
fn from_iter<I: IntoIterator<Item=char>>(iter: I) -> String {
fn from_iter<I: IntoIterator<Item=char>>(iterable: I) -> String {
let mut buf = String::new();
buf.extend(iter);
buf.extend(iterable);
buf
}
}

#[stable(feature = "rust1", since = "1.0.0")]
impl<'a> FromIterator<&'a str> for String {
fn from_iter<I: IntoIterator<Item=&'a str>>(iter: I) -> String {
fn from_iter<I: IntoIterator<Item=&'a str>>(iterable: I) -> String {
let mut buf = String::new();
buf.extend(iter);
buf.extend(iterable);
buf
}
}

#[stable(feature = "extend_string", since = "1.4.0")]
impl FromIterator<String> for String {
fn from_iter<I: IntoIterator<Item=String>>(iterable: I) -> String {
let mut buf = String::new();
buf.extend(iterable);
buf
}
}
Expand All @@ -798,8 +807,8 @@ impl Extend<char> for String {

#[stable(feature = "extend_ref", since = "1.2.0")]
impl<'a> Extend<&'a char> for String {
fn extend<I: IntoIterator<Item=&'a char>>(&mut self, iter: I) {
self.extend(iter.into_iter().cloned());
fn extend<I: IntoIterator<Item=&'a char>>(&mut self, iterable: I) {
self.extend(iterable.into_iter().cloned());
}
}

Expand All @@ -812,6 +821,15 @@ impl<'a> Extend<&'a str> for String {
}
}

#[stable(feature = "extend_string", since = "1.4.0")]
impl Extend<String> for String {
fn extend<I: IntoIterator<Item=String>>(&mut self, iterable: I) {
for s in iterable {
self.push_str(&s)
}
}
}

/// A convenience impl that delegates to the impl for `&str`
impl<'a, 'b> Pattern<'a> for &'b String {
type Searcher = <&'b str as Pattern<'a>>::Searcher;
Expand Down

0 comments on commit 20a8412

Please sign in to comment.