diff options
| author | blake2-ppc <blake2-ppc> | 2013-07-30 02:06:49 +0200 |
|---|---|---|
| committer | blake2-ppc <blake2-ppc> | 2013-07-30 02:06:49 +0200 |
| commit | f8ae526f707c9a9e0540b80209838d2e75dc960b (patch) | |
| tree | 9b01ce63dd1fc07cec2a118a855a3b227eb971d0 | |
| parent | f68621326ec295de6fd383a5230b807049ec4820 (diff) | |
| download | rust-f8ae526f707c9a9e0540b80209838d2e75dc960b.tar.gz rust-f8ae526f707c9a9e0540b80209838d2e75dc960b.zip | |
extra: Implement iterator::Extendable
| -rw-r--r-- | src/libextra/dlist.rs | 10 | ||||
| -rw-r--r-- | src/libextra/priority_queue.rs | 21 | ||||
| -rw-r--r-- | src/libextra/ringbuf.rs | 15 | ||||
| -rw-r--r-- | src/libextra/treemap.rs | 26 |
4 files changed, 51 insertions, 21 deletions
diff --git a/src/libextra/dlist.rs b/src/libextra/dlist.rs index b8ba7e58f2a..88159ce5552 100644 --- a/src/libextra/dlist.rs +++ b/src/libextra/dlist.rs @@ -25,7 +25,7 @@ use std::cast; use std::ptr; use std::util; -use std::iterator::{FromIterator, Invert}; +use std::iterator::{FromIterator, Extendable, Invert}; use container::Deque; @@ -541,11 +541,17 @@ impl<A> DoubleEndedIterator<A> for ConsumeIterator<A> { impl<A, T: Iterator<A>> FromIterator<A, T> for DList<A> { fn from_iterator(iterator: &mut T) -> DList<A> { let mut ret = DList::new(); - for iterator.advance |elt| { ret.push_back(elt); } + ret.extend(iterator); ret } } +impl<A, T: Iterator<A>> Extendable<A, T> for DList<A> { + fn extend(&mut self, iterator: &mut T) { + for iterator.advance |elt| { self.push_back(elt); } + } +} + impl<A: Eq> Eq for DList<A> { fn eq(&self, other: &DList<A>) -> bool { self.len() == other.len() && diff --git a/src/libextra/priority_queue.rs b/src/libextra/priority_queue.rs index dd24a2a9eb9..1c92a4f34e5 100644 --- a/src/libextra/priority_queue.rs +++ b/src/libextra/priority_queue.rs @@ -16,7 +16,7 @@ use std::clone::Clone; use std::unstable::intrinsics::{move_val_init, init}; use std::util::{replace, swap}; use std::vec; -use std::iterator::FromIterator; +use std::iterator::{FromIterator, Extendable}; /// A priority queue implemented with a binary heap #[deriving(Clone)] @@ -191,17 +191,24 @@ impl<'self, T> Iterator<&'self T> for PriorityQueueIterator<'self, T> { } impl<T: Ord, Iter: Iterator<T>> FromIterator<T, Iter> for PriorityQueue<T> { - pub fn from_iterator(iter: &mut Iter) -> PriorityQueue<T> { + fn from_iterator(iter: &mut Iter) -> PriorityQueue<T> { + let mut q = PriorityQueue::new(); + q.extend(iter); + + q + } +} + +impl<T: Ord, Iter: Iterator<T>> Extendable<T, Iter> for PriorityQueue<T> { + fn extend(&mut self, iter: &mut Iter) { let (lower, _) = iter.size_hint(); - let mut q = PriorityQueue::new(); - q.reserve_at_least(lower); + let len = self.capacity(); + self.reserve_at_least(len + lower); for iter.advance |elem| { - q.push(elem); + self.push(elem); } - - q } } diff --git a/src/libextra/ringbuf.rs b/src/libextra/ringbuf.rs index 90f37cbf526..92183f22d3b 100644 --- a/src/libextra/ringbuf.rs +++ b/src/libextra/ringbuf.rs @@ -16,7 +16,7 @@ use std::num; use std::uint; use std::vec; -use std::iterator::{FromIterator, Invert, RandomAccessIterator}; +use std::iterator::{FromIterator, Invert, RandomAccessIterator, Extendable}; use container::Deque; @@ -325,11 +325,18 @@ impl<A: Eq> Eq for RingBuf<A> { impl<A, T: Iterator<A>> FromIterator<A, T> for RingBuf<A> { fn from_iterator(iterator: &mut T) -> RingBuf<A> { - let mut deq = RingBuf::new(); + let (lower, _) = iterator.size_hint(); + let mut deq = RingBuf::with_capacity(lower); + deq.extend(iterator); + deq + } +} + +impl<A, T: Iterator<A>> Extendable<A, T> for RingBuf<A> { + fn extend(&mut self, iterator: &mut T) { for iterator.advance |elt| { - deq.push_back(elt); + self.push_back(elt); } - deq } } diff --git a/src/libextra/treemap.rs b/src/libextra/treemap.rs index 8c7ace56412..6148e14b79f 100644 --- a/src/libextra/treemap.rs +++ b/src/libextra/treemap.rs @@ -15,7 +15,7 @@ use std::num; use std::util::{swap, replace}; -use std::iterator::FromIterator; +use std::iterator::{FromIterator, Extendable}; // This is implemented as an AA tree, which is a simplified variation of // a red-black tree where red (horizontal) nodes can only be added @@ -753,26 +753,36 @@ fn remove<K: TotalOrd, V>(node: &mut Option<~TreeNode<K, V>>, } impl<K: TotalOrd, V, T: Iterator<(K, V)>> FromIterator<(K, V), T> for TreeMap<K, V> { - pub fn from_iterator(iter: &mut T) -> TreeMap<K, V> { + fn from_iterator(iter: &mut T) -> TreeMap<K, V> { let mut map = TreeMap::new(); + map.extend(iter); + map + } +} +impl<K: TotalOrd, V, T: Iterator<(K, V)>> Extendable<(K, V), T> for TreeMap<K, V> { + #[inline] + fn extend(&mut self, iter: &mut T) { for iter.advance |(k, v)| { - map.insert(k, v); + self.insert(k, v); } - - map } } impl<T: TotalOrd, Iter: Iterator<T>> FromIterator<T, Iter> for TreeSet<T> { pub fn from_iterator(iter: &mut Iter) -> TreeSet<T> { let mut set = TreeSet::new(); + set.extend(iter); + set + } +} +impl<T: TotalOrd, Iter: Iterator<T>> Extendable<T, Iter> for TreeSet<T> { + #[inline] + fn extend(&mut self, iter: &mut Iter) { for iter.advance |elem| { - set.insert(elem); + self.insert(elem); } - - set } } |
