|
11 | 11 | //! Sorting methods |
12 | 12 |
|
13 | 13 | use core::cmp::{Eq, Ord}; |
14 | | -use core::dvec::DVec; |
15 | 14 | use core::prelude::*; |
16 | 15 | use core::util; |
17 | 16 | use core::vec::{len, push}; |
@@ -189,7 +188,7 @@ pub fn tim_sort<T:Copy + Ord>(array: &mut [T]) { |
189 | 188 | return; |
190 | 189 | } |
191 | 190 |
|
192 | | - let ms = &MergeState(); |
| 191 | + let mut ms = MergeState(); |
193 | 192 | let min_run = min_run_length(size); |
194 | 193 |
|
195 | 194 | let mut idx = 0; |
@@ -392,66 +391,63 @@ struct RunState { |
392 | 391 | } |
393 | 392 |
|
394 | 393 | struct MergeState<T> { |
395 | | - mut min_gallop: uint, |
396 | | - runs: DVec<RunState>, |
| 394 | + min_gallop: uint, |
| 395 | + runs: ~[RunState], |
397 | 396 | } |
398 | 397 |
|
399 | 398 | // Fixme (#3853) Move into MergeState |
400 | 399 | fn MergeState<T>() -> MergeState<T> { |
401 | 400 | MergeState { |
402 | 401 | min_gallop: MIN_GALLOP, |
403 | | - runs: DVec(), |
| 402 | + runs: ~[], |
404 | 403 | } |
405 | 404 | } |
406 | 405 |
|
407 | | -pub impl<T:Copy + Ord> MergeState<T> { |
408 | | - fn push_run(&self, run_base: uint, run_len: uint) { |
| 406 | +impl<T:Copy + Ord> MergeState<T> { |
| 407 | + fn push_run(&mut self, run_base: uint, run_len: uint) { |
409 | 408 | let tmp = RunState{base: run_base, len: run_len}; |
410 | 409 | self.runs.push(tmp); |
411 | 410 | } |
412 | 411 |
|
413 | | - fn merge_at(&self, n: uint, array: &mut [T]) { |
| 412 | + fn merge_at(&mut self, n: uint, array: &mut [T]) { |
414 | 413 | let mut size = self.runs.len(); |
415 | 414 | fail_unless!(size >= 2); |
416 | 415 | fail_unless!(n == size-2 || n == size-3); |
417 | 416 |
|
418 | | - do self.runs.borrow_mut |arr| { |
| 417 | + let mut b1 = self.runs[n].base; |
| 418 | + let mut l1 = self.runs[n].len; |
| 419 | + let b2 = self.runs[n+1].base; |
| 420 | + let l2 = self.runs[n+1].len; |
419 | 421 |
|
420 | | - let mut b1 = arr[n].base; |
421 | | - let mut l1 = arr[n].len; |
422 | | - let b2 = arr[n+1].base; |
423 | | - let l2 = arr[n+1].len; |
| 422 | + fail_unless!(l1 > 0 && l2 > 0); |
| 423 | + fail_unless!(b1 + l1 == b2); |
424 | 424 |
|
425 | | - fail_unless!(l1 > 0 && l2 > 0); |
426 | | - fail_unless!(b1 + l1 == b2); |
427 | | - |
428 | | - arr[n].len = l1 + l2; |
429 | | - if n == size-3 { |
430 | | - arr[n+1].base = arr[n+2].base; |
431 | | - arr[n+1].len = arr[n+2].len; |
432 | | - } |
| 425 | + self.runs[n].len = l1 + l2; |
| 426 | + if n == size-3 { |
| 427 | + self.runs[n+1].base = self.runs[n+2].base; |
| 428 | + self.runs[n+1].len = self.runs[n+2].len; |
| 429 | + } |
433 | 430 |
|
434 | | - let slice = vec::mut_slice(array, b1, b1+l1); |
435 | | - let k = gallop_right(&const array[b2], slice, 0); |
436 | | - b1 += k; |
437 | | - l1 -= k; |
438 | | - if l1 != 0 { |
439 | | - let slice = vec::mut_slice(array, b2, b2+l2); |
440 | | - let l2 = gallop_left( |
441 | | - &const array[b1+l1-1],slice,l2-1); |
442 | | - if l2 > 0 { |
443 | | - if l1 <= l2 { |
444 | | - self.merge_lo(array, b1, l1, b2, l2); |
445 | | - } else { |
446 | | - self.merge_hi(array, b1, l1, b2, l2); |
447 | | - } |
| 431 | + let slice = vec::mut_slice(array, b1, b1+l1); |
| 432 | + let k = gallop_right(&const array[b2], slice, 0); |
| 433 | + b1 += k; |
| 434 | + l1 -= k; |
| 435 | + if l1 != 0 { |
| 436 | + let slice = vec::mut_slice(array, b2, b2+l2); |
| 437 | + let l2 = gallop_left( |
| 438 | + &const array[b1+l1-1],slice,l2-1); |
| 439 | + if l2 > 0 { |
| 440 | + if l1 <= l2 { |
| 441 | + self.merge_lo(array, b1, l1, b2, l2); |
| 442 | + } else { |
| 443 | + self.merge_hi(array, b1, l1, b2, l2); |
448 | 444 | } |
449 | 445 | } |
450 | 446 | } |
451 | 447 | self.runs.pop(); |
452 | 448 | } |
453 | 449 |
|
454 | | - fn merge_lo(&self, array: &mut [T], base1: uint, len1: uint, |
| 450 | + fn merge_lo(&mut self, array: &mut [T], base1: uint, len1: uint, |
455 | 451 | base2: uint, len2: uint) { |
456 | 452 | fail_unless!(len1 != 0 && len2 != 0 && base1+len1 == base2); |
457 | 453 |
|
@@ -554,7 +550,7 @@ pub impl<T:Copy + Ord> MergeState<T> { |
554 | 550 | } |
555 | 551 | } |
556 | 552 |
|
557 | | - fn merge_hi(&self, array: &mut [T], base1: uint, len1: uint, |
| 553 | + fn merge_hi(&mut self, array: &mut [T], base1: uint, len1: uint, |
558 | 554 | base2: uint, len2: uint) { |
559 | 555 | fail_unless!(len1 != 1 && len2 != 0 && base1 + len1 == base2); |
560 | 556 |
|
@@ -672,32 +668,28 @@ pub impl<T:Copy + Ord> MergeState<T> { |
672 | 668 | } |
673 | 669 | } |
674 | 670 |
|
675 | | - fn merge_collapse(&self, array: &mut [T]) { |
| 671 | + fn merge_collapse(&mut self, array: &mut [T]) { |
676 | 672 | while self.runs.len() > 1 { |
677 | 673 | let mut n = self.runs.len()-2; |
678 | | - let chk = do self.runs.borrow |arr| { |
679 | | - if n > 0 && arr[n-1].len <= arr[n].len + arr[n+1].len { |
680 | | - if arr[n-1].len < arr[n+1].len { n -= 1; } |
681 | | - true |
682 | | - } else if arr[n].len <= arr[n+1].len { |
683 | | - true |
684 | | - } else { |
685 | | - false |
686 | | - } |
687 | | - }; |
688 | | - if !chk { break; } |
| 674 | + if n > 0 && |
| 675 | + self.runs[n-1].len <= self.runs[n].len + self.runs[n+1].len |
| 676 | + { |
| 677 | + if self.runs[n-1].len < self.runs[n+1].len { n -= 1; } |
| 678 | + } else if self.runs[n].len <= self.runs[n+1].len { |
| 679 | + /* keep going */ |
| 680 | + } else { |
| 681 | + break; |
| 682 | + } |
689 | 683 | self.merge_at(n, array); |
690 | 684 | } |
691 | 685 | } |
692 | 686 |
|
693 | | - fn merge_force_collapse(&self, array: &mut [T]) { |
| 687 | + fn merge_force_collapse(&mut self, array: &mut [T]) { |
694 | 688 | while self.runs.len() > 1 { |
695 | 689 | let mut n = self.runs.len()-2; |
696 | 690 | if n > 0 { |
697 | | - do self.runs.borrow |arr| { |
698 | | - if arr[n-1].len < arr[n+1].len { |
699 | | - n -= 1; |
700 | | - } |
| 691 | + if self.runs[n-1].len < self.runs[n+1].len { |
| 692 | + n -= 1; |
701 | 693 | } |
702 | 694 | } |
703 | 695 | self.merge_at(n, array); |
|
0 commit comments