@@ -40,8 +40,7 @@ use cmp;
40
40
use default:: Default ;
41
41
use intrinsics:: assume;
42
42
use iter:: * ;
43
- use ops:: { FnMut , self , Index } ;
44
- use ops:: RangeFull ;
43
+ use ops:: { FnMut , self } ;
45
44
use option:: Option ;
46
45
use option:: Option :: { None , Some } ;
47
46
use result:: Result ;
@@ -522,91 +521,48 @@ fn slice_index_order_fail(index: usize, end: usize) -> ! {
522
521
}
523
522
524
523
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
525
- impl < T > ops:: Index < ops:: Range < usize > > for [ T ] {
524
+ impl < T , R : ops:: RangeArgument < usize > > ops:: Index < R > for [ T ] {
526
525
type Output = [ T ] ;
527
526
528
527
#[ inline]
529
- fn index ( & self , index : ops:: Range < usize > ) -> & [ T ] {
530
- if index. start > index. end {
531
- slice_index_order_fail ( index. start , index. end ) ;
532
- } else if index. end > self . len ( ) {
533
- slice_index_len_fail ( index. end , self . len ( ) ) ;
528
+ fn index ( & self , index : R ) -> & [ T ] {
529
+ let len = self . len ( ) ;
530
+ let start = * index. start ( ) . unwrap_or ( & 0 ) ;
531
+ let end = * index. end ( ) . unwrap_or ( & len) ;
532
+ if start > end {
533
+ slice_index_order_fail ( start, end) ;
534
+ } else if end > len {
535
+ slice_index_len_fail ( end, len) ;
534
536
}
535
537
unsafe {
536
538
from_raw_parts (
537
- self . as_ptr ( ) . offset ( index . start as isize ) ,
538
- index . end - index . start
539
+ self . as_ptr ( ) . offset ( start as isize ) ,
540
+ end - start
539
541
)
540
542
}
541
543
}
542
544
}
543
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
544
- impl < T > ops:: Index < ops:: RangeTo < usize > > for [ T ] {
545
- type Output = [ T ] ;
546
545
547
- #[ inline]
548
- fn index ( & self , index : ops:: RangeTo < usize > ) -> & [ T ] {
549
- self . index ( ops:: Range { start : 0 , end : index. end } )
550
- }
551
- }
552
546
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
553
- impl < T > ops:: Index < ops:: RangeFrom < usize > > for [ T ] {
554
- type Output = [ T ] ;
555
-
547
+ impl < T , R : ops:: RangeArgument < usize > > ops:: IndexMut < R > for [ T ] {
556
548
#[ inline]
557
- fn index ( & self , index : ops:: RangeFrom < usize > ) -> & [ T ] {
558
- self . index ( ops:: Range { start : index. start , end : self . len ( ) } )
559
- }
560
- }
561
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
562
- impl < T > ops:: Index < RangeFull > for [ T ] {
563
- type Output = [ T ] ;
564
-
565
- #[ inline]
566
- fn index ( & self , _index : RangeFull ) -> & [ T ] {
567
- self
568
- }
569
- }
570
-
571
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
572
- impl < T > ops:: IndexMut < ops:: Range < usize > > for [ T ] {
573
- #[ inline]
574
- fn index_mut ( & mut self , index : ops:: Range < usize > ) -> & mut [ T ] {
575
- if index. start > index. end {
576
- slice_index_order_fail ( index. start , index. end ) ;
577
- } else if index. end > self . len ( ) {
578
- slice_index_len_fail ( index. end , self . len ( ) ) ;
549
+ fn index_mut ( & mut self , index : R ) -> & mut [ T ] {
550
+ let len = self . len ( ) ;
551
+ let start = * index. start ( ) . unwrap_or ( & 0 ) ;
552
+ let end = * index. end ( ) . unwrap_or ( & len) ;
553
+ if start > end {
554
+ slice_index_order_fail ( start, end) ;
555
+ } else if end > len {
556
+ slice_index_len_fail ( end, len) ;
579
557
}
580
558
unsafe {
581
559
from_raw_parts_mut (
582
- self . as_mut_ptr ( ) . offset ( index . start as isize ) ,
583
- index . end - index . start
560
+ self . as_mut_ptr ( ) . offset ( start as isize ) ,
561
+ end - start
584
562
)
585
563
}
586
564
}
587
565
}
588
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
589
- impl < T > ops:: IndexMut < ops:: RangeTo < usize > > for [ T ] {
590
- #[ inline]
591
- fn index_mut ( & mut self , index : ops:: RangeTo < usize > ) -> & mut [ T ] {
592
- self . index_mut ( ops:: Range { start : 0 , end : index. end } )
593
- }
594
- }
595
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
596
- impl < T > ops:: IndexMut < ops:: RangeFrom < usize > > for [ T ] {
597
- #[ inline]
598
- fn index_mut ( & mut self , index : ops:: RangeFrom < usize > ) -> & mut [ T ] {
599
- let len = self . len ( ) ;
600
- self . index_mut ( ops:: Range { start : index. start , end : len } )
601
- }
602
- }
603
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
604
- impl < T > ops:: IndexMut < RangeFull > for [ T ] {
605
- #[ inline]
606
- fn index_mut ( & mut self , _index : RangeFull ) -> & mut [ T ] {
607
- self
608
- }
609
- }
610
566
611
567
612
568
////////////////////////////////////////////////////////////////////////////////
0 commit comments