diff options
| author | Daniel Micay <danielmicay@gmail.com> | 2013-07-27 17:41:30 -0400 |
|---|---|---|
| committer | Daniel Micay <danielmicay@gmail.com> | 2013-07-27 17:42:10 -0400 |
| commit | fe955e7b062f8787f9df7e9c36abc1b83485fead (patch) | |
| tree | 00e2aedcb998550105a3a401cad284599b3091d5 /src/libstd | |
| parent | ffe549daf5b718226490b9e0b677d9876c807f4e (diff) | |
| download | rust-fe955e7b062f8787f9df7e9c36abc1b83485fead.tar.gz rust-fe955e7b062f8787f9df7e9c36abc1b83485fead.zip | |
iterator: add an Extendable trait
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/iterator.rs | 6 | ||||
| -rw-r--r-- | src/libstd/vec.rs | 13 |
2 files changed, 18 insertions, 1 deletions
diff --git a/src/libstd/iterator.rs b/src/libstd/iterator.rs index a6460935a50..2ec8ea41bfb 100644 --- a/src/libstd/iterator.rs +++ b/src/libstd/iterator.rs @@ -32,6 +32,12 @@ pub trait FromIterator<A, T: Iterator<A>> { fn from_iterator(iterator: &mut T) -> Self; } +/// A type growable from an `Iterator` implementation +pub trait Extendable<A, T: Iterator<A>>: FromIterator<A, T> { + /// Extend a container with the elements yielded by an iterator + fn extend(&mut self, iterator: &mut T); +} + /// 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 /// being located on the call stack. diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index f08283b17ff..379deff233c 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -2224,7 +2224,7 @@ impl<T> Iterator<T> for VecConsumeRevIterator<T> { } impl<A, T: Iterator<A>> FromIterator<A, T> for ~[A] { - pub fn from_iterator(iterator: &mut T) -> ~[A] { + fn from_iterator(iterator: &mut T) -> ~[A] { let (lower, _) = iterator.size_hint(); let mut xs = with_capacity(lower); for iterator.advance |x| { @@ -2234,6 +2234,17 @@ impl<A, T: Iterator<A>> FromIterator<A, T> for ~[A] { } } +impl<A, T: Iterator<A>> Extendable<A, T> for ~[A] { + fn extend(&mut self, iterator: &mut T) { + let (lower, _) = iterator.size_hint(); + let len = self.len(); + self.reserve(len + lower); + for iterator.advance |x| { + self.push(x); + } + } +} + #[cfg(test)] mod tests { use option::{None, Option, Some}; |
