1
Fork 0

std: Implement FromIterator for ~str

FromIterator initially only implemented for Iterator<char>, which is the
type of the main iterator.
This commit is contained in:
blake2-ppc 2013-07-29 02:40:28 +02:00
parent 4cc3bbb83d
commit 4849a42bf6

View file

@ -23,7 +23,7 @@ use char::Char;
use clone::Clone;
use container::{Container, Mutable};
use iter::Times;
use iterator::{Iterator, IteratorUtil, FilterIterator, AdditiveIterator, MapIterator};
use iterator::{Iterator, FromIterator, IteratorUtil, FilterIterator, AdditiveIterator, MapIterator};
use libc;
use num::Zero;
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
impl<'self> Zero for &'self str {
fn zero() -> &'self str { "" }
@ -2482,6 +2494,16 @@ mod tests {
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]
fn test_clear() {
let mut empty = ~"";