diff --git a/src/libcollections/string.rs b/src/libcollections/string.rs index fbb0bb5c4ce86..0f567caaee17b 100644 --- a/src/libcollections/string.rs +++ b/src/libcollections/string.rs @@ -729,15 +729,38 @@ impl FromIterator for String { } } +#[experimental = "waiting on FromIterator stabilization"] +impl<'a> FromIterator<&'a str> for String { + fn from_iter>(iterator: I) -> String { + let mut buf = String::new(); + buf.extend(iterator); + buf + } +} + #[experimental = "waiting on Extend stabilization"] impl Extend for String { fn extend>(&mut self, mut iterator: I) { + let (lower_bound, _) = iterator.size_hint(); + self.reserve(lower_bound); for ch in iterator { self.push(ch) } } } +#[experimental = "waiting on Extend stabilization"] +impl<'a> Extend<&'a str> for String { + fn extend>(&mut self, mut iterator: I) { + // A guess that at least one byte per iterator element will be needed. + let (lower_bound, _) = iterator.size_hint(); + self.reserve(lower_bound); + for s in iterator { + self.push_str(s) + } + } +} + impl PartialEq for String { #[inline] fn eq(&self, other: &String) -> bool { PartialEq::eq(&**self, &**other) } @@ -1307,6 +1330,27 @@ mod tests { "[[], [1], [1, 1]]".to_string()); } + #[test] + fn test_from_iterator() { + let s = "ศไทย中华Việt Nam".to_string(); + let t = "ศไทย中华"; + let u = "Việt Nam"; + + let a: String = s.chars().collect(); + assert_eq!(s, a); + + let mut b = t.to_string(); + b.extend(u.chars()); + assert_eq!(s, b); + + let c: String = vec![t, u].into_iter().collect(); + assert_eq!(s, c); + + let mut d = t.to_string(); + d.extend(vec![u].into_iter()); + assert_eq!(s, d); + } + #[bench] fn bench_with_capacity(b: &mut Bencher) { b.iter(|| {