@@ -40,8 +40,7 @@ use cmp;
4040use default:: Default ;
4141use intrinsics:: assume;
4242use iter:: * ;
43- use ops:: { FnMut , self , Index } ;
44- use ops:: RangeFull ;
43+ use ops:: { FnMut , self } ;
4544use option:: Option ;
4645use option:: Option :: { None , Some } ;
4746use result:: Result ;
@@ -522,91 +521,48 @@ fn slice_index_order_fail(index: usize, end: usize) -> ! {
522521}
523522
524523#[ 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 ] {
526525 type Output = [ T ] ;
527526
528527 #[ 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) ;
534536 }
535537 unsafe {
536538 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
539541 )
540542 }
541543 }
542544}
543- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
544- impl < T > ops:: Index < ops:: RangeTo < usize > > for [ T ] {
545- type Output = [ T ] ;
546545
547- #[ inline]
548- fn index ( & self , index : ops:: RangeTo < usize > ) -> & [ T ] {
549- self . index ( ops:: Range { start : 0 , end : index. end } )
550- }
551- }
552546#[ 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 ] {
556548 #[ 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) ;
579557 }
580558 unsafe {
581559 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
584562 )
585563 }
586564 }
587565}
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- }
610566
611567
612568////////////////////////////////////////////////////////////////////////////////
0 commit comments