@@ -24,21 +24,21 @@ export eq_vec;
24
24
// an optimizing version of this module that produces a different obj
25
25
// for the case where nbits <= 32.
26
26
27
- type t = rec ( vec [ mutable uint ] storage , uint nbits ) ;
27
+ type t = @ rec ( uint [ mutable] storage , uint nbits ) ;
28
28
29
29
30
30
// FIXME: this should be a constant once they work
31
31
fn uint_bits ( ) -> uint { ret 32 u + ( 1 u << 32 u >> 27 u) ; }
32
32
33
33
fn create ( uint nbits , bool init) -> t {
34
34
auto elt = if ( init) { !0 u } else { 0 u } ;
35
- auto storage = vec :: init_elt_mut[ uint] ( elt, nbits / uint_bits ( ) + 1 u) ;
36
- ret rec( storage=storage, nbits=nbits) ;
35
+ auto storage = ivec :: init_elt_mut[ uint] ( elt, nbits / uint_bits ( ) + 1 u) ;
36
+ ret @ rec( storage=storage, nbits=nbits) ;
37
37
}
38
38
39
39
fn process ( & fn ( uint , uint ) -> uint op, & t v0 , & t v1 ) -> bool {
40
- auto len = vec :: len ( v1. storage ) ;
41
- assert ( vec :: len ( v0. storage ) == len) ;
40
+ auto len = ivec :: len ( v1. storage ) ;
41
+ assert ( ivec :: len ( v0. storage ) == len) ;
42
42
assert ( v0. nbits == v1. nbits ) ;
43
43
auto changed = false ;
44
44
for each ( uint i in uint:: range( 0 u, len) ) {
@@ -66,10 +66,10 @@ fn right(uint w0, uint w1) -> uint { ret w1; }
66
66
fn copy ( & t v0 , t v1 ) -> bool { auto sub = right; ret process( sub, v0, v1) ; }
67
67
68
68
fn clone ( t v) -> t {
69
- auto storage = vec :: init_elt_mut[ uint] ( 0 u, v. nbits / uint_bits ( ) + 1 u) ;
70
- auto len = vec :: len ( v. storage ) ;
69
+ auto storage = ivec :: init_elt_mut[ uint] ( 0 u, v. nbits / uint_bits ( ) + 1 u) ;
70
+ auto len = ivec :: len ( v. storage ) ;
71
71
for each ( uint i in uint:: range( 0 u, len) ) { storage. ( i) = v. storage . ( i) ; }
72
- ret rec ( storage=storage, nbits=v. nbits ) ;
72
+ ret @ rec( storage=storage, nbits=v. nbits ) ;
73
73
}
74
74
75
75
fn get ( & t v, uint i) -> bool {
@@ -85,7 +85,7 @@ fn equal(&t v0, &t v1) -> bool {
85
85
// FIXME: when we can break or return from inside an iterator loop,
86
86
// we can eliminate this painful while-loop
87
87
88
- auto len = vec :: len ( v1. storage ) ;
88
+ auto len = ivec :: len ( v1. storage ) ;
89
89
auto i = 0 u;
90
90
while ( i < len) {
91
91
if ( v0. storage . ( i ) != v1. storage . ( i) ) { ret false ; }
@@ -95,7 +95,7 @@ fn equal(&t v0, &t v1) -> bool {
95
95
}
96
96
97
97
fn clear ( & t v) {
98
- for each ( uint i in uint:: range( 0 u, vec :: len( v. storage) ) ) {
98
+ for each ( uint i in uint:: range( 0 u, ivec :: len( v. storage) ) ) {
99
99
v. storage . ( i) = 0 u;
100
100
}
101
101
}
@@ -105,7 +105,7 @@ fn set_all(&t v) {
105
105
}
106
106
107
107
fn invert ( & t v) {
108
- for each ( uint i in uint:: range( 0 u, vec :: len( v. storage) ) ) {
108
+ for each ( uint i in uint:: range( 0 u, ivec :: len( v. storage) ) ) {
109
109
v. storage . ( i) = !v. storage . ( i) ;
110
110
}
111
111
}
@@ -132,14 +132,14 @@ fn set(&t v, uint i, bool x) {
132
132
133
133
/* true if all bits are 1 */
134
134
fn is_true ( & t v) -> bool {
135
- for ( uint i in to_vec ( v) ) { if ( i != 1 u) { ret false ; } }
135
+ for ( uint i in to_ivec ( v) ) { if ( i != 1 u) { ret false ; } }
136
136
ret true ;
137
137
}
138
138
139
139
140
140
/* true if all bits are non-1 */
141
141
fn is_false ( & t v) -> bool {
142
- for ( uint i in to_vec ( v) ) { if ( i == 1 u) { ret false ; } }
142
+ for ( uint i in to_ivec ( v) ) { if ( i == 1 u) { ret false ; } }
143
143
ret true ;
144
144
}
145
145
@@ -150,6 +150,11 @@ fn to_vec(&t v) -> vec[uint] {
150
150
ret vec:: init_fn[ uint] ( sub, v. nbits ) ;
151
151
}
152
152
153
+ fn to_ivec ( & t v) -> uint [ ] {
154
+ auto sub = bind init_to_vec ( v, _) ;
155
+ ret ivec:: init_fn[ uint] ( sub, v. nbits ) ;
156
+ }
157
+
153
158
fn to_str ( & t v) -> str {
154
159
auto rs = "" ;
155
160
for ( uint i in bitv:: to_vec( v) ) {
@@ -172,6 +177,20 @@ fn eq_vec(&t v0, &vec[uint] v1) -> bool {
172
177
}
173
178
ret true;
174
179
}
180
+
181
+ fn eq_ivec( & t v0 , & uint[ ] v1) -> bool {
182
+ assert ( v0. nbits == ivec:: len[ uint] ( v1 ) ) ;
183
+ auto len = v0. nbits ;
184
+ auto i = 0 u;
185
+ while ( i < len) {
186
+ auto w0 = get ( v0, i) ;
187
+ auto w1 = v1. ( i) ;
188
+ if ( !w0 && w1 != 0 u || w0 && w1 == 0 u) { ret false ; }
189
+ i = i + 1 u;
190
+ }
191
+ ret true ;
192
+ }
193
+
175
194
//
176
195
// Local Variables:
177
196
// mode: rust
0 commit comments