about summary refs log tree commit diff
path: root/src/libstd/priority_queue.rs
diff options
context:
space:
mode:
authorDaniel Micay <danielmicay@gmail.com>2012-12-11 10:57:37 -0500
committerBrian Anderson <banderson@mozilla.com>2012-12-16 19:27:06 -0800
commite00c3b05e110ab4b3cf6d60e29c59fad2b5921d6 (patch)
treec51a4c436e93e38b340c8f8e84135a691412bb35 /src/libstd/priority_queue.rs
parent8b13bf75306d7b5645531a0eb273b9ce9805e009 (diff)
downloadrust-e00c3b05e110ab4b3cf6d60e29c59fad2b5921d6.tar.gz
rust-e00c3b05e110ab4b3cf6d60e29c59fad2b5921d6.zip
priority_queue: fix to_sorted_vec off-by-one error
Diffstat (limited to 'src/libstd/priority_queue.rs')
-rw-r--r--src/libstd/priority_queue.rs36
1 files changed, 23 insertions, 13 deletions
diff --git a/src/libstd/priority_queue.rs b/src/libstd/priority_queue.rs
index ab274970ab3..35d238b4d7c 100644
--- a/src/libstd/priority_queue.rs
+++ b/src/libstd/priority_queue.rs
@@ -78,10 +78,10 @@ impl <T: Copy Ord> PriorityQueue<T> {
     /// Consume the PriorityQueue and return a vector in sorted (ascending) order
     pure fn to_sorted_vec(self) -> ~[T] {
         let mut q = self;
-        let mut end = q.len() - 1;
-        while end > 0 {
-            q.data[end] <-> q.data[0];
+        let mut end = q.len();
+        while end > 1 {
             end -= 1;
+            q.data[end] <-> q.data[0];
             unsafe { q.siftup_range(0, end) } // purity-checking workaround
         }
         q.to_vec()
@@ -206,10 +206,27 @@ mod tests {
         assert heap.len() == 5;
     }
 
+    fn check_to_vec(data: ~[int]) {
+        let heap = from_vec(data);
+        assert merge_sort(heap.to_vec(), le) == merge_sort(data, le);
+        assert heap.to_sorted_vec() == merge_sort(data, le);
+    }
+
     #[test]
-    fn test_to_sorted_vec() {
-        let data = ~[2, 4, 6, 2, 1, 8, 10, 3, 5, 7, 0, 9, 1];
-        assert from_vec(data).to_sorted_vec() == merge_sort(data, le);
+    fn test_to_vec() {
+        check_to_vec(~[]);
+        check_to_vec(~[5]);
+        check_to_vec(~[3, 2]);
+        check_to_vec(~[2, 3]);
+        check_to_vec(~[5, 1, 2]);
+        check_to_vec(~[1, 100, 2, 3]);
+        check_to_vec(~[1, 3, 5, 7, 9, 2, 4, 6, 8, 0]);
+        check_to_vec(~[2, 4, 6, 2, 1, 8, 10, 3, 5, 7, 0, 9, 1]);
+        check_to_vec(~[9, 11, 9, 9, 9, 9, 11, 2, 3, 4, 11, 9, 0, 0, 0, 0]);
+        check_to_vec(~[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+        check_to_vec(~[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]);
+        check_to_vec(~[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 1, 2]);
+        check_to_vec(~[5, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2, 1]);
     }
 
     #[test]
@@ -237,11 +254,4 @@ mod tests {
         let mut heap = from_vec::<int>(~[]);
         heap.replace(5);
     }
-
-    #[test]
-    fn test_to_vec() {
-        let data = ~[1, 3, 5, 7, 9, 2, 4, 6, 8, 0];
-        let heap = from_vec(copy data);
-        assert merge_sort(heap.to_vec(), le) == merge_sort(data, le);
-    }
 }