Skip to content

Commit 71c311c

Browse files
committed
Uncomment tests and fix binarysort segmentation fault
1 parent cc0f2c6 commit 71c311c

File tree

1 file changed

+72
-95
lines changed

1 file changed

+72
-95
lines changed

src/libstd/sort.rs

Lines changed: 72 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -172,16 +172,16 @@ pub fn tim_sort<T: Ord>(array: &[mut T]) {
172172
return;
173173
}
174174

175+
let ms = &MergeState();
176+
ms.array = array;
177+
let min_run = min_run_length(size);
178+
175179
if size < MIN_MERGE {
176180
let init_run_len = count_run_ascending(array);
177-
binarysort(array, init_run_len);
181+
ms.binarysort(array, init_run_len);
178182
return;
179183
}
180184

181-
let ms = &MergeState();
182-
ms.array = array;
183-
let min_run = min_run_length(size);
184-
185185
let mut idx = 0;
186186
let mut remaining = size;
187187
loop {
@@ -191,7 +191,7 @@ pub fn tim_sort<T: Ord>(array: &[mut T]) {
191191
if run_len < min_run {
192192
let force = if remaining <= min_run {remaining} else {min_run};
193193
let slice = vec::mut_view(arr, 0, force);
194-
binarysort(slice, run_len);
194+
ms.binarysort(slice, run_len);
195195
run_len = force;
196196
}
197197

@@ -206,47 +206,7 @@ pub fn tim_sort<T: Ord>(array: &[mut T]) {
206206
ms.merge_force_collapse(array);
207207
}
208208

209-
fn binarysort<T: Ord>(array: &[mut T], start: uint) {
210-
let size = array.len();
211-
let mut start = start;
212-
assert start <= size;
213-
214-
if start == 0 { start += 1; }
215-
216-
let mut pivot = ~[];
217-
vec::reserve(&mut pivot, 1);
218-
unsafe { vec::raw::set_len(&mut pivot, 1); };
219-
220-
while start < size {
221-
unsafe {
222-
let tmp_view = vec::mut_view(array, start, start+1);
223-
vec::raw::memmove(pivot, tmp_view, 1);
224-
}
225-
let mut left = 0;
226-
let mut right = start;
227-
assert left <= right;
228-
229-
while left < right {
230-
let mid = (left + right) >> 1;
231-
if pivot[0] < array[mid] {
232-
right = mid;
233-
} else {
234-
left = mid+1;
235-
}
236-
}
237-
assert left == right;
238-
let mut n = start-left;
239-
240-
unsafe {
241-
move_vec(array, left+1, array, left, n);
242-
}
243-
array[left] <-> pivot[0];
244-
start += 1;
245-
}
246-
unsafe { vec::raw::set_len(&mut pivot, 0); } // Forget the boxed element
247-
}
248-
249-
/// Reverse the order of elements in a slice, in place
209+
// Reverse the order of elements in a slice, in place
250210
fn reverse_slice<T>(v: &[mut T], start: uint, end:uint) {
251211
let mut i = start;
252212
while i < end / 2 {
@@ -395,6 +355,7 @@ struct MergeState<T> {
395355
mut min_gallop: uint,
396356
mut tmp: ~[T],
397357
mut last_hi: bool,
358+
mut last_bsort: bool,
398359
mut mergePt: uint,
399360
mut tmpPt: uint,
400361
mut array: &[mut T],
@@ -404,7 +365,9 @@ struct MergeState<T> {
404365
unsafe {
405366
let size = self.tmp.len();
406367
// Move tmp back into invalid part of array
407-
if self.last_hi && size > 0 {
368+
if self.last_bsort {
369+
370+
} else if self.last_hi && size > 0 {
408371
self.mergePt -= self.tmpPt;
409372
move_vec(self.array, self.mergePt, self.tmp, 0, self.tmpPt);
410373
} else if !self.last_hi && size-self.tmpPt > 0 {
@@ -421,8 +384,9 @@ fn MergeState<T>() -> MergeState<T> {
421384
vec::reserve(&mut tmp, INITIAL_TMP_STORAGE);
422385
MergeState {
423386
min_gallop: MIN_GALLOP,
424-
tmp: tmp,
387+
tmp: move tmp,
425388
last_hi: false,
389+
last_bsort: false,
426390
mergePt: 0,
427391
tmpPt: 0,
428392
array: &[mut],
@@ -431,6 +395,45 @@ fn MergeState<T>() -> MergeState<T> {
431395
}
432396

433397
impl<T: Ord> &MergeState<T> {
398+
fn binarysort(array: &[mut T], start: uint) {
399+
let size = array.len();
400+
let mut start = start;
401+
assert start <= size;
402+
403+
if start == 0 { start += 1; }
404+
405+
self.last_bsort = true;
406+
unsafe { vec::raw::set_len(&mut self.tmp, 1); };
407+
408+
while start < size {
409+
unsafe {
410+
move_vec(self.tmp, 0, array, start, 1);
411+
}
412+
let mut left = 0;
413+
let mut right = start;
414+
assert left <= right;
415+
416+
while left < right {
417+
let mid = (left + right) >> 1;
418+
if self.tmp[0] < array[mid] {
419+
right = mid;
420+
} else {
421+
left = mid+1;
422+
}
423+
}
424+
assert left == right;
425+
let mut n = start-left;
426+
427+
unsafe {
428+
move_vec(array, left+1, array, left, n);
429+
}
430+
array[left] <-> self.tmp[0];
431+
start += 1;
432+
}
433+
unsafe { vec::raw::set_len(&mut self.tmp, 0); } // Forget the boxed element
434+
self.last_bsort = false;
435+
}
436+
434437
fn push_run(run_base: uint, run_len: uint) {
435438
let tmp = RunState{base: run_base, len: run_len};
436439
self.runs.push(tmp);
@@ -958,7 +961,7 @@ mod tests {
958961
// tjc: funny that we have to use parens
959962
pure fn ile(x: &(&static/str), y: &(&static/str)) -> bool
960963
{
961-
unsafe // to_lower is not pure...
964+
unsafe // to_lower is not pure...
962965
{
963966
let x = x.to_lower();
964967
let y = y.to_lower();
@@ -977,7 +980,6 @@ mod tests {
977980

978981
#[cfg(test)]
979982
mod test_tim_sort {
980-
// #[legacy_exports];
981983
struct CVal {
982984
val: ~float,
983985
}
@@ -1043,51 +1045,27 @@ mod test_tim_sort {
10431045
tim_sort(arr);
10441046
fail ~"Guarantee the fail";
10451047
}
1046-
1047-
struct DVal { val: ~uint }
1048-
impl DVal: Ord {
1049-
pure fn lt(_x: &DVal) -> bool { true }
1050-
pure fn le(_x: &DVal) -> bool { true }
1051-
pure fn gt(_x: &DVal) -> bool { true }
1052-
pure fn ge(_x: &DVal) -> bool { true }
1053-
}
1054-
1055-
#[test]
1056-
#[should_fail]
1057-
fn test_bad_Ord_impl() {
1058-
let rng = rand::Rng();
1059-
let mut arr = do vec::from_fn(500) |_i| {
1060-
let randVal = rng.gen_uint();
1061-
DVal { val: ~randVal }
1062-
};
1063-
1064-
tim_sort(arr);
1065-
fail ~"Guarantee the fail";
1066-
}
10671048
}
10681049

1069-
/*
10701050
#[cfg(test)]
10711051
mod big_tests {
10721052

10731053
#[test]
1074-
fn sorts_test() {
1054+
fn test_unique() {
10751055
let low = 5;
10761056
let high = 10;
1077-
1078-
//pure fn le(a: &~float, b: &~float) -> bool { *a <= *b }
1079-
1080-
//let s1 = fn(arr: &[mut ~float]) { tim_sort(arr); };
1081-
//let s2 = fn(arr: &[mut ~float]) { quick_sort(arr, le); };
1082-
//let s3 = fn(arr: &[mut ~float]) { quick_sort3(arr); };
1083-
//let s4 = fn(arr: &[mut ~float]) { let rs = merge_sort(arr, le);
1084-
// for rs.eachi |i, v| {arr[i] = *v}};
1085-
1086-
1087-
// Run tabulate_unique and tabulate_managed
1088-
// with the other sorts at some point
10891057
tabulate_unique(low, high);
1058+
}
1059+
1060+
#[test]
1061+
fn test_managed() {
1062+
let low = 5;
1063+
let high = 10;
10901064
tabulate_managed(low, high);
1065+
}
1066+
1067+
#[test]
1068+
fn test_linear() {
10911069
tabulate_linear();
10921070
}
10931071

@@ -1096,14 +1074,14 @@ mod big_tests {
10961074
let res = do vec::from_fn(num) |i| {
10971075
arr[i % size]
10981076
};
1099-
vec::to_mut(res)
1077+
vec::to_mut(move res)
11001078
}
11011079

11021080
fn makeRange(n: uint) -> ~[uint] {
11031081
let one = do vec::from_fn(n) |i| { i };
11041082
let mut two = copy one;
11051083
vec::reverse(two);
1106-
vec::append(two, one)
1084+
vec::append(move two, one)
11071085
}
11081086

11091087
fn tabulate_unique(lo: uint, hi: uint) {
@@ -1122,7 +1100,7 @@ mod big_tests {
11221100
let arr = do vec::from_fn(n) |_i| {
11231101
~rng.gen_float()
11241102
};
1125-
let arr = vec::to_mut(arr);
1103+
let arr = vec::to_mut(move arr);
11261104

11271105
tim_sort(arr); // *sort
11281106
isSorted(arr);
@@ -1163,7 +1141,7 @@ mod big_tests {
11631141
let arr = if n > 4 {
11641142
let part = vec::view(arr, 0, 4);
11651143
multiplyVec(part, n)
1166-
} else { arr };
1144+
} else { move arr };
11671145
tim_sort(arr); // ~sort
11681146
isSorted(arr);
11691147

@@ -1195,7 +1173,7 @@ mod big_tests {
11951173
let arr = do vec::from_fn(n) |_i| {
11961174
@rng.gen_float()
11971175
};
1198-
let arr = vec::to_mut(arr);
1176+
let arr = vec::to_mut(move arr);
11991177

12001178
tim_sort(arr); // *sort
12011179
isSorted(arr, 1);
@@ -1236,7 +1214,7 @@ mod big_tests {
12361214
let arr = if n > 4 {
12371215
let part = vec::view(arr, 0, 4);
12381216
multiplyVec(part, n)
1239-
} else { arr };
1217+
} else { move arr };
12401218
tim_sort(arr); // ~sort
12411219
isSorted(arr, n/4+1);
12421220

@@ -1247,7 +1225,7 @@ mod big_tests {
12471225
let half = n / 2;
12481226
let mut arr = makeRange(half).map(|i| @(*i as float));
12491227
tim_sort(arr); // !sort
1250-
isSorted(arr, 2);
1228+
isSorted(arr, 1);
12511229
}
12521230
}
12531231

@@ -1294,7 +1272,7 @@ mod big_tests {
12941272
let mut arr = do vec::from_fn(n) |i| {
12951273
LVal { val: i, key: key }
12961274
};
1297-
//tim_sort(arr);
1275+
tim_sort(arr);
12981276
isSorted(arr);
12991277
}
13001278

@@ -1305,7 +1283,6 @@ mod big_tests {
13051283
assert n == dropped;
13061284
}
13071285
}
1308-
*/
13091286

13101287
// Local Variables:
13111288
// mode: rust;

0 commit comments

Comments
 (0)