@@ -166,7 +166,7 @@ const MIN_MERGE: uint = 64;
166
166
const MIN_GALLOP : uint = 7 ;
167
167
const INITIAL_TMP_STORAGE : uint = 128 ;
168
168
169
- pub fn tim_sort < T : Ord > ( array : & [ mut T ] ) {
169
+ pub fn tim_sort < T : Copy Ord > ( array : & [ mut T ] ) {
170
170
let size = array. len ( ) ;
171
171
if size < 2 {
172
172
return ;
@@ -210,7 +210,7 @@ pub fn tim_sort<T: Ord>(array: &[mut T]) {
210
210
fn reverse_slice < T > ( v : & [ mut T ] , start : uint , end : uint ) {
211
211
let mut i = start;
212
212
while i < end / 2 {
213
- v[ i] <-> v[ end - i - 1 ] ;
213
+ util :: swap ( & mut v[ i] , & mut v[ end - i - 1 ] ) ;
214
214
i += 1 ;
215
215
}
216
216
}
@@ -226,7 +226,7 @@ pure fn min_run_length(n: uint) -> uint {
226
226
return n + r;
227
227
}
228
228
229
- fn count_run_ascending < T : Ord > ( array : & [ mut T ] ) -> uint {
229
+ fn count_run_ascending < T : Copy Ord > ( array : & [ mut T ] ) -> uint {
230
230
let size = array. len ( ) ;
231
231
assert size > 0 ;
232
232
if size == 1 { return 1 ; }
@@ -246,7 +246,7 @@ fn count_run_ascending<T: Ord>(array: &[mut T]) -> uint {
246
246
return run;
247
247
}
248
248
249
- pure fn gallop_left < T : Ord > ( key : & const T , array : & [ const T ] ,
249
+ pure fn gallop_left < T : Copy Ord > ( key : & const T , array : & [ const T ] ,
250
250
hint : uint ) -> uint {
251
251
let size = array. len ( ) ;
252
252
assert size != 0 && hint < size;
@@ -295,7 +295,7 @@ pure fn gallop_left<T: Ord>(key: &const T, array: &[const T],
295
295
return ofs;
296
296
}
297
297
298
- pure fn gallop_right < T : Ord > ( key : & const T , array : & [ const T ] ,
298
+ pure fn gallop_right < T : Copy Ord > ( key : & const T , array : & [ const T ] ,
299
299
hint : uint ) -> uint {
300
300
let size = array. len ( ) ;
301
301
assert size != 0 && hint < size;
@@ -353,15 +353,15 @@ struct RunState {
353
353
354
354
struct MergeState < T > {
355
355
mut min_gallop : uint ,
356
- mut tmp : ~[ T ] ,
356
+ // mut tmp: ~[T],
357
357
mut last_hi : bool ,
358
358
mut last_bsort : bool ,
359
359
mut mergePt : uint ,
360
360
mut tmpPt : uint ,
361
361
mut array : & [ mut T ] ,
362
362
runs : DVec < RunState > ,
363
363
364
- drop {
364
+ /* drop {
365
365
unsafe {
366
366
let size = self.tmp.len();
367
367
// Move tmp back into invalid part of array
@@ -376,15 +376,15 @@ struct MergeState<T> {
376
376
}
377
377
vec::raw::set_len(&mut self.tmp, 0);
378
378
}
379
- }
379
+ }*/
380
380
}
381
381
382
382
fn MergeState < T > ( ) -> MergeState < T > {
383
- let mut tmp = ~[ ] ;
384
- vec:: reserve ( & mut tmp, INITIAL_TMP_STORAGE ) ;
383
+ // let mut tmp = ~[];
384
+ // vec::reserve(&mut tmp, INITIAL_TMP_STORAGE);
385
385
MergeState {
386
386
min_gallop : MIN_GALLOP ,
387
- tmp : move tmp,
387
+ // tmp: move tmp,
388
388
last_hi : false ,
389
389
last_bsort : false ,
390
390
mergePt : 0 ,
@@ -394,7 +394,7 @@ fn MergeState<T>() -> MergeState<T> {
394
394
}
395
395
}
396
396
397
- impl < T : Ord > MergeState < T > {
397
+ impl < T : Copy Ord > MergeState < T > {
398
398
fn binarysort ( & self , array : & [ mut T ] , start : uint ) {
399
399
let size = array. len ( ) ;
400
400
let mut start = start;
@@ -403,19 +403,16 @@ impl<T: Ord> MergeState<T> {
403
403
if start == 0 { start += 1 ; }
404
404
405
405
self . last_bsort = true ;
406
- unsafe { vec:: raw:: set_len ( & mut self . tmp , 1 ) ; } ;
407
406
408
407
while start < size {
409
- unsafe {
410
- move_vec ( self . tmp , 0 , array, start, 1 ) ;
411
- }
408
+ let pivot = array[ start] ;
412
409
let mut left = 0 ;
413
410
let mut right = start;
414
411
assert left <= right;
415
412
416
413
while left < right {
417
414
let mid = ( left + right) >> 1 ;
418
- if self . tmp [ 0 ] < array[ mid] {
415
+ if pivot < array[ mid] {
419
416
right = mid;
420
417
} else {
421
418
left = mid+1 ;
@@ -424,14 +421,10 @@ impl<T: Ord> MergeState<T> {
424
421
assert left == right;
425
422
let mut n = start-left;
426
423
427
- unsafe {
428
- move_vec ( array, left+1 , array, left, n) ;
429
- }
430
- array[ left] <-> self . tmp [ 0 ] ;
424
+ copy_vec ( array, left+1 , array, left, n) ;
425
+ array[ left] = move pivot;
431
426
start += 1 ;
432
427
}
433
- // Forget the boxed element
434
- unsafe { vec:: raw:: set_len ( & mut self . tmp , 0 ) ; }
435
428
self . last_bsort = false ;
436
429
}
437
430
@@ -488,13 +481,9 @@ impl<T: Ord> MergeState<T> {
488
481
base2 : uint , len2 : uint ) {
489
482
assert len1 != 0 && len2 != 0 && base1+len1 == base2;
490
483
491
- vec:: reserve ( & mut self . tmp , len1) ;
484
+ // vec::reserve(&mut self.tmp, len1);
492
485
self . last_hi = false ;
493
-
494
- unsafe {
495
- vec:: raw:: set_len ( & mut self . tmp , len1) ;
496
- move_vec ( self . tmp , 0 , array, base1, len1) ;
497
- }
486
+ let tmp = vec:: to_mut ( vec:: slice ( array, base1, base1+len1) ) ;
498
487
self . tmpPt = 0 ;
499
488
self . mergePt = base1;
500
489
@@ -509,18 +498,12 @@ impl<T: Ord> MergeState<T> {
509
498
self . mergePt += 1 ;
510
499
511
500
if len2 == 0 {
512
- unsafe {
513
- move_vec ( array, dest, self . tmp , 0 , len1) ;
514
- vec:: raw:: set_len ( & mut self . tmp , 0 ) ; // Forget the elements
515
- }
501
+ copy_vec ( array, dest, tmp, 0 , len1) ;
516
502
return ;
517
503
}
518
504
if len1 == 1 {
519
- unsafe {
520
- move_vec ( array, dest, array, c2, len2) ;
521
- array[ dest+len2] <-> self . tmp [ c1] ;
522
- vec:: raw:: set_len ( & mut self . tmp , 0 ) ; // Forget the element
523
- }
505
+ copy_vec ( array, dest, array, c2, len2) ;
506
+ array[ dest+len2] <-> tmp[ c1] ;
524
507
return ;
525
508
}
526
509
@@ -532,7 +515,7 @@ impl<T: Ord> MergeState<T> {
532
515
533
516
loop {
534
517
assert len1 > 1 && len2 != 0 ;
535
- if array[ c2] < self . tmp [ c1] {
518
+ if array[ c2] < tmp[ c1] {
536
519
array[ dest] <-> array[ c2] ;
537
520
dest += 1 ; c2 += 1 ; len2 -= 1 ;
538
521
self . mergePt += 1 ;
@@ -541,7 +524,7 @@ impl<T: Ord> MergeState<T> {
541
524
break_outer = true ;
542
525
}
543
526
} else {
544
- array[ dest] <-> self . tmp [ c1] ;
527
+ array[ dest] <-> tmp[ c1] ;
545
528
dest += 1 ; c1 += 1 ; len1 -= 1 ;
546
529
self . mergePt += 1 ;
547
530
self . tmpPt += 1 ;
@@ -560,13 +543,11 @@ impl<T: Ord> MergeState<T> {
560
543
loop {
561
544
assert len1 > 1 && len2 != 0 ;
562
545
563
- //let tmp_view = vec::const_view(self. tmp, c1, c1+len1);
546
+ //let tmp_view = vec::const_view(tmp, c1, c1+len1);
564
547
count1 = gallop_right ( & const array[ c2] ,
565
- vec:: const_view ( self . tmp , c1, c1+len1) , 0 ) ;
548
+ vec:: const_view ( tmp, c1, c1+len1) , 0 ) ;
566
549
if count1 != 0 {
567
- unsafe {
568
- move_vec ( array, dest, self . tmp , c1, count1) ;
569
- }
550
+ copy_vec ( array, dest, tmp, c1, count1) ;
570
551
dest += count1; c1 += count1; len1 -= count1;
571
552
self . mergePt += count1; self . tmpPt += count1;
572
553
if len1 <= 1 { break_outer = true ; break ; }
@@ -577,16 +558,14 @@ impl<T: Ord> MergeState<T> {
577
558
if len2 == 0 { break_outer = true ; break ; }
578
559
579
560
let tmp_view = vec:: const_view ( array, c2, c2+len2) ;
580
- count2 = gallop_left ( & const self . tmp [ c1] , tmp_view, 0 ) ;
561
+ count2 = gallop_left ( & const tmp[ c1] , tmp_view, 0 ) ;
581
562
if count2 != 0 {
582
- unsafe {
583
- move_vec ( array, dest, array, c2, count2) ;
584
- }
563
+ copy_vec ( array, dest, array, c2, count2) ;
585
564
dest += count2; c2 += count2; len2 -= count2;
586
565
self . mergePt += count2;
587
566
if len2 == 0 { break_outer = true ; break ; }
588
567
}
589
- array[ dest] <-> self . tmp [ c1] ;
568
+ array[ dest] <-> tmp[ c1] ;
590
569
dest += 1 ; c1 += 1 ; len1 -= 1 ;
591
570
self . mergePt += 1 ; self . tmpPt += 1 ;
592
571
if len1 == 1 { break_outer = true ; break ; }
@@ -603,34 +582,25 @@ impl<T: Ord> MergeState<T> {
603
582
604
583
if len1 == 1 {
605
584
assert len2 > 0 ;
606
- unsafe {
607
- move_vec ( array, dest, array, c2, len2) ;
608
- }
609
- array[ dest+len2] <-> self . tmp [ c1] ;
585
+ copy_vec ( array, dest, array, c2, len2) ;
586
+ array[ dest+len2] <-> tmp[ c1] ;
610
587
} else if len1 == 0 {
611
588
fail ~"Comparison violates its contract!";
612
589
} else {
613
590
assert len2 == 0;
614
591
assert len1 > 1;
615
- unsafe {
616
- move_vec(array, dest, self.tmp, c1, len1);
617
- }
592
+ copy_vec(array, dest, tmp, c1, len1);
618
593
}
619
594
self.tmpPt = 0;
620
- unsafe { vec::raw::set_len(&mut self.tmp, 0); }
621
595
}
622
596
623
597
fn merge_hi(&self, array: &[mut T], base1: uint, len1: uint,
624
598
base2: uint, len2: uint) {
625
599
assert len1 != 1 && len2 != 0 && base1 + len1 == base2;
626
600
627
- vec::reserve(&mut self.tmp, len2);
628
601
self.last_hi = true;
629
602
630
- unsafe {
631
- vec::raw::set_len(&mut self.tmp, len2);
632
- move_vec(self.tmp, 0, array, base2, len2);
633
- }
603
+ let tmp = vec::to_mut(vec::slice(array, base2, base2+len2));
634
604
635
605
let mut c1 = base1 + len1 - 1;
636
606
let mut c2 = len2 - 1;
@@ -645,20 +615,14 @@ impl<T: Ord> MergeState<T> {
645
615
dest -= 1; c1 -= 1; len1 -= 1;
646
616
647
617
if len1 == 0 {
648
- unsafe {
649
- move_vec(array, dest-(len2-1), self.tmp, 0, len2);
650
- vec::raw::set_len(&mut self.tmp, 0); // Forget the elements
651
- }
618
+ copy_vec(array, dest-(len2-1), tmp, 0, len2);
652
619
return;
653
620
}
654
621
if len2 == 1 {
655
622
dest -= len1;
656
623
c1 -= len1;
657
- unsafe {
658
- move_vec(array, dest+1, array, c1+1, len1);
659
- array[dest] <-> self.tmp[c2];
660
- vec::raw::set_len(&mut self.tmp, 0); // Forget the element
661
- }
624
+ copy_vec(array, dest+1, array, c1+1, len1);
625
+ array[dest] <-> tmp[c2];
662
626
return;
663
627
}
664
628
@@ -670,7 +634,7 @@ impl<T: Ord> MergeState<T> {
670
634
671
635
loop {
672
636
assert len1 != 0 && len2 > 1;
673
- if self. tmp[c2] < array[c1] {
637
+ if tmp[c2] < array[c1] {
674
638
array[dest] <-> array[c1];
675
639
dest -= 1; c1 -= 1; len1 -= 1;
676
640
self.mergePt -= 1;
@@ -679,7 +643,7 @@ impl<T: Ord> MergeState<T> {
679
643
break_outer = true;
680
644
}
681
645
} else {
682
- array[dest] <-> self. tmp[c2];
646
+ array[dest] <-> tmp[c2];
683
647
dest -= 1; c2 -= 1; len2 -= 1;
684
648
self.mergePt -= 1; self.tmpPt -= 1;
685
649
count2 += 1; count1 = 0;
@@ -699,31 +663,27 @@ impl<T: Ord> MergeState<T> {
699
663
700
664
let tmp_view = vec::mut_view(array, base1, base1+len1);
701
665
count1 = len1 - gallop_right(
702
- &const self. tmp[c2], tmp_view, len1-1);
666
+ &const tmp[c2], tmp_view, len1-1);
703
667
704
668
if count1 != 0 {
705
669
dest -= count1; c1 -= count1; len1 -= count1;
706
670
self.mergePt -= count1;
707
- unsafe {
708
- move_vec(array, dest+1, array, c1+1, count1);
709
- }
671
+ copy_vec(array, dest+1, array, c1+1, count1);
710
672
if len1 == 0 { break_outer = true; break; }
711
673
}
712
674
713
- array[dest] <-> self. tmp[c2];
675
+ array[dest] <-> tmp[c2];
714
676
dest -= 1; c2 -= 1; len2 -= 1;
715
677
self.mergePt -= 1; self.tmpPt -= 1;
716
678
if len2 == 1 { break_outer = true; break; }
717
679
718
- //let tmp_view = vec::mut_view(self. tmp, 0, len2);
680
+ //let tmp_view = vec::mut_view(tmp, 0, len2);
719
681
let count2 = len2 - gallop_left(&const array[c1],
720
- vec::mut_view(self. tmp, 0, len2), len2-1);
682
+ vec::mut_view(tmp, 0, len2), len2-1);
721
683
if count2 != 0 {
722
684
dest -= count2; c2 -= count2; len2 -= count2;
723
685
self.mergePt -= count2; self.tmpPt -= count2;
724
- unsafe {
725
- move_vec(array, dest+1, self.tmp, c2+1, count2);
726
- }
686
+ copy_vec(array, dest+1, tmp, c2+1, count2);
727
687
if len2 <= 1 { break_outer = true; break; }
728
688
}
729
689
array[dest] <-> array[c1];
@@ -746,21 +706,16 @@ impl<T: Ord> MergeState<T> {
746
706
assert len1 > 0;
747
707
dest -= len1;
748
708
c1 -= len1;
749
- unsafe {
750
- move_vec(array, dest+1, array, c1+1, len1);
751
- }
752
- array[dest] <-> self.tmp[c2];
709
+ copy_vec(array, dest+1, array, c1+1, len1);
710
+ array[dest] <-> tmp[c2];
753
711
} else if len2 == 0 {
754
712
fail ~" Comparison violates its contract!";
755
713
} else {
756
714
assert len1 == 0 ;
757
715
assert len2 != 0 ;
758
- unsafe {
759
- move_vec ( array, dest-( len2-1 ) , self . tmp , 0 , len2) ;
760
- }
716
+ copy_vec ( array, dest-( len2-1 ) , tmp, 0 , len2) ;
761
717
}
762
718
self . tmpPt = 0 ;
763
- unsafe { vec:: raw:: set_len ( & mut self . tmp , 0 ) ; }
764
719
}
765
720
766
721
fn merge_collapse ( & self , array : & [ mut T ] ) {
@@ -796,21 +751,14 @@ impl<T: Ord> MergeState<T> {
796
751
}
797
752
}
798
753
799
- // Moves elements to from dest to from
800
- // Unsafe as it makes the from parameter invalid between s2 and s2+len
801
754
#[ inline( always) ]
802
- unsafe fn move_vec < T > ( dest : & [ mut T ] , s1 : uint ,
755
+ fn copy_vec < T : Copy > ( dest : & [ mut T ] , s1 : uint ,
803
756
from : & [ const T ] , s2 : uint , len : uint ) {
804
757
assert s1+len <= dest. len ( ) && s2+len <= from. len ( ) ;
805
-
806
- do vec:: as_mut_buf ( dest) |p, _len| {
807
- let destPtr = ptr:: mut_offset ( p, s1) ;
808
-
809
- do vec:: as_const_buf ( from) |p, _len| {
810
- let fromPtr = ptr:: const_offset ( p, s2) ;
811
-
812
- ptr:: memmove ( destPtr, fromPtr, len) ;
813
- }
758
+
759
+ let slice = vec:: slice ( from, s2, s2+len) ;
760
+ for slice. eachi |i, v| {
761
+ dest[ s1+i] = * v;
814
762
}
815
763
}
816
764
0 commit comments