iterator: add a FromIterator trait
This is able to take advantage of the lower bound from the size hint.
This commit is contained in:
parent
468cbd9d01
commit
c9342663df
2 changed files with 20 additions and 2 deletions
|
@ -27,6 +27,12 @@ use ops::{Add, Mul};
|
||||||
use cmp::Ord;
|
use cmp::Ord;
|
||||||
use clone::Clone;
|
use clone::Clone;
|
||||||
|
|
||||||
|
/// Conversion from an `Iterator`
|
||||||
|
pub trait FromIterator<A, T: Iterator<A>> {
|
||||||
|
/// Build a container with elements from an external iterator.
|
||||||
|
pub fn from_iterator(iterator: &mut T) -> Self;
|
||||||
|
}
|
||||||
|
|
||||||
/// An interface for dealing with "external iterators". These types of iterators
|
/// An interface for dealing with "external iterators". These types of iterators
|
||||||
/// can be resumed at any time as all state is stored internally as opposed to
|
/// can be resumed at any time as all state is stored internally as opposed to
|
||||||
/// being located on the call stack.
|
/// being located on the call stack.
|
||||||
|
@ -931,7 +937,7 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_counter_from_iter() {
|
fn test_counter_from_iter() {
|
||||||
let mut it = Counter::new(0, 5).take_(10);
|
let mut it = Counter::new(0, 5).take_(10);
|
||||||
let xs: ~[int] = iter::FromIter::from_iter::<int, ~[int]>(|f| it.advance(f));
|
let xs: ~[int] = FromIterator::from_iterator(&mut it);
|
||||||
assert_eq!(xs, ~[0, 5, 10, 15, 20, 25, 30, 35, 40, 45]);
|
assert_eq!(xs, ~[0, 5, 10, 15, 20, 25, 30, 35, 40, 45]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ use cmp::{Eq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater};
|
||||||
use clone::Clone;
|
use clone::Clone;
|
||||||
use old_iter::BaseIter;
|
use old_iter::BaseIter;
|
||||||
use old_iter;
|
use old_iter;
|
||||||
use iterator::{Iterator, IteratorUtil};
|
use iterator::{FromIterator, Iterator, IteratorUtil};
|
||||||
use iter::FromIter;
|
use iter::FromIter;
|
||||||
use kinds::Copy;
|
use kinds::Copy;
|
||||||
use libc;
|
use libc;
|
||||||
|
@ -2511,6 +2511,18 @@ impl<T> FromIter<T> for ~[T]{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(stage0))]
|
||||||
|
impl<A, T: Iterator<A>> FromIterator<A, T> for ~[A] {
|
||||||
|
pub fn from_iterator(iterator: &mut T) -> ~[A] {
|
||||||
|
let (lower, _) = iterator.size_hint();
|
||||||
|
let mut xs = with_capacity(lower.get_or_zero());
|
||||||
|
for iterator.advance |x| {
|
||||||
|
xs.push(x);
|
||||||
|
}
|
||||||
|
xs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use option::{None, Option, Some};
|
use option::{None, Option, Some};
|
||||||
|
|
Loading…
Reference in a new issue