@@ -61,32 +61,6 @@ use raw::Slice as RawSlice;
6161/// Extension methods for immutable slices.
6262#[ unstable = "may merge with other traits; region parameter may disappear" ]
6363pub trait ImmutableSlice < ' a , T > {
64- /// Returns a subslice spanning the interval [`start`, `end`).
65- ///
66- /// Fails when the end of the new slice lies beyond the end of the
67- /// original slice (i.e. when `end > self.len()`) or when `start > end`.
68- ///
69- /// Slicing with `start` equal to `end` yields an empty slice.
70- #[ unstable = "waiting on final error conventions" ]
71- //fn slice(&self, start: uint, end: uint) -> &'a [T];
72-
73- /// Returns a subslice from `start` to the end of the slice.
74- ///
75- /// Fails when `start` is strictly greater than the length of the original slice.
76- ///
77- /// Slicing from `self.len()` yields an empty slice.
78- #[ unstable = "waiting on final error conventions" ]
79- // TODO
80- //fn slice_from(&self, start: uint) -> &'a [T];
81-
82- /// Returns a subslice from the start of the slice to `end`.
83- ///
84- /// Fails when `end` is strictly greater than the length of the original slice.
85- ///
86- /// Slicing to `0` yields an empty slice.
87- #[ unstable = "waiting on final error conventions" ]
88- //fn slice_to(&self, end: uint) -> &'a [T];
89-
9064 /// Divides one slice into two at an index.
9165 ///
9266 /// The first will contain all indices from `[0, mid)` (excluding
@@ -444,6 +418,35 @@ impl<'a,T> ImmutableSlice<'a, T> for &'a [T] {
444418 }
445419}
446420
421+ #[ cfg( not( stage0) ) ]
422+ impl < T > ops:: Slice < uint , [ T ] > for [ T ] {
423+ #[ inline]
424+ fn as_slice < ' a > ( & ' a self ) -> & ' a [ T ] {
425+ self
426+ }
427+
428+ #[ inline]
429+ fn slice_from < ' a > ( & ' a self , start : & uint ) -> & ' a [ T ] {
430+ self . slice ( start, & self . len ( ) )
431+ }
432+
433+ #[ inline]
434+ fn slice_to < ' a > ( & ' a self , end : & uint ) -> & ' a [ T ] {
435+ self . slice ( & 0 , end)
436+ }
437+ #[ inline]
438+ fn slice < ' a > ( & ' a self , start : & uint , end : & uint ) -> & ' a [ T ] {
439+ assert ! ( * start <= * end) ;
440+ assert ! ( * end <= self . len( ) ) ;
441+ unsafe {
442+ transmute ( RawSlice {
443+ data : self . as_ptr ( ) . offset ( * start as int ) ,
444+ len : ( * end - * start)
445+ } )
446+ }
447+ }
448+ }
449+ #[ cfg( stage0) ]
447450impl < T > ops:: Slice < uint , [ T ] > for [ T ] {
448451 #[ inline]
449452 fn as_slice_ < ' a > ( & ' a self ) -> & ' a [ T ] {
@@ -471,7 +474,36 @@ impl<T> ops::Slice<uint, [T]> for [T] {
471474 }
472475 }
473476}
477+ #[ cfg( not( stage0) ) ]
478+ impl < T > ops:: SliceMut < uint , [ T ] > for [ T ] {
479+ #[ inline]
480+ fn as_mut_slice < ' a > ( & ' a mut self ) -> & ' a mut [ T ] {
481+ self
482+ }
483+
484+ #[ inline]
485+ fn slice_from_mut < ' a > ( & ' a mut self , start : & uint ) -> & ' a mut [ T ] {
486+ let len = & self . len ( ) ;
487+ self . slice_mut ( start, len)
488+ }
474489
490+ #[ inline]
491+ fn slice_to_mut < ' a > ( & ' a mut self , end : & uint ) -> & ' a mut [ T ] {
492+ self . slice_mut ( & 0 , end)
493+ }
494+ #[ inline]
495+ fn slice_mut < ' a > ( & ' a mut self , start : & uint , end : & uint ) -> & ' a mut [ T ] {
496+ assert ! ( * start <= * end) ;
497+ assert ! ( * end <= self . len( ) ) ;
498+ unsafe {
499+ transmute ( RawSlice {
500+ data : self . as_ptr ( ) . offset ( * start as int ) ,
501+ len : ( * end - * start)
502+ } )
503+ }
504+ }
505+ }
506+ #[ cfg( stage0) ]
475507impl < T > ops:: SliceMut < uint , [ T ] > for [ T ] {
476508 #[ inline]
477509 fn as_mut_slice_ < ' a > ( & ' a mut self ) -> & ' a mut [ T ] {
@@ -514,49 +546,6 @@ pub trait MutableSlice<'a, T> {
514546 #[ deprecated = "use slicing syntax" ]
515547 fn as_mut_slice ( self ) -> & ' a mut [ T ] ;
516548
517- /// Deprecated: use `slice_mut`.
518- #[ deprecated = "use slicing syntax" ]
519- //fn mut_slice(self, start: uint, end: uint) -> &'a mut [T] {
520- // self[mut start..end]
521- //}
522-
523- /// Returns a mutable subslice spanning the interval [`start`, `end`).
524- ///
525- /// Fails when the end of the new slice lies beyond the end of the
526- /// original slice (i.e. when `end > self.len()`) or when `start > end`.
527- ///
528- /// Slicing with `start` equal to `end` yields an empty slice.
529- #[ unstable = "waiting on final error conventions" ]
530- //fn slice_mut(self, start: uint, end: uint) -> &'a mut [T];
531-
532- /// Deprecated: use `slicing syntax`.
533- #[ deprecated = "use slicing syntax" ]
534- //fn mut_slice_from(self, start: uint) -> &'a mut [T] {
535- // self[mut start..]
536- //}
537-
538- /// Returns a mutable subslice from `start` to the end of the slice.
539- ///
540- /// Fails when `start` is strictly greater than the length of the original slice.
541- ///
542- /// Slicing from `self.len()` yields an empty slice.
543- #[ unstable = "waiting on final error conventions" ]
544- //fn slice_from_mut(self, start: uint) -> &'a mut [T];
545-
546- /// Deprecated: use `slicing syntax`.
547- #[ deprecated = "use slicing syntax" ]
548- //fn mut_slice_to(self, end: uint) -> &'a mut [T] {
549- // self[mut ..end]
550- //}
551-
552- /// Returns a mutable subslice from the start of the slice to `end`.
553- ///
554- /// Fails when `end` is strictly greater than the length of the original slice.
555- ///
556- /// Slicing to `0` yields an empty slice.
557- #[ unstable = "waiting on final error conventions" ]
558- //fn slice_to_mut(self, end: uint) -> &'a mut [T];
559-
560549 /// Deprecated: use `iter_mut`.
561550 #[ deprecated = "use iter_mut" ]
562551 fn mut_iter ( self ) -> MutItems < ' a , T > {
0 commit comments