diff options
Diffstat (limited to 'src/libextra/priority_queue.rs')
| -rw-r--r-- | src/libextra/priority_queue.rs | 21 |
1 files changed, 14 insertions, 7 deletions
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 } } |
