@@ -267,6 +267,16 @@ fn sparse_intersect<T: Idx>(
267267 set. elems . len ( ) != size
268268}
269269
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+
270280impl < T : Idx > BitRelations < HybridBitSet < T > > for BitSet < T > {
271281 fn union ( & mut self , other : & HybridBitSet < T > ) -> bool {
272282 assert_eq ! ( self . domain_size, other. domain_size( ) ) ;
@@ -292,11 +302,9 @@ impl<T: Idx> BitRelations<HybridBitSet<T>> for BitSet<T> {
292302 assert_eq ! ( self . domain_size, other. domain_size( ) ) ;
293303 match other {
294304 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
300308 }
301309 HybridBitSet :: Dense ( dense) => self . intersect ( dense) ,
302310 }
@@ -364,7 +372,14 @@ impl<T: Idx> BitRelations<HybridBitSet<T>> for HybridBitSet<T> {
364372 HybridBitSet :: Sparse ( self_sparse) => {
365373 sparse_intersect ( self_sparse, |elem| other. contains ( * elem) )
366374 }
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+ } ,
368383 }
369384 }
370385}
0 commit comments