@@ -7,7 +7,7 @@ Idea: provide functions for 'exhaustive' and 'random' modification of vecs.
7
7
two functions, "return the number of possible edits" and "return edit #n"
8
8
9
9
It would be nice if this could be data-driven, so the two functions could share information:
10
- type vec_modifier = rec(fn (&int [] v, uint i) -> int [] fun, uint lo, uint di);
10
+ type vec_modifier = rec(fn (&T [] v, uint i) -> T [] fun, uint lo, uint di);
11
11
const vec_modifier[] vec_modifiers = ~[rec(fun=vec_omit, 0u, 1u), ...];
12
12
But that gives me "error: internal compiler error unimplemented consts that's not a plain literal".
13
13
https://github.com/graydon/rust/issues/570
@@ -26,23 +26,23 @@ import std::ivec::slice;
26
26
import std:: ivec:: len;
27
27
import std:: int;
28
28
29
- //fn vec_reverse(&int [] v) -> int [] { ... }
29
+ //fn vec_reverse(&T [] v) -> T [] { ... }
30
30
31
- fn vec_omit ( & int [ ] v, uint i) -> int [ ] { slice( v, 0 u, i) + slice ( v , i +1 u , len ( v ) ) }
32
- fn vec_dup ( & int [ ] v, uint i) -> int [ ] { slice( v, 0 u, i) + ~[ v . ( i ) ] + slice ( v , i , len ( v ) ) }
33
- fn vec_swadj ( & int [ ] v, uint i) -> int [ ] { slice( v, 0 u, i) + ~[ v . ( i +1 u ) , v. ( i ) ] + slice ( v , i +2 u , len ( v ) ) }
34
- fn vec_prefix ( & int [ ] v, uint i) -> int [ ] { slice( v, 0 u, i) }
35
- fn vec_suffix ( & int [ ] v, uint i) -> int [ ] { slice( v, i, len( v) ) }
31
+ fn vec_omit [ T ] ( & T [ ] v, uint i) -> T [ ] { slice ( v, 0 u, i) + slice ( v, i+1 u, len ( v) ) }
32
+ fn vec_dup [ T ] ( & T [ ] v, uint i) -> T [ ] { slice ( v, 0 u, i) + ~[ v. ( i) ] + slice ( v, i, len ( v) ) }
33
+ fn vec_swadj [ T ] ( & T [ ] v, uint i) -> T [ ] { slice ( v, 0 u, i) + ~[ v. ( i +1 u) , v. ( i) ] + slice ( v, i+2 u, len ( v) ) }
34
+ fn vec_prefix [ T ] ( & T [ ] v, uint i) -> T [ ] { slice ( v, 0 u, i) }
35
+ fn vec_suffix [ T ] ( & T [ ] v, uint i) -> T [ ] { slice ( v, i, len ( v) ) }
36
36
37
- fn vec_poke ( & int [ ] v, uint i, int x) -> int [ ] { slice( v, 0 u, i) + ~[ x ] + slice ( v , i +1 u , len ( v ) ) }
38
- fn vec_insert ( & int [ ] v, uint i, int x) -> int [ ] { slice( v, 0 u, i) + ~[ x ] + slice ( v , i , len ( v ) ) }
37
+ fn vec_poke [ T ] ( & T [ ] v, uint i, & T x) -> T [ ] { slice ( v, 0 u, i) + ~[ x] + slice ( v, i+1 u, len ( v) ) }
38
+ fn vec_insert [ T ] ( & T [ ] v, uint i, & T x) -> T [ ] { slice ( v, 0 u, i) + ~[ x] + slice ( v, i, len ( v) ) }
39
39
40
40
// Iterates over 0...length, skipping the specified number on each side.
41
41
iter ix ( uint skip_low, uint skip_high, uint length) -> uint { let uint i = skip_low; while ( i + skip_high <= length) { put i; i += 1 u; } }
42
42
43
43
// Returns a bunch of modified versions of v, some of which introduce new elements (borrowed from xs).
44
- fn vec_edits ( & int [ ] v, & int [ ] xs ) -> int [ ] [ ] {
45
- let int [ ] [ ] edits = ~[ ] ;
44
+ fn vec_edits[ T ] ( & T [ ] v, & T [ ] xs) -> T [ ] [ ] {
45
+ let T [ ] [ ] edits = ~[ ] ;
46
46
let uint Lv = len ( v) ;
47
47
48
48
if ( Lv != 1 u) { edits += ~[ ~[ ] ] ; } // When Lv == 1u, this is redundant with omit
@@ -55,8 +55,8 @@ fn vec_edits(&int[] v, &int[] xs) -> int[][] {
55
55
for each ( uint i in ix( 2 u, 1 u, Lv ) ) { edits += ~[ vec_suffix ( v, i) ] ; }
56
56
57
57
for each ( uint j in ix( 0 u, 1 u, len( xs) ) ) {
58
- for each ( uint i in ix( 0 u, 1 u, Lv ) ) { edits += ~[ vec_poke ( v, i, xs. ( j) ) ] ; }
59
- for each ( uint i in ix( 0 u, 0 u, Lv ) ) { edits += ~[ vec_insert ( v, i, xs. ( j) ) ] ; }
58
+ for each ( uint i in ix( 0 u, 1 u, Lv ) ) { edits += ~[ vec_poke ( v, i, xs. ( j) ) ] ; }
59
+ for each ( uint i in ix( 0 u, 0 u, Lv ) ) { edits += ~[ vec_insert ( v, i, xs. ( j) ) ] ; }
60
60
}
61
61
62
62
edits
0 commit comments