Skip to content

Commit 868d101

Browse files
committed
Put function argument last in sort function. Fixes #3265.
1 parent f98f00f commit 868d101

File tree

9 files changed

+42
-32
lines changed

9 files changed

+42
-32
lines changed

src/cargo/cargo.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1498,7 +1498,7 @@ fn print_pkg(s: source, p: package) {
14981498
fn print_source(s: source) {
14991499
info(s.name + ~" (" + s.url + ~")");
15001500

1501-
let pks = sort::merge_sort(sys::shape_lt, s.packages.get());
1501+
let pks = sort::merge_sort(s.packages.get(), sys::shape_lt);
15021502
let l = vec::len(pks);
15031503

15041504
print(io::with_str_writer(|writer| {

src/libstd/json.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
145145
}
146146

147147
// sort by key strings
148-
let sorted_pairs = sort::merge_sort(|a,b| *a <= *b, pairs);
148+
let sorted_pairs = do sort::merge_sort(pairs) |a,b| { *a <= *b };
149149

150150
// {
151151
wr.write_str(~"{\n");

src/libstd/sort.rs

+33-23
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ type Le<T> = pure fn(v1: &T, v2: &T) -> bool;
2020
* Has worst case O(n log n) performance, best case O(n), but
2121
* is not space efficient. This is a stable sort.
2222
*/
23-
fn merge_sort<T: Copy>(le: Le<T>, v: &[const T]) -> ~[T] {
23+
fn merge_sort<T: Copy>(v: &[const T], le: Le<T>) -> ~[T] {
2424
type Slice = (uint, uint);
2525

26-
return merge_sort_(le, v, (0u, len(v)));
26+
return merge_sort_(v, (0u, len(v)), le);
2727

28-
fn merge_sort_<T: Copy>(le: Le<T>, v: &[const T], slice: Slice)
28+
fn merge_sort_<T: Copy>(v: &[const T], slice: Slice, le: Le<T>)
2929
-> ~[T] {
3030
let begin = slice.first();
3131
let end = slice.second();
@@ -37,7 +37,7 @@ fn merge_sort<T: Copy>(le: Le<T>, v: &[const T]) -> ~[T] {
3737
let mid = v_len / 2u + begin;
3838
let a = (begin, mid);
3939
let b = (mid, end);
40-
return merge(le, merge_sort_(le, v, a), merge_sort_(le, v, b));
40+
return merge(le, merge_sort_(v, a, le), merge_sort_(v, b, le));
4141
}
4242

4343
fn merge<T: Copy>(le: Le<T>, a: &[T], b: &[T]) -> ~[T] {
@@ -58,8 +58,8 @@ fn merge_sort<T: Copy>(le: Le<T>, v: &[const T]) -> ~[T] {
5858
}
5959
}
6060

61-
fn part<T: Copy>(compare_func: Le<T>, arr: &[mut T], left: uint,
62-
right: uint, pivot: uint) -> uint {
61+
fn part<T: Copy>(arr: &[mut T], left: uint,
62+
right: uint, pivot: uint, compare_func: Le<T>) -> uint {
6363
let pivot_value = arr[pivot];
6464
arr[pivot] <-> arr[right];
6565
let mut storage_index: uint = left;
@@ -75,16 +75,16 @@ fn part<T: Copy>(compare_func: Le<T>, arr: &[mut T], left: uint,
7575
return storage_index;
7676
}
7777

78-
fn qsort<T: Copy>(compare_func: Le<T>, arr: &[mut T], left: uint,
79-
right: uint) {
78+
fn qsort<T: Copy>(arr: &[mut T], left: uint,
79+
right: uint, compare_func: Le<T>) {
8080
if right > left {
8181
let pivot = (left + right) / 2u;
82-
let new_pivot = part::<T>(compare_func, arr, left, right, pivot);
82+
let new_pivot = part::<T>(arr, left, right, pivot, compare_func);
8383
if new_pivot != 0u {
8484
// Need to do this check before recursing due to overflow
85-
qsort::<T>(compare_func, arr, left, new_pivot - 1u);
85+
qsort::<T>(arr, left, new_pivot - 1u, compare_func);
8686
}
87-
qsort::<T>(compare_func, arr, new_pivot + 1u, right);
87+
qsort::<T>(arr, new_pivot + 1u, right, compare_func);
8888
}
8989
}
9090

@@ -94,9 +94,9 @@ fn qsort<T: Copy>(compare_func: Le<T>, arr: &[mut T], left: uint,
9494
* Has worst case O(n^2) performance, average case O(n log n).
9595
* This is an unstable sort.
9696
*/
97-
fn quick_sort<T: Copy>(compare_func: Le<T>, arr: &[mut T]) {
97+
fn quick_sort<T: Copy>(arr: &[mut T], compare_func: Le<T>) {
9898
if len::<T>(arr) == 0u { return; }
99-
qsort::<T>(compare_func, arr, 0u, len::<T>(arr) - 1u);
99+
qsort::<T>(arr, 0u, len::<T>(arr) - 1u, compare_func);
100100
}
101101

102102
fn qsort3<T: Copy Ord Eq>(arr: &[mut T], left: int, right: int) {
@@ -292,7 +292,8 @@ fn countRunAndMakeAscending<T: Ord>(array: &[mut T]) -> uint {
292292
return run;
293293
}
294294

295-
pure fn gallopLeft<T: Ord>(key: &const T, array: &[const T], hint: uint) -> uint {
295+
pure fn gallopLeft<T: Ord>(key: &const T, array: &[const T],
296+
hint: uint) -> uint {
296297
let size = array.len();
297298
assert size != 0 && hint < size;
298299

@@ -340,7 +341,8 @@ pure fn gallopLeft<T: Ord>(key: &const T, array: &[const T], hint: uint) -> uint
340341
return ofs;
341342
}
342343

343-
pure fn gallopRight<T: Ord>(key: &const T, array: &[const T], hint: uint) -> uint {
344+
pure fn gallopRight<T: Ord>(key: &const T, array: &[const T],
345+
hint: uint) -> uint {
344346
let size = array.len();
345347
assert size != 0 && hint < size;
346348

@@ -464,7 +466,8 @@ impl<T: Ord> &MergeState<T> {
464466
self.runs.pop();
465467
}
466468

467-
fn mergeLo(array: &[mut T], base1: uint, len1: uint, base2: uint, len2: uint) {
469+
fn mergeLo(array: &[mut T], base1: uint, len1: uint,
470+
base2: uint, len2: uint) {
468471
assert len1 != 0 && len2 != 0 && base1+len1 == base2;
469472

470473
vec::reserve(&mut self.tmp, len1);
@@ -558,7 +561,9 @@ impl<T: Ord> &MergeState<T> {
558561
dest += 1; c1 += 1; len1 -= 1;
559562
if len1 == 1 { breakOuter = true; break; }
560563
minGallop -= 1;
561-
if !(count1 >= MIN_GALLOP || count2 >= MIN_GALLOP) { break; }
564+
if !(count1 >= MIN_GALLOP || count2 >= MIN_GALLOP) {
565+
break;
566+
}
562567
}
563568
if breakOuter { break; }
564569
if minGallop < 0 { minGallop = 0; }
@@ -584,7 +589,8 @@ impl<T: Ord> &MergeState<T> {
584589
unsafe { vec::raw::set_len(self.tmp, 0); }
585590
}
586591

587-
fn mergeHi(array: &[mut T], base1: uint, len1: uint, base2: uint, len2: uint) {
592+
fn mergeHi(array: &[mut T], base1: uint, len1: uint,
593+
base2: uint, len2: uint) {
588594
assert len1 != 1 && len2 != 0 && base1 + len1 == base2;
589595

590596
vec::reserve(&mut self.tmp, len2);
@@ -655,7 +661,8 @@ impl<T: Ord> &MergeState<T> {
655661
assert len2 > 1 && len1 != 0;
656662

657663
let tmpView = vec::mut_view(array, base1, base1+len1);
658-
count1 = len1-gallopRight(&const self.tmp[c2], tmpView, len1-1);
664+
count1 = len1 - gallopRight(
665+
&const self.tmp[c2], tmpView, len1-1);
659666

660667
if count1 != 0 {
661668
dest -= count1; c1 -= count1; len1 -= count1;
@@ -670,8 +677,8 @@ impl<T: Ord> &MergeState<T> {
670677
if len2 == 1 { breakOuter = true; break; }
671678

672679
let tmpView = vec::mut_view(self.tmp, 0, len2);
673-
let gL = gallopLeft(&const array[c1], tmpView, len2-1);
674-
count2 = len2 - gL;
680+
let count2 = len2 - gallopLeft(
681+
&const array[c1], tmpView, len2-1);
675682
if count2 != 0 {
676683
dest -= count2; c2 -= count2; len2 -= count2;
677684
unsafe {
@@ -683,7 +690,9 @@ impl<T: Ord> &MergeState<T> {
683690
dest -= 1; c1 -= 1; len1 -= 1;
684691
if len1 == 0 { breakOuter = true; break; }
685692
minGallop -= 1;
686-
if !(count1 >= MIN_GALLOP || count2 >= MIN_GALLOP) { break; }
693+
if !(count1 >= MIN_GALLOP || count2 >= MIN_GALLOP) {
694+
break;
695+
}
687696
}
688697

689698
if breakOuter { break; }
@@ -748,7 +757,8 @@ impl<T: Ord> &MergeState<T> {
748757
// Moves elements to from dest to from
749758
// Unsafe as it makes the from parameter invalid between s2 and s2+len
750759
#[inline(always)]
751-
unsafe fn moveVec<T>(dest: &[mut T], s1: uint, from: &[const T], s2: uint, len: uint) {
760+
unsafe fn moveVec<T>(dest: &[mut T], s1: uint,
761+
from: &[const T], s2: uint, len: uint) {
752762
assert s1+len <= dest.len() && s2+len <= from.len();
753763

754764
do vec::as_mut_buf(dest) |p, _len| {

src/libstd/test.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ fn print_failures(st: ConsoleTestState) {
229229
st.out.write_line(~"\nfailures:");
230230
let failures = copy st.failures;
231231
let failures = vec::map(failures, |test| test.name);
232-
let failures = sort::merge_sort(|x, y| str::le(*x, *y), failures);
232+
let failures = do sort::merge_sort(failures) |x, y| { str::le(*x, *y) };
233233
for vec::each(failures) |name| {
234234
st.out.write_line(fmt!(" %s", *name));
235235
}
@@ -382,7 +382,7 @@ fn filter_tests(opts: &TestOpts,
382382
pure fn lteq(t1: &TestDesc, t2: &TestDesc) -> bool {
383383
str::le(t1.name, t2.name)
384384
}
385-
sort::merge_sort(lteq, filtered)
385+
sort::merge_sort(filtered, lteq)
386386
};
387387
388388
move filtered

src/libsyntax/attr.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ fn sort_meta_items(+items: ~[@ast::meta_item]) -> ~[@ast::meta_item] {
281281

282282
// This is sort of stupid here, converting to a vec of mutables and back
283283
let v: ~[mut @ast::meta_item] = vec::to_mut(items);
284-
std::sort::quick_sort(lteq, v);
284+
std::sort::quick_sort(v, lteq);
285285
vec::from_mut(move v)
286286
}
287287

src/libsyntax/ext/qquote.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ fn gather_anti_quotes<N: qq_helper>(lo: uint, node: N) -> aq_ctxt
127127
pure fn by_lo(a: &gather_item, b: &gather_item) -> bool {
128128
a.lo < b.lo
129129
}
130-
std::sort::merge_sort(by_lo, v)
130+
std::sort::merge_sort(v, by_lo)
131131
};
132132
return cx;
133133
}

src/rustc/metadata/cstore.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ fn get_dep_hashes(cstore: cstore) -> ~[~str] {
166166
vec::push(result, {name: cdata.name, hash: hash});
167167
};
168168
pure fn lteq(a: &crate_hash, b: &crate_hash) -> bool {a.name <= b.name}
169-
let sorted = std::sort::merge_sort(lteq, result);
169+
let sorted = std::sort::merge_sort(result, lteq);
170170
debug!("sorted:");
171171
for sorted.each |x| {
172172
debug!(" hash[%s]: %s", x.name, x.hash);

src/rustc/metadata/encoder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1038,7 +1038,7 @@ fn encode_crate_deps(ecx: @encode_ctxt, ebml_w: ebml::Writer,
10381038
pure fn lteq(kv1: &numdep, kv2: &numdep) -> bool {
10391039
kv1.cnum <= kv2.cnum
10401040
}
1041-
std::sort::quick_sort(lteq, deps);
1041+
std::sort::quick_sort(deps, lteq);
10421042

10431043
// Sanity-check the crate numbers
10441044
let mut expected_cnum = 1;

src/rustdoc/sort_pass.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ fn fold_mod(
3636
) -> doc::ModDoc {
3737
let doc = fold::default_any_fold_mod(fold, doc);
3838
doc::ModDoc_({
39-
items: sort::merge_sort(fold.ctxt, doc.items),
39+
items: sort::merge_sort(doc.items, fold.ctxt),
4040
.. *doc
4141
})
4242
}

0 commit comments

Comments
 (0)