iterator: implement collect with FromIterator
This makes it take advantage of the size hint for pre-allocation.
This commit is contained in:
@@ -20,7 +20,7 @@ implementing the `Iterator` trait.
|
|||||||
#[allow(default_methods)]; // solid enough for the use case here
|
#[allow(default_methods)]; // solid enough for the use case here
|
||||||
|
|
||||||
use cmp;
|
use cmp;
|
||||||
use iter::{FromIter, Times};
|
use iter::Times;
|
||||||
use num::{Zero, One};
|
use num::{Zero, One};
|
||||||
use option::{Option, Some, None};
|
use option::{Option, Some, None};
|
||||||
use ops::{Add, Mul};
|
use ops::{Add, Mul};
|
||||||
@@ -240,7 +240,7 @@ pub trait IteratorUtil<A> {
|
|||||||
fn advance(&mut self, f: &fn(A) -> bool) -> bool;
|
fn advance(&mut self, f: &fn(A) -> bool) -> bool;
|
||||||
|
|
||||||
/// Loops through the entire iterator, collecting all of the elements into
|
/// Loops through the entire iterator, collecting all of the elements into
|
||||||
/// a container implementing `FromIter`.
|
/// a container implementing `FromIterator`.
|
||||||
///
|
///
|
||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
@@ -249,7 +249,7 @@ pub trait IteratorUtil<A> {
|
|||||||
/// let b: ~[int] = a.iter().transform(|&x| x).collect();
|
/// let b: ~[int] = a.iter().transform(|&x| x).collect();
|
||||||
/// assert!(a == b);
|
/// assert!(a == b);
|
||||||
/// ~~~
|
/// ~~~
|
||||||
fn collect<B: FromIter<A>>(&mut self) -> B;
|
fn collect<B: FromIterator<A, Self>>(&mut self) -> B;
|
||||||
|
|
||||||
/// Loops through `n` iterations, returning the `n`th element of the
|
/// Loops through `n` iterations, returning the `n`th element of the
|
||||||
/// iterator.
|
/// iterator.
|
||||||
@@ -411,8 +411,8 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn collect<B: FromIter<A>>(&mut self) -> B {
|
fn collect<B: FromIterator<A, T>>(&mut self) -> B {
|
||||||
FromIter::from_iter::<A, B>(|f| self.advance(f))
|
FromIterator::from_iterator(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the `n`th item yielded by an iterator.
|
/// Return the `n`th item yielded by an iterator.
|
||||||
|
|||||||
@@ -2500,6 +2500,17 @@ impl<T> FromIter<T> for ~[T]{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(stage0)]
|
||||||
|
impl<A, T: Iterator<A>> FromIterator<A, T> for ~[A] {
|
||||||
|
pub fn from_iterator(iterator: &mut T) -> ~[A] {
|
||||||
|
let mut xs = ~[];
|
||||||
|
for iterator.advance |x| {
|
||||||
|
xs.push(x);
|
||||||
|
}
|
||||||
|
xs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(not(stage0))]
|
#[cfg(not(stage0))]
|
||||||
impl<A, T: Iterator<A>> FromIterator<A, T> for ~[A] {
|
impl<A, T: Iterator<A>> FromIterator<A, T> for ~[A] {
|
||||||
pub fn from_iterator(iterator: &mut T) -> ~[A] {
|
pub fn from_iterator(iterator: &mut T) -> ~[A] {
|
||||||
|
|||||||
Reference in New Issue
Block a user