@@ -19,42 +19,37 @@ export to_str;
19
19
export eq_vec;
20
20
export methods;
21
21
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
-
28
22
struct small_bitv {
29
- /// only the lowest nbits of this value are used. the rest is undefined.
30
23
let mut bits : u32 ;
31
24
new ( bits : u32 ) { self . bits = bits; }
32
25
priv {
33
26
#[ 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 {
37
28
let old_b: u32 = self . bits ;
38
29
let new_b = f ( old_b, right_bits) ;
39
30
self . bits = new_b;
40
- mask & old_b != mask & new_b
31
+ old_b != new_b
41
32
}
42
33
}
43
34
#[ 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 } )
46
37
}
47
38
#[ 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 } )
50
41
}
51
42
#[ 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
54
47
}
55
48
#[ 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
58
53
}
59
54
#[ inline( always) ]
60
55
pure fn get ( i : uint ) -> bool {
@@ -66,70 +61,42 @@ struct small_bitv {
66
61
self . bits |= 1 <<i;
67
62
}
68
63
else {
69
- self . bits &= !( 1 << i as u32 ) ;
64
+ self . bits &= !( i as u32 ) ;
70
65
}
71
66
}
72
67
#[ 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 }
77
69
#[ inline( always) ]
78
70
fn clear ( ) { self . bits = 0 ; }
79
71
#[ inline( always) ]
80
72
fn set_all ( ) { self . bits = !0 ; }
81
73
#[ 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 }
85
75
#[ 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 }
89
77
#[ inline( always) ]
90
78
fn invert ( ) { self . bits = !self . bits ; }
91
79
}
92
80
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
-
109
81
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
111
83
let mut storage : ~[ mut uint ] ;
112
84
new ( -storage: ~[ mut uint] ) {
113
85
self . storage <- storage;
114
86
}
115
87
priv {
116
88
#[ 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 {
119
90
let len = b. storage . len ( ) ;
120
91
assert ( self . storage . len ( ) == len) ;
121
92
let mut changed = false ;
122
93
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; } ;
131
98
true
132
- }
99
+ } ;
133
100
changed
134
101
}
135
102
}
@@ -145,21 +112,15 @@ struct big_bitv {
145
112
#[ inline( always) ]
146
113
fn invert ( ) { for self . each_storage( ) |w| { w = !w } }
147
114
#[ 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) }
151
116
#[ 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) }
155
118
#[ 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) }
159
120
#[ inline( always) ]
160
- fn difference ( b : & big_bitv , nbits : uint ) -> bool {
121
+ fn difference ( b : & big_bitv ) -> bool {
161
122
self . invert ( ) ;
162
- let b = self . intersect ( b, nbits ) ;
123
+ let b = self . intersect ( b) ;
163
124
self . invert ( ) ;
164
125
b
165
126
}
@@ -179,13 +140,10 @@ struct big_bitv {
179
140
else { self . storage [ w] & !flag } ;
180
141
}
181
142
#[ inline( always) ]
182
- fn equals ( b : & big_bitv , nbits : uint ) -> bool {
143
+ fn equals ( b : & big_bitv ) -> bool {
183
144
let len = b. storage . len ( ) ;
184
145
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 ; }
189
147
}
190
148
}
191
149
}
@@ -205,10 +163,8 @@ struct bitv {
205
163
self . rep = small ( ~small_bitv ( if init { !0 } else { 0 } ) ) ;
206
164
}
207
165
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 } ) ) ;
212
168
self . rep = big ( ~big_bitv ( s) ) ;
213
169
} ;
214
170
}
@@ -226,20 +182,20 @@ struct bitv {
226
182
match self . rep {
227
183
small( s) => match other. rep {
228
184
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)
233
189
} ,
234
190
big( s1) => self . die ( )
235
191
} ,
236
192
big( s) => match other. rep {
237
193
small( _) => self . die ( ) ,
238
194
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)
243
199
}
244
200
}
245
201
}
@@ -324,11 +280,11 @@ struct bitv {
324
280
if self . nbits != v1. nbits { return false ; }
325
281
match self . rep {
326
282
small( b) => match v1. rep {
327
- small( b1) => b. equals ( b1, self . nbits ) ,
283
+ small( b1) => b. equals ( b1) ,
328
284
_ => false
329
285
} ,
330
286
big( s) => match v1. rep {
331
- big( s1) => s. equals ( s1, self . nbits ) ,
287
+ big( s1) => s. equals ( s1) ,
332
288
small( _) => return false
333
289
}
334
290
}
@@ -374,7 +330,7 @@ struct bitv {
374
330
#[ inline( always) ]
375
331
fn is_true ( ) -> bool {
376
332
match self . rep {
377
- small( b) => b. is_true ( self . nbits ) ,
333
+ small( b) => b. is_true ( ) ,
378
334
_ => {
379
335
for self . each( ) |i| { if !i { return false ; } }
380
336
true
@@ -395,7 +351,7 @@ struct bitv {
395
351
396
352
fn is_false ( ) -> bool {
397
353
match self . rep {
398
- small( b) => b. is_false ( self . nbits ) ,
354
+ small( b) => b. is_false ( ) ,
399
355
big( _) => {
400
356
for self . each( ) |i| { if i { return false ; } }
401
357
true
@@ -500,14 +456,6 @@ mod tests {
500
456
assert act. eq_vec ( ~[ 1 u] ) ;
501
457
}
502
458
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
-
511
459
#[ test]
512
460
fn test_10_elements ( ) {
513
461
let mut act;
@@ -784,33 +732,6 @@ mod tests {
784
732
let v1 = bitv ( 110 u, false ) ;
785
733
assert !v0. equal ( v1) ;
786
734
}
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
-
814
735
}
815
736
816
737
//
0 commit comments