44
44
//!
45
45
//! A number of traits add methods that allow you to accomplish tasks with slices.
46
46
//! These traits include `ImmutableSlice`, which is defined for `&[T]` types,
47
- //! and `MutableSlice`, defined for `&mut [T]` types.
47
+ //! `MutableSlice`, defined for `&mut [T]` types, and `Slice` and `SliceMut`
48
+ //! which are defined for `[T]`.
48
49
//!
49
- //! An example is the method `.slice(a, b)` that returns an immutable "view" into
50
- //! a `Vec` or another slice from the index interval `[a, b)`:
50
+ //! An example is the `slice` method which enables slicing syntax `[a..b]` that
51
+ //! returns an immutable "view" into a `Vec` or another slice from the index
52
+ //! interval `[a, b)`:
51
53
//!
52
54
//! ```rust
53
- //! let numbers = [0i, 1i, 2i];
54
- //! let last_numbers = numbers.slice(1, 3);
55
- //! // last_numbers is now &[1i, 2i]
55
+ //! #![feature(slicing_syntax)]
56
+ //! fn main() {
57
+ //! let numbers = [0i, 1i, 2i];
58
+ //! let last_numbers = numbers[1..3];
59
+ //! // last_numbers is now &[1i, 2i]
60
+ //! }
56
61
//! ```
57
62
//!
58
63
//! ## Implementations of other traits
@@ -93,7 +98,7 @@ use core::iter::{range_step, MultiplicativeIterator};
93
98
use MutableSeq ;
94
99
use vec:: Vec ;
95
100
96
- pub use core:: slice:: { Chunks , Slice , ImmutableSlice , ImmutablePartialEqSlice } ;
101
+ pub use core:: slice:: { Chunks , AsSlice , ImmutableSlice , ImmutablePartialEqSlice } ;
97
102
pub use core:: slice:: { ImmutableOrdSlice , MutableSlice , Items , MutItems } ;
98
103
pub use core:: slice:: { MutSplits , MutChunks , Splits } ;
99
104
pub use core:: slice:: { bytes, mut_ref_slice, ref_slice, MutableCloneableSlice } ;
@@ -112,7 +117,7 @@ pub trait VectorVector<T> {
112
117
fn connect_vec ( & self , sep : & T ) -> Vec < T > ;
113
118
}
114
119
115
- impl < ' a , T : Clone , V : Slice < T > > VectorVector < T > for & ' a [ V ] {
120
+ impl < ' a , T : Clone , V : AsSlice < T > > VectorVector < T > for & ' a [ V ] {
116
121
fn concat_vec ( & self ) -> Vec < T > {
117
122
let size = self . iter ( ) . fold ( 0 u, |acc, v| acc + v. as_slice ( ) . len ( ) ) ;
118
123
let mut result = Vec :: with_capacity ( size) ;
@@ -610,7 +615,7 @@ impl<'a,T> MutableSliceAllocating<'a, T> for &'a mut [T] {
610
615
611
616
#[ inline]
612
617
fn move_from ( self , mut src : Vec < T > , start : uint , end : uint ) -> uint {
613
- for ( a, b) in self . iter_mut ( ) . zip ( src. slice_mut ( start , end) . iter_mut ( ) ) {
618
+ for ( a, b) in self . iter_mut ( ) . zip ( src[ mut start.. end] . iter_mut ( ) ) {
614
619
mem:: swap ( a, b) ;
615
620
}
616
621
cmp:: min ( self . len ( ) , end-start)
@@ -702,7 +707,7 @@ impl<'a, T: Ord> MutableOrdSlice<T> for &'a mut [T] {
702
707
self . swap ( j, i-1 ) ;
703
708
704
709
// Step 4: Reverse the (previously) weakly decreasing part
705
- self . slice_from_mut ( i ) . reverse ( ) ;
710
+ self [ mut i.. ] . reverse ( ) ;
706
711
707
712
true
708
713
}
@@ -723,7 +728,7 @@ impl<'a, T: Ord> MutableOrdSlice<T> for &'a mut [T] {
723
728
}
724
729
725
730
// Step 2: Reverse the weakly increasing part
726
- self . slice_from_mut ( i ) . reverse ( ) ;
731
+ self [ mut i.. ] . reverse ( ) ;
727
732
728
733
// Step 3: Find the rightmost element equal to or bigger than the pivot (i-1)
729
734
let mut j = self . len ( ) - 1 ;
@@ -990,24 +995,24 @@ mod tests {
990
995
fn test_slice ( ) {
991
996
// Test fixed length vector.
992
997
let vec_fixed = [ 1 i, 2 , 3 , 4 ] ;
993
- let v_a = vec_fixed. slice ( 1 u , vec_fixed. len ( ) ) . to_vec ( ) ;
998
+ let v_a = vec_fixed[ 1 u.. vec_fixed. len ( ) ] . to_vec ( ) ;
994
999
assert_eq ! ( v_a. len( ) , 3 u) ;
995
1000
let v_a = v_a. as_slice ( ) ;
996
1001
assert_eq ! ( v_a[ 0 ] , 2 ) ;
997
1002
assert_eq ! ( v_a[ 1 ] , 3 ) ;
998
1003
assert_eq ! ( v_a[ 2 ] , 4 ) ;
999
1004
1000
1005
// Test on stack.
1001
- let vec_stack = & [ 1 i, 2 , 3 ] ;
1002
- let v_b = vec_stack. slice ( 1 u , 3 u ) . to_vec ( ) ;
1006
+ let vec_stack: & [ _ ] = & [ 1 i, 2 , 3 ] ;
1007
+ let v_b = vec_stack[ 1 u.. 3 u ] . to_vec ( ) ;
1003
1008
assert_eq ! ( v_b. len( ) , 2 u) ;
1004
1009
let v_b = v_b. as_slice ( ) ;
1005
1010
assert_eq ! ( v_b[ 0 ] , 2 ) ;
1006
1011
assert_eq ! ( v_b[ 1 ] , 3 ) ;
1007
1012
1008
1013
// Test `Box<[T]>`
1009
1014
let vec_unique = vec ! [ 1 i, 2 , 3 , 4 , 5 , 6 ] ;
1010
- let v_d = vec_unique. slice ( 1 u , 6 u ) . to_vec ( ) ;
1015
+ let v_d = vec_unique[ 1 u.. 6 u ] . to_vec ( ) ;
1011
1016
assert_eq ! ( v_d. len( ) , 5 u) ;
1012
1017
let v_d = v_d. as_slice ( ) ;
1013
1018
assert_eq ! ( v_d[ 0 ] , 2 ) ;
@@ -1020,21 +1025,21 @@ mod tests {
1020
1025
#[ test]
1021
1026
fn test_slice_from ( ) {
1022
1027
let vec: & [ int ] = & [ 1 , 2 , 3 , 4 ] ;
1023
- assert_eq ! ( vec. slice_from ( 0 ) , vec) ;
1028
+ assert_eq ! ( vec[ 0 .. ] , vec) ;
1024
1029
let b: & [ int ] = & [ 3 , 4 ] ;
1025
- assert_eq ! ( vec. slice_from ( 2 ) , b) ;
1030
+ assert_eq ! ( vec[ 2 .. ] , b) ;
1026
1031
let b: & [ int ] = & [ ] ;
1027
- assert_eq ! ( vec. slice_from ( 4 ) , b) ;
1032
+ assert_eq ! ( vec[ 4 .. ] , b) ;
1028
1033
}
1029
1034
1030
1035
#[ test]
1031
1036
fn test_slice_to ( ) {
1032
1037
let vec: & [ int ] = & [ 1 , 2 , 3 , 4 ] ;
1033
- assert_eq ! ( vec. slice_to ( 4 ) , vec) ;
1038
+ assert_eq ! ( vec[ .. 4 ] , vec) ;
1034
1039
let b: & [ int ] = & [ 1 , 2 ] ;
1035
- assert_eq ! ( vec. slice_to ( 2 ) , b) ;
1040
+ assert_eq ! ( vec[ .. 2 ] , b) ;
1036
1041
let b: & [ int ] = & [ ] ;
1037
- assert_eq ! ( vec. slice_to ( 0 ) , b) ;
1042
+ assert_eq ! ( vec[ .. 0 ] , b) ;
1038
1043
}
1039
1044
1040
1045
@@ -1975,7 +1980,7 @@ mod tests {
1975
1980
assert ! ( a == [ 7 i, 2 , 3 , 4 ] ) ;
1976
1981
let mut a = [ 1 i, 2 , 3 , 4 , 5 ] ;
1977
1982
let b = vec ! [ 5 i, 6 , 7 , 8 , 9 , 0 ] ;
1978
- assert_eq ! ( a. slice_mut ( 2 , 4 ) . move_from( b, 1 , 6 ) , 2 ) ;
1983
+ assert_eq ! ( a[ mut 2 .. 4 ] . move_from( b, 1 , 6 ) , 2 ) ;
1979
1984
assert ! ( a == [ 1 i, 2 , 6 , 7 , 5 ] ) ;
1980
1985
}
1981
1986
@@ -1995,7 +2000,7 @@ mod tests {
1995
2000
#[ test]
1996
2001
fn test_reverse_part ( ) {
1997
2002
let mut values = [ 1 i, 2 , 3 , 4 , 5 ] ;
1998
- values. slice_mut ( 1 , 4 ) . reverse ( ) ;
2003
+ values[ mut 1 .. 4 ] . reverse ( ) ;
1999
2004
assert ! ( values == [ 1 , 4 , 3 , 2 , 5 ] ) ;
2000
2005
}
2001
2006
@@ -2042,9 +2047,9 @@ mod tests {
2042
2047
fn test_bytes_set_memory ( ) {
2043
2048
use slice:: bytes:: MutableByteVector ;
2044
2049
let mut values = [ 1u8 , 2 , 3 , 4 , 5 ] ;
2045
- values. slice_mut ( 0 , 5 ) . set_memory ( 0xAB ) ;
2050
+ values[ mut 0 .. 5 ] . set_memory ( 0xAB ) ;
2046
2051
assert ! ( values == [ 0xAB , 0xAB , 0xAB , 0xAB , 0xAB ] ) ;
2047
- values. slice_mut ( 2 , 4 ) . set_memory ( 0xFF ) ;
2052
+ values[ mut 2 .. 4 ] . set_memory ( 0xFF ) ;
2048
2053
assert ! ( values == [ 0xAB , 0xAB , 0xFF , 0xFF , 0xAB ] ) ;
2049
2054
}
2050
2055
@@ -2070,12 +2075,18 @@ mod tests {
2070
2075
let mut values = [ 1u8 , 2 , 3 , 4 , 5 ] ;
2071
2076
{
2072
2077
let ( left, right) = values. split_at_mut ( 2 ) ;
2073
- assert ! ( left. slice( 0 , left. len( ) ) == [ 1 , 2 ] ) ;
2078
+ {
2079
+ let left: & [ _ ] = left;
2080
+ assert ! ( left[ 0 ..left. len( ) ] == [ 1 , 2 ] ) ;
2081
+ }
2074
2082
for p in left. iter_mut ( ) {
2075
2083
* p += 1 ;
2076
2084
}
2077
2085
2078
- assert ! ( right. slice( 0 , right. len( ) ) == [ 3 , 4 , 5 ] ) ;
2086
+ {
2087
+ let right: & [ _ ] = right;
2088
+ assert ! ( right[ 0 ..right. len( ) ] == [ 3 , 4 , 5 ] ) ;
2089
+ }
2079
2090
for p in right. iter_mut ( ) {
2080
2091
* p += 2 ;
2081
2092
}
@@ -2099,7 +2110,7 @@ mod tests {
2099
2110
}
2100
2111
assert_eq ! ( cnt, 3 ) ;
2101
2112
2102
- for f in v. slice ( 1 , 3 ) . iter ( ) {
2113
+ for f in v[ 1 .. 3 ] . iter ( ) {
2103
2114
assert ! ( * f == Foo ) ;
2104
2115
cnt += 1 ;
2105
2116
}
0 commit comments