auto merge of #8100 : blake2-ppc/rust/str-collect, r=pcwalton

FromIterator initially only implemented for Iterator<char>, which is the
type of the main iterator.
This commit is contained in:
bors 2013-07-28 18:49:24 -07:00
commit 52dbe138cf

View File

@ -23,7 +23,7 @@ use char::Char;
use clone::Clone; use clone::Clone;
use container::{Container, Mutable}; use container::{Container, Mutable};
use iter::Times; use iter::Times;
use iterator::{Iterator, IteratorUtil, FilterIterator, AdditiveIterator, MapIterator}; use iterator::{Iterator, FromIterator, IteratorUtil, FilterIterator, AdditiveIterator, MapIterator};
use libc; use libc;
use num::Zero; use num::Zero;
use option::{None, Option, Some}; use option::{None, Option, Some};
@ -2319,6 +2319,18 @@ impl<'self> Iterator<u8> for BytesRevIterator<'self> {
} }
} }
impl<T: Iterator<char>> FromIterator<char, T> for ~str {
#[inline]
fn from_iterator(iterator: &mut T) -> ~str {
let (lower, _) = iterator.size_hint();
let mut buf = with_capacity(lower);
for iterator.advance |ch| {
buf.push_char(ch)
}
buf
}
}
// This works because every lifetime is a sub-lifetime of 'static // This works because every lifetime is a sub-lifetime of 'static
impl<'self> Zero for &'self str { impl<'self> Zero for &'self str {
fn zero() -> &'self str { "" } fn zero() -> &'self str { "" }
@ -2482,6 +2494,16 @@ mod tests {
assert_eq!(~"华ประเทศไทย中", data); assert_eq!(~"华ประเทศไทย中", data);
} }
#[test]
fn test_collect() {
let empty = "";
let s: ~str = empty.iter().collect();
assert_eq!(empty, s.as_slice());
let data = "ประเทศไทย中";
let s: ~str = data.iter().collect();
assert_eq!(data, s.as_slice());
}
#[test] #[test]
fn test_clear() { fn test_clear() {
let mut empty = ~""; let mut empty = ~"";