@@ -267,6 +267,16 @@ fn sparse_intersect<T: Idx>(
267
267
set. elems . len ( ) != size
268
268
}
269
269
270
+ fn dense_sparse_intersect < T : Idx > (
271
+ dense : & BitSet < T > ,
272
+ sparse : & SparseBitSet < T > ,
273
+ ) -> ( SparseBitSet < T > , bool ) {
274
+ let n = dense. count ( ) ;
275
+ let mut sparse_copy = sparse. clone ( ) ;
276
+ sparse_intersect ( & mut sparse_copy, |el| !dense. contains ( * el) ) ;
277
+ ( sparse_copy, dense. count ( ) != n)
278
+ }
279
+
270
280
impl < T : Idx > BitRelations < HybridBitSet < T > > for BitSet < T > {
271
281
fn union ( & mut self , other : & HybridBitSet < T > ) -> bool {
272
282
assert_eq ! ( self . domain_size, other. domain_size( ) ) ;
@@ -292,11 +302,9 @@ impl<T: Idx> BitRelations<HybridBitSet<T>> for BitSet<T> {
292
302
assert_eq ! ( self . domain_size, other. domain_size( ) ) ;
293
303
match other {
294
304
HybridBitSet :: Sparse ( sparse) => {
295
- let n = self . count ( ) ;
296
- let mut sparse_copy = sparse. clone ( ) ;
297
- sparse_intersect ( & mut sparse_copy, |el| !self . contains ( * el) ) ;
298
- * self = sparse_copy. to_dense ( ) ;
299
- self . count ( ) != n
305
+ let ( updated, changed) = dense_sparse_intersect ( self , sparse) ;
306
+ * self = updated. to_dense ( ) ;
307
+ changed
300
308
}
301
309
HybridBitSet :: Dense ( dense) => self . intersect ( dense) ,
302
310
}
@@ -364,7 +372,14 @@ impl<T: Idx> BitRelations<HybridBitSet<T>> for HybridBitSet<T> {
364
372
HybridBitSet :: Sparse ( self_sparse) => {
365
373
sparse_intersect ( self_sparse, |elem| other. contains ( * elem) )
366
374
}
367
- HybridBitSet :: Dense ( self_dense) => self_dense. intersect ( other) ,
375
+ HybridBitSet :: Dense ( self_dense) => match other {
376
+ HybridBitSet :: Sparse ( other_sparse) => {
377
+ let ( updated, changed) = dense_sparse_intersect ( self_dense, other_sparse) ;
378
+ * self = HybridBitSet :: Sparse ( updated) ;
379
+ changed
380
+ }
381
+ HybridBitSet :: Dense ( other_dense) => self_dense. intersect ( other_dense) ,
382
+ } ,
368
383
}
369
384
}
370
385
}
0 commit comments