about summary refs log tree commit diff
path: root/src/libextra/priority_queue.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libextra/priority_queue.rs')
-rw-r--r--src/libextra/priority_queue.rs21
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
     }
 }