Skip to content

Commit 68fddce

Browse files
committed
---
yaml --- r: 3847 b: refs/heads/master c: f2d847e h: refs/heads/master i: 3845: 59494cc 3843: 997e9dd 3839: 6e467bf v: v3
1 parent 5b2d112 commit 68fddce

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 043096ea0ab0369fd32210bb9c75bdc9d5820cb0
2+
refs/heads/master: f2d847ec7a9a5470ddd6e9cdd5772a746e929bcf

trunk/src/lib/bitv.rs

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,21 @@ export eq_vec;
2424
// an optimizing version of this module that produces a different obj
2525
// for the case where nbits <= 32.
2626

27-
type t = rec(vec[mutable uint] storage, uint nbits);
27+
type t = @rec(uint[mutable] storage, uint nbits);
2828

2929

3030
// FIXME: this should be a constant once they work
3131
fn uint_bits() -> uint { ret 32u + (1u << 32u >> 27u); }
3232

3333
fn create(uint nbits, bool init) -> t {
3434
auto elt = if (init) { !0u } else { 0u };
35-
auto storage = vec::init_elt_mut[uint](elt, nbits / uint_bits() + 1u);
36-
ret rec(storage=storage, nbits=nbits);
35+
auto storage = ivec::init_elt_mut[uint](elt, nbits / uint_bits() + 1u);
36+
ret @rec(storage=storage, nbits=nbits);
3737
}
3838

3939
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);
4242
assert (v0.nbits == v1.nbits);
4343
auto changed = false;
4444
for each (uint i in uint::range(0u, len)) {
@@ -66,10 +66,10 @@ fn right(uint w0, uint w1) -> uint { ret w1; }
6666
fn copy(&t v0, t v1) -> bool { auto sub = right; ret process(sub, v0, v1); }
6767

6868
fn clone(t v) -> t {
69-
auto storage = vec::init_elt_mut[uint](0u, v.nbits / uint_bits() + 1u);
70-
auto len = vec::len(v.storage);
69+
auto storage = ivec::init_elt_mut[uint](0u, v.nbits / uint_bits() + 1u);
70+
auto len = ivec::len(v.storage);
7171
for each (uint i in uint::range(0u, len)) { storage.(i) = v.storage.(i); }
72-
ret rec(storage=storage, nbits=v.nbits);
72+
ret @rec(storage=storage, nbits=v.nbits);
7373
}
7474

7575
fn get(&t v, uint i) -> bool {
@@ -85,7 +85,7 @@ fn equal(&t v0, &t v1) -> bool {
8585
// FIXME: when we can break or return from inside an iterator loop,
8686
// we can eliminate this painful while-loop
8787

88-
auto len = vec::len(v1.storage);
88+
auto len = ivec::len(v1.storage);
8989
auto i = 0u;
9090
while (i < len) {
9191
if (v0.storage.(i) != v1.storage.(i)) { ret false; }
@@ -95,7 +95,7 @@ fn equal(&t v0, &t v1) -> bool {
9595
}
9696

9797
fn clear(&t v) {
98-
for each (uint i in uint::range(0u, vec::len(v.storage))) {
98+
for each (uint i in uint::range(0u, ivec::len(v.storage))) {
9999
v.storage.(i) = 0u;
100100
}
101101
}
@@ -105,7 +105,7 @@ fn set_all(&t v) {
105105
}
106106

107107
fn invert(&t v) {
108-
for each (uint i in uint::range(0u, vec::len(v.storage))) {
108+
for each (uint i in uint::range(0u, ivec::len(v.storage))) {
109109
v.storage.(i) = !v.storage.(i);
110110
}
111111
}
@@ -132,14 +132,14 @@ fn set(&t v, uint i, bool x) {
132132

133133
/* true if all bits are 1 */
134134
fn is_true(&t v) -> bool {
135-
for (uint i in to_vec(v)) { if (i != 1u) { ret false; } }
135+
for (uint i in to_ivec(v)) { if (i != 1u) { ret false; } }
136136
ret true;
137137
}
138138

139139

140140
/* true if all bits are non-1 */
141141
fn is_false(&t v) -> bool {
142-
for (uint i in to_vec(v)) { if (i == 1u) { ret false; } }
142+
for (uint i in to_ivec(v)) { if (i == 1u) { ret false; } }
143143
ret true;
144144
}
145145

@@ -150,6 +150,11 @@ fn to_vec(&t v) -> vec[uint] {
150150
ret vec::init_fn[uint](sub, v.nbits);
151151
}
152152

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+
153158
fn to_str(&t v) -> str {
154159
auto rs = "";
155160
for (uint i in bitv::to_vec(v)) {
@@ -172,6 +177,20 @@ fn eq_vec(&t v0, &vec[uint] v1) -> bool {
172177
}
173178
ret true;
174179
}
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 = 0u;
185+
while (i < len) {
186+
auto w0 = get(v0, i);
187+
auto w1 = v1.(i);
188+
if (!w0 && w1 != 0u || w0 && w1 == 0u) { ret false; }
189+
i = i + 1u;
190+
}
191+
ret true;
192+
}
193+
175194
//
176195
// Local Variables:
177196
// mode: rust

0 commit comments

Comments
 (0)