@@ -800,27 +800,28 @@ impl<T: Idx> BitRelations<ChunkedBitSet<T>> for ChunkedBitSet<T> {
800800 // words, and this happens often enough that it's a
801801 // performance win. Also, we only need to operate on the
802802 // in-use words, hence the slicing.
803- let op = |a, b| a | b;
804803 let num_words = num_words ( chunk_domain_size as usize ) ;
805- if bitwise_changes (
804+ let op = |a, b| a | b;
805+ if !bitwise_changes (
806806 & self_chunk_words[ 0 ..num_words] ,
807807 & other_chunk_words[ 0 ..num_words] ,
808808 op,
809809 ) {
810- let self_chunk_words = Rc :: make_mut ( self_chunk_words ) ;
811- let has_changed = bitwise (
812- & mut self_chunk_words [ 0 ..num_words ] ,
813- & other_chunk_words [ 0 ..num_words ] ,
814- op ,
815- ) ;
816- debug_assert ! ( has_changed ) ;
817- * self_chunk_count =
818- count_ones ( & self_chunk_words [ 0 ..num_words ] ) as ChunkSize ;
819- if * self_chunk_count == chunk_domain_size {
820- * self_chunk = Ones ;
821- }
822- changed = true ;
810+ continue ;
811+ }
812+
813+ let self_chunk_words = Rc :: make_mut ( self_chunk_words ) ;
814+ let has_changed = bitwise (
815+ & mut self_chunk_words [ 0 ..num_words ] ,
816+ & other_chunk_words [ 0 ..num_words ] ,
817+ op ,
818+ ) ;
819+ debug_assert ! ( has_changed ) ;
820+ * self_chunk_count = count_ones ( & self_chunk_words [ 0 ..num_words ] ) as ChunkSize ;
821+ if * self_chunk_count == chunk_domain_size {
822+ * self_chunk = Ones ;
823823 }
824+ changed = true ;
824825 }
825826 }
826827 }
@@ -874,28 +875,29 @@ impl<T: Idx> BitRelations<ChunkedBitSet<T>> for ChunkedBitSet<T> {
874875 Mixed ( self_chunk_count, self_chunk_words) ,
875876 Mixed ( _other_chunk_count, other_chunk_words) ,
876877 ) => {
877- // See [`<Self as BitRelations<ChunkedBitSet<T>>>::union`] for the explanation
878- let op = |a : u64 , b : u64 | a & !b;
878+ // See `ChunkedBitSet::union` for details on what is happening here.
879879 let num_words = num_words ( chunk_domain_size as usize ) ;
880- if bitwise_changes (
880+ let op = |a : u64 , b : u64 | a & !b;
881+ if !bitwise_changes (
881882 & self_chunk_words[ 0 ..num_words] ,
882883 & other_chunk_words[ 0 ..num_words] ,
883884 op,
884885 ) {
885- let self_chunk_words = Rc :: make_mut ( self_chunk_words ) ;
886- let has_changed = bitwise (
887- & mut self_chunk_words [ 0 ..num_words ] ,
888- & other_chunk_words [ 0 ..num_words ] ,
889- op ,
890- ) ;
891- debug_assert ! ( has_changed ) ;
892- * self_chunk_count =
893- count_ones ( & self_chunk_words [ 0 ..num_words ] ) as ChunkSize ;
894- if * self_chunk_count == 0 {
895- * self_chunk = Zeros ;
896- }
897- changed = true ;
886+ continue ;
887+ }
888+
889+ let self_chunk_words = Rc :: make_mut ( self_chunk_words ) ;
890+ let has_changed = bitwise (
891+ & mut self_chunk_words [ 0 ..num_words ] ,
892+ & other_chunk_words [ 0 ..num_words ] ,
893+ op ,
894+ ) ;
895+ debug_assert ! ( has_changed ) ;
896+ * self_chunk_count = count_ones ( & self_chunk_words [ 0 ..num_words ] ) as ChunkSize ;
897+ if * self_chunk_count == 0 {
898+ * self_chunk = Zeros ;
898899 }
900+ changed = true ;
899901 }
900902 }
901903 }
@@ -931,28 +933,29 @@ impl<T: Idx> BitRelations<ChunkedBitSet<T>> for ChunkedBitSet<T> {
931933 Mixed ( self_chunk_count, self_chunk_words) ,
932934 Mixed ( _other_chunk_count, other_chunk_words) ,
933935 ) => {
934- // See [`<Self as BitRelations<ChunkedBitSet<T>>>::union`] for the explanation
935- let op = |a, b| a & b;
936+ // See `ChunkedBitSet::union` for details on what is happening here.
936937 let num_words = num_words ( chunk_domain_size as usize ) ;
937- if bitwise_changes (
938+ let op = |a, b| a & b;
939+ if !bitwise_changes (
938940 & self_chunk_words[ 0 ..num_words] ,
939941 & other_chunk_words[ 0 ..num_words] ,
940942 op,
941943 ) {
942- let self_chunk_words = Rc :: make_mut ( self_chunk_words) ;
943- let has_changed = bitwise (
944- & mut self_chunk_words[ 0 ..num_words] ,
945- & other_chunk_words[ 0 ..num_words] ,
946- op,
947- ) ;
948- debug_assert ! ( has_changed) ;
949- * self_chunk_count =
950- count_ones ( & self_chunk_words[ 0 ..num_words] ) as ChunkSize ;
951- if * self_chunk_count == 0 {
952- * self_chunk = Zeros ;
953- }
954- changed = true ;
944+ continue ;
955945 }
946+
947+ let self_chunk_words = Rc :: make_mut ( self_chunk_words) ;
948+ let has_changed = bitwise (
949+ & mut self_chunk_words[ 0 ..num_words] ,
950+ & other_chunk_words[ 0 ..num_words] ,
951+ op,
952+ ) ;
953+ debug_assert ! ( has_changed) ;
954+ * self_chunk_count = count_ones ( & self_chunk_words[ 0 ..num_words] ) as ChunkSize ;
955+ if * self_chunk_count == 0 {
956+ * self_chunk = Zeros ;
957+ }
958+ changed = true ;
956959 }
957960 }
958961 }
0 commit comments