@@ -1445,46 +1445,6 @@ pub fn reverse<T>(v: &mut [T]) {
1445
1445
}
1446
1446
}
1447
1447
1448
- /**
1449
- * Reverse part of a vector in place.
1450
- *
1451
- * Reverse the elements in the vector between `start` and `end - 1`.
1452
- *
1453
- * If either start or end do not represent valid positions in the vector, the
1454
- * vector is returned unchanged.
1455
- *
1456
- * # Arguments
1457
- *
1458
- * * `v` - The mutable vector to be modified
1459
- *
1460
- * * `start` - Index of the first element of the slice
1461
- *
1462
- * * `end` - Index one past the final element to be reversed.
1463
- *
1464
- * # Example
1465
- *
1466
- * Assume a mutable vector `v` contains `[1,2,3,4,5]`. After the call:
1467
- *
1468
- * ~~~
1469
- *
1470
- * reverse_part(v, 1, 4);
1471
- *
1472
- * ~~~
1473
- *
1474
- * `v` now contains `[1,4,3,2,5]`.
1475
- */
1476
- pub fn reverse_part < T > ( v : & mut [ T ] , start : uint , end : uint ) {
1477
- let sz = v. len ( ) ;
1478
- if start >= sz || end > sz { return ; }
1479
- let mut i = start;
1480
- let mut j = end - 1 ;
1481
- while i < j {
1482
- vec:: swap ( v, i, j) ;
1483
- i += 1 ;
1484
- j -= 1 ;
1485
- }
1486
- }
1487
-
1488
1448
/// Returns a vector with the order of elements reversed
1489
1449
pub fn reversed < T : Copy > ( v : & const [ T ] ) -> ~[ T ] {
1490
1450
let mut rs: ~[ T ] = ~[ ] ;
@@ -1779,69 +1739,29 @@ pub fn each2_mut<U, T>(v1: &mut [U], v2: &mut [T], f: &fn(u: &mut U, t: &mut T)
1779
1739
*
1780
1740
* The total number of permutations produced is `len(v)!`. If `v` contains
1781
1741
* repeated elements, then some permutations are repeated.
1782
- *
1783
- * See [Algorithms to generate
1784
- * permutations](http://en.wikipedia.org/wiki/Permutation).
1785
- *
1786
- * # Arguments
1787
- *
1788
- * * `values` - A vector of values from which the permutations are
1789
- * chosen
1790
- *
1791
- * * `fun` - The function to iterate over the combinations
1792
1742
*/
1793
- pub fn each_permutation < T : Copy > ( values : & [ T ] , fun : & fn ( perm : & [ T ] ) -> bool ) {
1794
- let length = values. len ( ) ;
1795
- let mut permutation = vec:: from_fn ( length, |i| values[ i] ) ;
1796
- if length <= 1 {
1797
- fun ( permutation) ;
1798
- return ;
1799
- }
1800
- let mut indices = vec:: from_fn ( length, |i| i) ;
1801
- loop {
1802
- if !fun ( permutation) { return ; }
1803
- // find largest k such that indices[k] < indices[k+1]
1804
- // if no such k exists, all permutations have been generated
1805
- let mut k = length - 2 ;
1806
- while k > 0 && indices[ k] >= indices[ k+1 ] {
1807
- k -= 1 ;
1808
- }
1809
- if k == 0 && indices[ 0 ] > indices[ 1 ] { return ; }
1810
- // find largest l such that indices[k] < indices[l]
1811
- // k+1 is guaranteed to be such
1812
- let mut l = length - 1 ;
1813
- while indices[ k] >= indices[ l] {
1814
- l -= 1 ;
1815
- }
1816
- // swap indices[k] and indices[l]; sort indices[k+1..]
1817
- // (they're just reversed)
1818
- vec:: swap ( indices, k, l) ;
1819
- reverse_part ( indices, k+1 , length) ;
1820
- // fixup permutation based on indices
1821
- for uint:: range( k, length) |i| {
1822
- permutation[ i] = values[ indices[ i] ] ;
1743
+ #[ cfg( not( stage0) ) ]
1744
+ pub fn each_permutation < T : Copy > ( v : & [ T ] , put : & fn ( ts : & [ T ] ) -> bool ) -> bool {
1745
+ let ln = len ( v) ;
1746
+ if ln <= 1 {
1747
+ put ( v) ;
1748
+ } else {
1749
+ // This does not seem like the most efficient implementation. You
1750
+ // could make far fewer copies if you put your mind to it.
1751
+ let mut i = 0 u;
1752
+ while i < ln {
1753
+ let elt = v[ i] ;
1754
+ let mut rest = slice ( v, 0 u, i) . to_vec ( ) ;
1755
+ rest. push_all ( const_slice ( v, i+1 u, ln) ) ;
1756
+ for each_permutation( rest) |permutation| {
1757
+ if !put ( append ( ~[ elt] , permutation) ) {
1758
+ return false ;
1759
+ }
1760
+ }
1761
+ i += 1 u;
1823
1762
}
1824
1763
}
1825
- }
1826
-
1827
- /**
1828
- * Iterate over all permutations of vector `values`.
1829
- *
1830
- * This is an alternative to each_permutation that uses references to
1831
- * avoid copying the elements of the values vector.
1832
- *
1833
- * To avoid copying, the iterator will be passed a reference to a vector
1834
- * containing references to the elements in the original `values` vector.
1835
- *
1836
- * # Arguments
1837
- *
1838
- * * `values` - A vector of values from which the permutations are chosen
1839
- *
1840
- * * `fun` - The function to iterate over the permutations
1841
- */
1842
- #[ cfg( not( stage0) ) ]
1843
- pub fn each_permutation_ref < T > ( values : & [ T ] , fun : & fn ( perm : & [ & T ] ) -> bool ) {
1844
- each_permutation ( vec:: from_fn ( values. len ( ) , |i| & values[ i] ) , fun) ;
1764
+ return true ;
1845
1765
}
1846
1766
1847
1767
/**
@@ -4810,93 +4730,6 @@ mod tests {
4810
4730
}
4811
4731
}
4812
4732
4813
- #[ test]
4814
- fn test_reverse_part ( ) {
4815
- let mut values = [ 1 , 2 , 3 , 4 , 5 ] ;
4816
- reverse_part ( values, 1 , 4 ) ;
4817
- assert_eq ! ( values, [ 1 , 4 , 3 , 2 , 5 ] ) ;
4818
- }
4819
-
4820
- #[ test]
4821
- fn test_permutations0 ( ) {
4822
- let values = [ ] ;
4823
- let mut v : ~[ ~[ int ] ] = ~[ ] ;
4824
- for each_permutation( values) |p| {
4825
- v. push ( p. to_owned ( ) ) ;
4826
- }
4827
- assert_eq ! ( v, ~[ ~[ ] ] ) ;
4828
- }
4829
-
4830
- #[ test]
4831
- fn test_permutations0_ref ( ) {
4832
- let values = [ ] ;
4833
- let mut v : ~[ ~[ int ] ] = ~[ ] ;
4834
- for each_permutation_ref( values) |p| {
4835
- v. push ( p. to_owned ( ) ) ;
4836
- }
4837
- assert_eq ! ( v, ~[ ~[ ] ] ) ;
4838
- }
4839
-
4840
- #[ test]
4841
- fn test_permutations1 ( ) {
4842
- let values = [ 1 ] ;
4843
- let mut v : ~[ ~[ int ] ] = ~[ ] ;
4844
- for each_permutation( values) |p| {
4845
- v. push ( p. to_owned ( ) ) ;
4846
- }
4847
- assert_eq ! ( v, ~[ ~[ 1 ] ] ) ;
4848
- }
4849
-
4850
- #[ test]
4851
- fn test_permutations1_ref ( ) {
4852
- let values = [ 1 ] ;
4853
- let mut v : ~[ ~[ int ] ] = ~[ ] ;
4854
- for each_permutation_ref( values) |p| {
4855
- v. push ( p. to_owned ( ) ) ;
4856
- }
4857
- assert_eq ! ( v, ~[ ~[ 1 ] ] ) ;
4858
- }
4859
-
4860
- #[ test]
4861
- fn test_permutations2 ( ) {
4862
- let values = [ 1 , 2 ] ;
4863
- let mut v : ~[ ~[ int ] ] = ~[ ] ;
4864
- for each_permutation( values) |p| {
4865
- v. push ( p. to_owned ( ) ) ;
4866
- }
4867
- assert_eq ! ( v, ~[ ~[ 1 , 2 ] , ~[ 2 , 1 ] ] ) ;
4868
- }
4869
-
4870
- #[ test]
4871
- fn test_permutations2_ref ( ) {
4872
- let values = [ 1 , 2 ] ;
4873
- let mut v : ~[ ~[ int ] ] = ~[ ] ;
4874
- for each_permutation_ref( values) |p| {
4875
- v. push ( p. to_owned ( ) ) ;
4876
- }
4877
- assert_eq ! ( v, ~[ ~[ 1 , 2 ] , ~[ 2 , 1 ] ] ) ;
4878
- }
4879
-
4880
- #[ test]
4881
- fn test_permutations3 ( ) {
4882
- let values = [ 1 , 2 , 3 ] ;
4883
- let mut v : ~[ ~[ int ] ] = ~[ ] ;
4884
- for each_permutation( values) |p| {
4885
- v. push ( p. to_owned ( ) ) ;
4886
- }
4887
- assert_eq ! ( v, ~[ ~[ 1 , 2 , 3 ] , ~[ 1 , 3 , 2 ] , ~[ 2 , 1 , 3 ] , ~[ 2 , 3 , 1 ] , ~[ 3 , 1 , 2 ] , ~[ 3 , 2 , 1 ] ] ) ;
4888
- }
4889
-
4890
- #[ test]
4891
- fn test_permutations3_ref ( ) {
4892
- let values = [ 1 , 2 , 3 ] ;
4893
- let mut v : ~[ ~[ int ] ] = ~[ ] ;
4894
- for each_permutation_ref( values) |p| {
4895
- v. push ( p. to_owned ( ) ) ;
4896
- }
4897
- assert_eq ! ( v, ~[ ~[ 1 , 2 , 3 ] , ~[ 1 , 3 , 2 ] , ~[ 2 , 1 , 3 ] , ~[ 2 , 3 , 1 ] , ~[ 3 , 1 , 2 ] , ~[ 3 , 2 , 1 ] ] ) ;
4898
- }
4899
-
4900
4733
#[ test]
4901
4734
fn test_each_val ( ) {
4902
4735
use old_iter:: CopyableNonstrictIter ;
0 commit comments