@@ -124,32 +124,32 @@ impl FromIterator<bool> for BitVector {
124
124
}
125
125
}
126
126
127
- /// A "bit matrix" is basically a square matrix of booleans
128
- /// represented as one gigantic bitvector. In other words, it is as if
129
- /// you have N bitvectors, each of length N. Note that `elements` here is `N`/
127
+ /// A "bit matrix" is basically a matrix of booleans represented as
128
+ /// one gigantic bitvector. In other words, it is as if you have
129
+ /// `rows` bitvectors, each of length `columns`.
130
130
#[ derive( Clone ) ]
131
131
pub struct BitMatrix {
132
- elements : usize ,
132
+ columns : usize ,
133
133
vector : Vec < u64 > ,
134
134
}
135
135
136
136
impl BitMatrix {
137
- // Create a new `elements x elements ` matrix, initially empty.
138
- pub fn new ( elements : usize ) -> BitMatrix {
137
+ // Create a new `rows x columns ` matrix, initially empty.
138
+ pub fn new ( rows : usize , columns : usize ) -> BitMatrix {
139
139
// For every element, we need one bit for every other
140
140
// element. Round up to an even number of u64s.
141
- let u64s_per_elem = u64s ( elements ) ;
141
+ let u64s_per_row = u64s ( columns ) ;
142
142
BitMatrix {
143
- elements : elements ,
144
- vector : vec ! [ 0 ; elements * u64s_per_elem ] ,
143
+ columns : columns ,
144
+ vector : vec ! [ 0 ; rows * u64s_per_row ] ,
145
145
}
146
146
}
147
147
148
- /// The range of bits for a given element .
149
- fn range ( & self , element : usize ) -> ( usize , usize ) {
150
- let u64s_per_elem = u64s ( self . elements ) ;
151
- let start = element * u64s_per_elem ;
152
- ( start, start + u64s_per_elem )
148
+ /// The range of bits for a given row .
149
+ fn range ( & self , row : usize ) -> ( usize , usize ) {
150
+ let u64s_per_row = u64s ( self . columns ) ;
151
+ let start = row * u64s_per_row ;
152
+ ( start, start + u64s_per_row )
153
153
}
154
154
155
155
pub fn add ( & mut self , source : usize , target : usize ) -> bool {
@@ -179,7 +179,7 @@ impl BitMatrix {
179
179
pub fn intersection ( & self , a : usize , b : usize ) -> Vec < usize > {
180
180
let ( a_start, a_end) = self . range ( a) ;
181
181
let ( b_start, b_end) = self . range ( b) ;
182
- let mut result = Vec :: with_capacity ( self . elements ) ;
182
+ let mut result = Vec :: with_capacity ( self . columns ) ;
183
183
for ( base, ( i, j) ) in ( a_start..a_end) . zip ( b_start..b_end) . enumerate ( ) {
184
184
let mut v = self . vector [ i] & self . vector [ j] ;
185
185
for bit in 0 ..64 {
@@ -215,6 +215,15 @@ impl BitMatrix {
215
215
}
216
216
changed
217
217
}
218
+
219
+ pub fn iter < ' a > ( & ' a self , row : usize ) -> BitVectorIter < ' a > {
220
+ let ( start, end) = self . range ( row) ;
221
+ BitVectorIter {
222
+ iter : self . vector [ start..end] . iter ( ) ,
223
+ current : 0 ,
224
+ idx : 0 ,
225
+ }
226
+ }
218
227
}
219
228
220
229
fn u64s ( elements : usize ) -> usize {
@@ -300,7 +309,7 @@ fn grow() {
300
309
301
310
#[ test]
302
311
fn matrix_intersection ( ) {
303
- let mut vec1 = BitMatrix :: new ( 200 ) ;
312
+ let mut vec1 = BitMatrix :: new ( 200 , 200 ) ;
304
313
305
314
// (*) Elements reachable from both 2 and 65.
306
315
@@ -328,3 +337,45 @@ fn matrix_intersection() {
328
337
let intersection = vec1. intersection ( 2 , 65 ) ;
329
338
assert_eq ! ( intersection, & [ 10 , 64 , 160 ] ) ;
330
339
}
340
+
341
+ #[ test]
342
+ fn matrix_iter ( ) {
343
+ let mut matrix = BitMatrix :: new ( 64 , 100 ) ;
344
+ matrix. add ( 3 , 22 ) ;
345
+ matrix. add ( 3 , 75 ) ;
346
+ matrix. add ( 2 , 99 ) ;
347
+ matrix. add ( 4 , 0 ) ;
348
+ matrix. merge ( 3 , 5 ) ;
349
+
350
+ let expected = [ 99 ] ;
351
+ let mut iter = expected. iter ( ) ;
352
+ for i in matrix. iter ( 2 ) {
353
+ let j = * iter. next ( ) . unwrap ( ) ;
354
+ assert_eq ! ( i, j) ;
355
+ }
356
+ assert ! ( iter. next( ) . is_none( ) ) ;
357
+
358
+ let expected = [ 22 , 75 ] ;
359
+ let mut iter = expected. iter ( ) ;
360
+ for i in matrix. iter ( 3 ) {
361
+ let j = * iter. next ( ) . unwrap ( ) ;
362
+ assert_eq ! ( i, j) ;
363
+ }
364
+ assert ! ( iter. next( ) . is_none( ) ) ;
365
+
366
+ let expected = [ 0 ] ;
367
+ let mut iter = expected. iter ( ) ;
368
+ for i in matrix. iter ( 4 ) {
369
+ let j = * iter. next ( ) . unwrap ( ) ;
370
+ assert_eq ! ( i, j) ;
371
+ }
372
+ assert ! ( iter. next( ) . is_none( ) ) ;
373
+
374
+ let expected = [ 22 , 75 ] ;
375
+ let mut iter = expected. iter ( ) ;
376
+ for i in matrix. iter ( 5 ) {
377
+ let j = * iter. next ( ) . unwrap ( ) ;
378
+ assert_eq ! ( i, j) ;
379
+ }
380
+ assert ! ( iter. next( ) . is_none( ) ) ;
381
+ }
0 commit comments