@@ -1083,30 +1083,113 @@ impl<T> SliceExt for [T] {
1083
1083
}
1084
1084
}
1085
1085
1086
- // HACK: With cfg(test) `impl [T]` is not available, these three functions are actually methods
1087
- // that are in `impl [T]` but not in `core::slice::SliceExt` - this is only need for testing
1086
+ // HACK(japaric) needed for the implementation of `vec!` macro during testing
1087
+ // NB see the hack module in this file for more details
1088
+ #[ cfg( not( stage0) ) ]
1088
1089
#[ cfg( test) ]
1089
- pub fn into_vec < T > ( mut b : Box < [ T ] > ) -> Vec < T > {
1090
- unsafe {
1091
- let xs = Vec :: from_raw_parts ( b. as_mut_ptr ( ) , b. len ( ) , b. len ( ) ) ;
1092
- mem:: forget ( b) ;
1093
- xs
1094
- }
1095
- }
1090
+ pub use self :: hack:: into_vec;
1096
1091
1092
+ // HACK(japaric) needed for the implementation of `Vec::clone` during testing
1093
+ // NB see the hack module in this file for more details
1094
+ #[ cfg( not( stage0) ) ]
1097
1095
#[ cfg( test) ]
1098
- pub fn permutations < T > ( s : & [ T ] ) -> Permutations < T > where T : Clone {
1099
- Permutations {
1100
- swaps : ElementSwaps :: new ( s. len ( ) ) ,
1101
- v : :: slice:: to_vec ( s) ,
1096
+ pub use self :: hack:: to_vec;
1097
+
1098
+ // HACK(japaric): With cfg(test) `impl [T]` is not available, these three functions are actually
1099
+ // methods that are in `impl [T]` but not in `core::slice::SliceExt` - we need to supply these
1100
+ // functions for the `test_permutations` test
1101
+ #[ cfg( not( stage0) ) ]
1102
+ mod hack {
1103
+ use alloc:: boxed:: Box ;
1104
+ use core:: clone:: Clone ;
1105
+ #[ cfg( test) ]
1106
+ use core:: iter:: { Iterator , IteratorExt } ;
1107
+ use core:: mem;
1108
+ #[ cfg( test) ]
1109
+ use core:: option:: Option :: { Some , None } ;
1110
+
1111
+ #[ cfg( test) ]
1112
+ use string:: ToString ;
1113
+ use vec:: Vec ;
1114
+
1115
+ use super :: { ElementSwaps , Permutations } ;
1116
+
1117
+ pub fn into_vec < T > ( mut b : Box < [ T ] > ) -> Vec < T > {
1118
+ unsafe {
1119
+ let xs = Vec :: from_raw_parts ( b. as_mut_ptr ( ) , b. len ( ) , b. len ( ) ) ;
1120
+ mem:: forget ( b) ;
1121
+ xs
1122
+ }
1102
1123
}
1103
- }
1104
1124
1105
- #[ cfg( test) ]
1106
- pub fn to_vec < T > ( s : & [ T ] ) -> Vec < T > where T : Clone {
1107
- let mut vector = Vec :: with_capacity ( s. len ( ) ) ;
1108
- vector. push_all ( s) ;
1109
- vector
1125
+ pub fn permutations < T > ( s : & [ T ] ) -> Permutations < T > where T : Clone {
1126
+ Permutations {
1127
+ swaps : ElementSwaps :: new ( s. len ( ) ) ,
1128
+ v : to_vec ( s) ,
1129
+ }
1130
+ }
1131
+
1132
+ #[ inline]
1133
+ pub fn to_vec < T > ( s : & [ T ] ) -> Vec < T > where T : Clone {
1134
+ let mut vector = Vec :: with_capacity ( s. len ( ) ) ;
1135
+ vector. push_all ( s) ;
1136
+ vector
1137
+ }
1138
+
1139
+ // NB we can remove this hack if we move this test to libcollectionstest - but that can't be
1140
+ // done right now because the test needs access to the private fields of Permutations
1141
+ #[ test]
1142
+ fn test_permutations ( ) {
1143
+ {
1144
+ let v: [ i32 ; 0 ] = [ ] ;
1145
+ let mut it = permutations ( & v) ;
1146
+ let ( min_size, max_opt) = it. size_hint ( ) ;
1147
+ assert_eq ! ( min_size, 1 ) ;
1148
+ assert_eq ! ( max_opt. unwrap( ) , 1 ) ;
1149
+ assert_eq ! ( it. next( ) , Some ( to_vec( & v) ) ) ;
1150
+ assert_eq ! ( it. next( ) , None ) ;
1151
+ }
1152
+ {
1153
+ let v = [ "Hello" . to_string ( ) ] ;
1154
+ let mut it = permutations ( & v) ;
1155
+ let ( min_size, max_opt) = it. size_hint ( ) ;
1156
+ assert_eq ! ( min_size, 1 ) ;
1157
+ assert_eq ! ( max_opt. unwrap( ) , 1 ) ;
1158
+ assert_eq ! ( it. next( ) , Some ( to_vec( & v) ) ) ;
1159
+ assert_eq ! ( it. next( ) , None ) ;
1160
+ }
1161
+ {
1162
+ let v = [ 1 , 2 , 3 ] ;
1163
+ let mut it = permutations ( & v) ;
1164
+ let ( min_size, max_opt) = it. size_hint ( ) ;
1165
+ assert_eq ! ( min_size, 3 * 2 ) ;
1166
+ assert_eq ! ( max_opt. unwrap( ) , 3 * 2 ) ;
1167
+ assert_eq ! ( it. next( ) . unwrap( ) , [ 1 , 2 , 3 ] ) ;
1168
+ assert_eq ! ( it. next( ) . unwrap( ) , [ 1 , 3 , 2 ] ) ;
1169
+ assert_eq ! ( it. next( ) . unwrap( ) , [ 3 , 1 , 2 ] ) ;
1170
+ let ( min_size, max_opt) = it. size_hint ( ) ;
1171
+ assert_eq ! ( min_size, 3 ) ;
1172
+ assert_eq ! ( max_opt. unwrap( ) , 3 ) ;
1173
+ assert_eq ! ( it. next( ) . unwrap( ) , [ 3 , 2 , 1 ] ) ;
1174
+ assert_eq ! ( it. next( ) . unwrap( ) , [ 2 , 3 , 1 ] ) ;
1175
+ assert_eq ! ( it. next( ) . unwrap( ) , [ 2 , 1 , 3 ] ) ;
1176
+ assert_eq ! ( it. next( ) , None ) ;
1177
+ }
1178
+ {
1179
+ // check that we have N! permutations
1180
+ let v = [ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' ] ;
1181
+ let mut amt = 0 ;
1182
+ let mut it = permutations ( & v) ;
1183
+ let ( min_size, max_opt) = it. size_hint ( ) ;
1184
+ for _perm in it. by_ref ( ) {
1185
+ amt += 1 ;
1186
+ }
1187
+ assert_eq ! ( amt, it. swaps. swaps_made) ;
1188
+ assert_eq ! ( amt, min_size) ;
1189
+ assert_eq ! ( amt, 2 * 3 * 4 * 5 * 6 ) ;
1190
+ assert_eq ! ( amt, max_opt. unwrap( ) ) ;
1191
+ }
1192
+ }
1110
1193
}
1111
1194
1112
1195
#[ cfg( not( stage0) ) ]
@@ -1715,9 +1798,8 @@ impl<T> [T] {
1715
1798
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1716
1799
#[ inline]
1717
1800
pub fn to_vec ( & self ) -> Vec < T > where T : Clone {
1718
- let mut vector = Vec :: with_capacity ( self . len ( ) ) ;
1719
- vector. push_all ( self ) ;
1720
- vector
1801
+ // NB see hack module in this file
1802
+ hack:: to_vec ( self )
1721
1803
}
1722
1804
1723
1805
/// Creates an iterator that yields every possible permutation of the
@@ -1745,11 +1827,10 @@ impl<T> [T] {
1745
1827
/// assert_eq!(Some(vec![3, 1, 2]), perms.next());
1746
1828
/// ```
1747
1829
#[ unstable( feature = "collections" ) ]
1830
+ #[ inline]
1748
1831
pub fn permutations ( & self ) -> Permutations < T > where T : Clone {
1749
- Permutations {
1750
- swaps : ElementSwaps :: new ( self . len ( ) ) ,
1751
- v : self . to_vec ( ) ,
1752
- }
1832
+ // NB see hack module in this file
1833
+ hack:: permutations ( self )
1753
1834
}
1754
1835
1755
1836
/// Copies as many elements from `src` as it can into `self` (the
@@ -1931,12 +2012,10 @@ impl<T> [T] {
1931
2012
1932
2013
/// Convert `self` into a vector without clones or allocation.
1933
2014
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1934
- pub fn into_vec ( mut self : Box < Self > ) -> Vec < T > {
1935
- unsafe {
1936
- let xs = Vec :: from_raw_parts ( self . as_mut_ptr ( ) , self . len ( ) , self . len ( ) ) ;
1937
- mem:: forget ( self ) ;
1938
- xs
1939
- }
2015
+ #[ inline]
2016
+ pub fn into_vec ( self : Box < Self > ) -> Vec < T > {
2017
+ // NB see hack module in this file
2018
+ hack:: into_vec ( self )
1940
2019
}
1941
2020
}
1942
2021
@@ -2052,10 +2131,12 @@ impl<T: Clone> ToOwned for [T] {
2052
2131
#[ cfg( not( test) ) ]
2053
2132
fn to_owned ( & self ) -> Vec < T > { self . to_vec ( ) }
2054
2133
2055
- // HACK: `impl [T]` is not available in cfg(test), use `::slice::to_vec` instead of
2056
- // `<[T]>::to_vec`
2134
+ // HACK(japaric): with cfg(test) the inherent `[T]::to_vec`, which is required for this method
2135
+ // definition, is not available. Since we don't require this method for testing purposes, I'll
2136
+ // just stub it
2137
+ // NB see the slice::hack module in slice.rs for more information
2057
2138
#[ cfg( test) ]
2058
- fn to_owned ( & self ) -> Vec < T > { :: slice :: to_vec ( self ) }
2139
+ fn to_owned ( & self ) -> Vec < T > { panic ! ( "not available with cfg(test)" ) }
2059
2140
}
2060
2141
2061
2142
////////////////////////////////////////////////////////////////////////////////
@@ -2372,63 +2453,3 @@ fn merge_sort<T, F>(v: &mut [T], mut compare: F) where F: FnMut(&T, &T) -> Order
2372
2453
old
2373
2454
}
2374
2455
}
2375
-
2376
- #[ cfg( test) ]
2377
- mod test {
2378
- use core:: iter:: { Iterator , IteratorExt } ;
2379
- use core:: option:: Option :: { None , Some } ;
2380
- use string:: ToString ;
2381
-
2382
- #[ test]
2383
- fn test_permutations ( ) {
2384
- {
2385
- let v: [ i32 ; 0 ] = [ ] ;
2386
- let mut it = :: slice:: permutations ( & v) ;
2387
- let ( min_size, max_opt) = it. size_hint ( ) ;
2388
- assert_eq ! ( min_size, 1 ) ;
2389
- assert_eq ! ( max_opt. unwrap( ) , 1 ) ;
2390
- assert_eq ! ( it. next( ) , Some ( :: slice:: to_vec( & v) ) ) ;
2391
- assert_eq ! ( it. next( ) , None ) ;
2392
- }
2393
- {
2394
- let v = [ "Hello" . to_string ( ) ] ;
2395
- let mut it = :: slice:: permutations ( & v) ;
2396
- let ( min_size, max_opt) = it. size_hint ( ) ;
2397
- assert_eq ! ( min_size, 1 ) ;
2398
- assert_eq ! ( max_opt. unwrap( ) , 1 ) ;
2399
- assert_eq ! ( it. next( ) , Some ( :: slice:: to_vec( & v) ) ) ;
2400
- assert_eq ! ( it. next( ) , None ) ;
2401
- }
2402
- {
2403
- let v = [ 1 , 2 , 3 ] ;
2404
- let mut it = :: slice:: permutations ( & v) ;
2405
- let ( min_size, max_opt) = it. size_hint ( ) ;
2406
- assert_eq ! ( min_size, 3 * 2 ) ;
2407
- assert_eq ! ( max_opt. unwrap( ) , 3 * 2 ) ;
2408
- assert_eq ! ( it. next( ) . unwrap( ) , [ 1 , 2 , 3 ] ) ;
2409
- assert_eq ! ( it. next( ) . unwrap( ) , [ 1 , 3 , 2 ] ) ;
2410
- assert_eq ! ( it. next( ) . unwrap( ) , [ 3 , 1 , 2 ] ) ;
2411
- let ( min_size, max_opt) = it. size_hint ( ) ;
2412
- assert_eq ! ( min_size, 3 ) ;
2413
- assert_eq ! ( max_opt. unwrap( ) , 3 ) ;
2414
- assert_eq ! ( it. next( ) . unwrap( ) , [ 3 , 2 , 1 ] ) ;
2415
- assert_eq ! ( it. next( ) . unwrap( ) , [ 2 , 3 , 1 ] ) ;
2416
- assert_eq ! ( it. next( ) . unwrap( ) , [ 2 , 1 , 3 ] ) ;
2417
- assert_eq ! ( it. next( ) , None ) ;
2418
- }
2419
- {
2420
- // check that we have N! permutations
2421
- let v = [ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' ] ;
2422
- let mut amt = 0 ;
2423
- let mut it = :: slice:: permutations ( & v) ;
2424
- let ( min_size, max_opt) = it. size_hint ( ) ;
2425
- for _perm in it. by_ref ( ) {
2426
- amt += 1 ;
2427
- }
2428
- assert_eq ! ( amt, it. swaps. swaps_made) ;
2429
- assert_eq ! ( amt, min_size) ;
2430
- assert_eq ! ( amt, 2 * 3 * 4 * 5 * 6 ) ;
2431
- assert_eq ! ( amt, max_opt. unwrap( ) ) ;
2432
- }
2433
- }
2434
- }
0 commit comments