new borrow checker (mass squash)

This commit is contained in:
Niko Matsakis 2013-03-15 15:24:24 -04:00
parent b5a7e8b353
commit a896440ca1
172 changed files with 6475 additions and 4303 deletions

View file

@ -61,6 +61,7 @@ pub fn merge_sort<T:Copy>(v: &const [T], le: Le<T>) -> ~[T] {
}
}
#[cfg(stage0)]
fn part<T>(arr: &mut [T], left: uint,
right: uint, pivot: uint, compare_func: Le<T>) -> uint {
arr[pivot] <-> arr[right];
@ -79,6 +80,23 @@ fn part<T>(arr: &mut [T], left: uint,
return storage_index;
}
#[cfg(not(stage0))]
fn part<T>(arr: &mut [T], left: uint,
right: uint, pivot: uint, compare_func: Le<T>) -> uint {
arr[pivot] <-> arr[right];
let mut storage_index: uint = left;
let mut i: uint = left;
while i < right {
if compare_func(&arr[i], &arr[right]) {
arr[i] <-> arr[storage_index];
storage_index += 1;
}
i += 1;
}
arr[storage_index] <-> arr[right];
return storage_index;
}
fn qsort<T>(arr: &mut [T], left: uint,
right: uint, compare_func: Le<T>) {
if right > left {
@ -162,7 +180,8 @@ fn qsort3<T:Copy + Ord + Eq>(arr: &mut [T], left: int, right: int) {
*/
pub fn quick_sort3<T:Copy + Ord + Eq>(arr: &mut [T]) {
if arr.len() <= 1 { return; }
qsort3(arr, 0, (arr.len() - 1) as int);
let len = arr.len() - 1; // FIXME(#5074) nested calls
qsort3(arr, 0, (len - 1) as int);
}
pub trait Sort {
@ -195,15 +214,20 @@ pub fn tim_sort<T:Copy + Ord>(array: &mut [T]) {
let mut idx = 0;
let mut remaining = size;
loop {
let arr = vec::mut_slice(array, idx, size);
let mut run_len: uint = count_run_ascending(arr);
let run_len: uint = {
// This scope contains the slice `arr` here:
let arr = vec::mut_slice(array, idx, size);
let mut run_len: uint = count_run_ascending(arr);
if run_len < min_run {
let force = if remaining <= min_run {remaining} else {min_run};
let slice = vec::mut_slice(arr, 0, force);
binarysort(slice, run_len);
run_len = force;
}
if run_len < min_run {
let force = if remaining <= min_run {remaining} else {min_run};
let slice = vec::mut_slice(arr, 0, force);
binarysort(slice, run_len);
run_len = force;
}
run_len
};
ms.push_run(idx, run_len);
ms.merge_collapse(array);
@ -250,7 +274,7 @@ fn binarysort<T:Copy + Ord>(array: &mut [T], start: uint) {
fn reverse_slice<T>(v: &mut [T], start: uint, end:uint) {
let mut i = start;
while i < end / 2 {
util::swap(&mut v[i], &mut v[end - i - 1]);
v[i] <-> v[end - i - 1];
i += 1;
}
}
@ -433,14 +457,17 @@ impl<T:Copy + Ord> MergeState<T> {
self.runs[n+1].len = self.runs[n+2].len;
}
let slice = vec::mut_slice(array, b1, b1+l1);
let k = gallop_right(&const array[b2], slice, 0);
let k = { // constrain lifetime of slice below
let slice = vec::mut_slice(array, b1, b1+l1);
gallop_right(&const array[b2], slice, 0)
};
b1 += k;
l1 -= k;
if l1 != 0 {
let slice = vec::mut_slice(array, b2, b2+l2);
let l2 = gallop_left(
&const array[b1+l1-1],slice,l2-1);
let l2 = { // constrain lifetime of slice below
let slice = vec::mut_slice(array, b2, b2+l2);
gallop_left(&const array[b1+l1-1],slice,l2-1)
};
if l2 > 0 {
if l1 <= l2 {
self.merge_lo(array, b1, l1, b2, l2);
@ -621,9 +648,11 @@ impl<T:Copy + Ord> MergeState<T> {
loop {
assert!(len2 > 1 && len1 != 0);
let tmp_view = vec::mut_slice(array, base1, base1+len1);
count1 = len1 - gallop_right(
&const tmp[c2], tmp_view, len1-1);
{ // constrain scope of tmp_view:
let tmp_view = vec::mut_slice (array, base1, base1+len1);
count1 = len1 - gallop_right(
&const tmp[c2], tmp_view, len1-1);
}
if count1 != 0 {
dest -= count1; c1 -= count1; len1 -= count1;
@ -636,12 +665,11 @@ impl<T:Copy + Ord> MergeState<T> {
if len2 == 1 { break_outer = true; break; }
let count2;
{
{ // constrain scope of tmp_view
let tmp_view = vec::mut_slice(tmp, 0, len2);
count2 = len2 - gallop_left(&const array[c1],
tmp_view,
len2-1);
// Make tmp_view go out of scope to appease borrowck.
}
if count2 != 0 {