Skip to content

Commit 4a8668f

Browse files
committed
---
yaml --- r: 21244 b: refs/heads/snap-stage3 c: f533276 h: refs/heads/master v: v3
1 parent 082459a commit 4a8668f

File tree

6 files changed

+91
-140
lines changed

6 files changed

+91
-140
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: e430a699f2c60890d9b86069fd0c68a70ece7120
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: 69d66a702ef5162d804c148f0c3f4038f67020cd
4+
refs/heads/snap-stage3: f5332769d58c5e8d9fee36a7e1f8faa4f5c1b861
55
refs/heads/try: ffbe0e0e00374358b789b0037bcb3a577cd218be
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b

branches/snap-stage3/src/libstd/bitv.rs

Lines changed: 46 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -19,42 +19,37 @@ export to_str;
1919
export eq_vec;
2020
export methods;
2121

22-
/// a mask that has a 1 for each defined bit in a small_bitv, assuming n bits
23-
#[inline(always)]
24-
fn small_mask(nbits: uint) -> u32 {
25-
(1 << nbits) - 1
26-
}
27-
2822
struct small_bitv {
29-
/// only the lowest nbits of this value are used. the rest is undefined.
3023
let mut bits: u32;
3124
new(bits: u32) { self.bits = bits; }
3225
priv {
3326
#[inline(always)]
34-
fn bits_op(right_bits: u32, nbits: uint, f: fn(u32, u32) -> u32)
35-
-> bool {
36-
let mask = small_mask(nbits);
27+
fn bits_op(right_bits: u32, f: fn(u32, u32) -> u32) -> bool {
3728
let old_b: u32 = self.bits;
3829
let new_b = f(old_b, right_bits);
3930
self.bits = new_b;
40-
mask & old_b != mask & new_b
31+
old_b != new_b
4132
}
4233
}
4334
#[inline(always)]
44-
fn union(s: &small_bitv, nbits: uint) -> bool {
45-
self.bits_op(s.bits, nbits, |u1, u2| u1 | u2)
35+
fn union(s: &small_bitv) -> bool {
36+
self.bits_op(s.bits, |u1, u2| { u1 | u2 })
4637
}
4738
#[inline(always)]
48-
fn intersect(s: &small_bitv, nbits: uint) -> bool {
49-
self.bits_op(s.bits, nbits, |u1, u2| u1 & u2)
39+
fn intersect(s: &small_bitv) -> bool {
40+
self.bits_op(s.bits, |u1, u2| { u1 & u2 })
5041
}
5142
#[inline(always)]
52-
fn become(s: &small_bitv, nbits: uint) -> bool {
53-
self.bits_op(s.bits, nbits, |_u1, u2| u2)
43+
fn become(s: &small_bitv) -> bool {
44+
let old = self.bits;
45+
self.bits = s.bits;
46+
old != self.bits
5447
}
5548
#[inline(always)]
56-
fn difference(s: &small_bitv, nbits: uint) -> bool {
57-
self.bits_op(s.bits, nbits, |u1, u2| u1 ^ u2)
49+
fn difference(s: &small_bitv) -> bool {
50+
let old = self.bits;
51+
self.bits &= !s.bits;
52+
old != self.bits
5853
}
5954
#[inline(always)]
6055
pure fn get(i: uint) -> bool {
@@ -66,70 +61,42 @@ struct small_bitv {
6661
self.bits |= 1<<i;
6762
}
6863
else {
69-
self.bits &= !(1<<i as u32);
64+
self.bits &= !(i as u32);
7065
}
7166
}
7267
#[inline(always)]
73-
fn equals(b: &small_bitv, nbits: uint) -> bool {
74-
let mask = small_mask(nbits);
75-
mask & self.bits == mask & b.bits
76-
}
68+
fn equals(b: &small_bitv) -> bool { self.bits == b.bits }
7769
#[inline(always)]
7870
fn clear() { self.bits = 0; }
7971
#[inline(always)]
8072
fn set_all() { self.bits = !0; }
8173
#[inline(always)]
82-
fn is_true(nbits: uint) -> bool {
83-
small_mask(nbits) & !self.bits == 0
84-
}
74+
fn is_true() -> bool { self.bits == !0 }
8575
#[inline(always)]
86-
fn is_false(nbits: uint) -> bool {
87-
small_mask(nbits) & self.bits == 0
88-
}
76+
fn is_false() -> bool { self.bits == 0 }
8977
#[inline(always)]
9078
fn invert() { self.bits = !self.bits; }
9179
}
9280

93-
/**
94-
* a mask that has a 1 for each defined bit in the nth element of a big_bitv,
95-
* assuming n bits.
96-
*/
97-
#[inline(always)]
98-
fn big_mask(nbits: uint, elem: uint) -> uint {
99-
let rmd = nbits % uint_bits;
100-
let nelems = nbits/uint_bits + if rmd == 0 {0} else {1};
101-
102-
if elem < nelems - 1 || rmd == 0 {
103-
!0
104-
} else {
105-
(1 << rmd) - 1
106-
}
107-
}
108-
10981
struct big_bitv {
110-
// only mut b/c of clone and lack of other constructor
82+
// only mut b/c of clone and lack of other constructor
11183
let mut storage: ~[mut uint];
11284
new(-storage: ~[mut uint]) {
11385
self.storage <- storage;
11486
}
11587
priv {
11688
#[inline(always)]
117-
fn process(b: &big_bitv, nbits: uint, op: fn(uint, uint) -> uint)
118-
-> bool {
89+
fn process(b: &big_bitv, op: fn(uint, uint) -> uint) -> bool {
11990
let len = b.storage.len();
12091
assert (self.storage.len() == len);
12192
let mut changed = false;
12293
do uint::range(0, len) |i| {
123-
let mask = big_mask(nbits, i);
124-
let w0 = self.storage[i] & mask;
125-
let w1 = b.storage[i] & mask;
126-
let w = op(w0, w1) & mask;
127-
if w0 != w unchecked {
128-
changed = true;
129-
self.storage[i] = w;
130-
}
94+
let w0 = self.storage[i];
95+
let w1 = b.storage[i];
96+
let w = op(w0, w1);
97+
if w0 != w unchecked { changed = true; self.storage[i] = w; };
13198
true
132-
}
99+
};
133100
changed
134101
}
135102
}
@@ -145,21 +112,15 @@ struct big_bitv {
145112
#[inline(always)]
146113
fn invert() { for self.each_storage() |w| { w = !w } }
147114
#[inline(always)]
148-
fn union(b: &big_bitv, nbits: uint) -> bool {
149-
self.process(b, nbits, lor)
150-
}
115+
fn union(b: &big_bitv) -> bool { self.process(b, lor) }
151116
#[inline(always)]
152-
fn intersect(b: &big_bitv, nbits: uint) -> bool {
153-
self.process(b, nbits, land)
154-
}
117+
fn intersect(b: &big_bitv) -> bool { self.process(b, land) }
155118
#[inline(always)]
156-
fn become(b: &big_bitv, nbits: uint) -> bool {
157-
self.process(b, nbits, right)
158-
}
119+
fn become(b: &big_bitv) -> bool { self.process(b, right) }
159120
#[inline(always)]
160-
fn difference(b: &big_bitv, nbits: uint) -> bool {
121+
fn difference(b: &big_bitv) -> bool {
161122
self.invert();
162-
let b = self.intersect(b, nbits);
123+
let b = self.intersect(b);
163124
self.invert();
164125
b
165126
}
@@ -179,13 +140,10 @@ struct big_bitv {
179140
else { self.storage[w] & !flag };
180141
}
181142
#[inline(always)]
182-
fn equals(b: &big_bitv, nbits: uint) -> bool {
143+
fn equals(b: &big_bitv) -> bool {
183144
let len = b.storage.len();
184145
for uint::iterate(0, len) |i| {
185-
let mask = big_mask(nbits, i);
186-
if mask & self.storage[i] != mask & b.storage[i] {
187-
return false;
188-
}
146+
if self.storage[i] != b.storage[i] { return false; }
189147
}
190148
}
191149
}
@@ -205,10 +163,8 @@ struct bitv {
205163
self.rep = small(~small_bitv(if init {!0} else {0}));
206164
}
207165
else {
208-
let nelems = nbits/uint_bits +
209-
if nbits % uint_bits == 0 {0} else {1};
210-
let elem = if init {!0} else {0};
211-
let s = to_mut(from_elem(nelems, elem));
166+
let s = to_mut(from_elem(nbits / uint_bits + 1,
167+
if init {!0} else {0}));
212168
self.rep = big(~big_bitv(s));
213169
};
214170
}
@@ -226,20 +182,20 @@ struct bitv {
226182
match self.rep {
227183
small(s) => match other.rep {
228184
small(s1) => match op {
229-
union => s.union(s1, self.nbits),
230-
intersect => s.intersect(s1, self.nbits),
231-
assign => s.become(s1, self.nbits),
232-
difference => s.difference(s1, self.nbits)
185+
union => s.union(s1),
186+
intersect => s.intersect(s1),
187+
assign => s.become(s1),
188+
difference => s.difference(s1)
233189
},
234190
big(s1) => self.die()
235191
},
236192
big(s) => match other.rep {
237193
small(_) => self.die(),
238194
big(s1) => match op {
239-
union => s.union(s1, self.nbits),
240-
intersect => s.intersect(s1, self.nbits),
241-
assign => s.become(s1, self.nbits),
242-
difference => s.difference(s1, self.nbits)
195+
union => s.union(s1),
196+
intersect => s.intersect(s1),
197+
assign => s.become(s1),
198+
difference => s.difference(s1)
243199
}
244200
}
245201
}
@@ -324,11 +280,11 @@ struct bitv {
324280
if self.nbits != v1.nbits { return false; }
325281
match self.rep {
326282
small(b) => match v1.rep {
327-
small(b1) => b.equals(b1, self.nbits),
283+
small(b1) => b.equals(b1),
328284
_ => false
329285
},
330286
big(s) => match v1.rep {
331-
big(s1) => s.equals(s1, self.nbits),
287+
big(s1) => s.equals(s1),
332288
small(_) => return false
333289
}
334290
}
@@ -374,7 +330,7 @@ struct bitv {
374330
#[inline(always)]
375331
fn is_true() -> bool {
376332
match self.rep {
377-
small(b) => b.is_true(self.nbits),
333+
small(b) => b.is_true(),
378334
_ => {
379335
for self.each() |i| { if !i { return false; } }
380336
true
@@ -395,7 +351,7 @@ struct bitv {
395351
396352
fn is_false() -> bool {
397353
match self.rep {
398-
small(b) => b.is_false(self.nbits),
354+
small(b) => b.is_false(),
399355
big(_) => {
400356
for self.each() |i| { if i { return false; } }
401357
true
@@ -500,14 +456,6 @@ mod tests {
500456
assert act.eq_vec(~[1u]);
501457
}
502458

503-
#[test]
504-
fn test_2_elements() {
505-
let b = bitv::bitv(2, false);
506-
b.set(0, true);
507-
b.set(1, false);
508-
assert b.to_str() == ~"10";
509-
}
510-
511459
#[test]
512460
fn test_10_elements() {
513461
let mut act;
@@ -784,33 +732,6 @@ mod tests {
784732
let v1 = bitv(110u, false);
785733
assert !v0.equal(v1);
786734
}
787-
788-
#[test]
789-
fn test_equal_sneaky_small() {
790-
let a = bitv::bitv(1, false);
791-
a.set(0, true);
792-
793-
let b = bitv::bitv(1, true);
794-
b.set(0, true);
795-
796-
assert a.equal(b);
797-
}
798-
799-
#[test]
800-
fn test_equal_sneaky_big() {
801-
let a = bitv::bitv(100, false);
802-
for uint::range(0, 100) |i| {
803-
a.set(i, true);
804-
}
805-
806-
let b = bitv::bitv(100, true);
807-
for uint::range(0, 100) |i| {
808-
b.set(i, true);
809-
}
810-
811-
assert a.equal(b);
812-
}
813-
814735
}
815736

816737
//

0 commit comments

Comments
 (0)