@@ -800,27 +800,29 @@ 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) ;
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) ;
817820 * self_chunk_count =
818821 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 ;
822+ if * self_chunk_count == chunk_domain_size {
823+ * self_chunk = Ones ;
823824 }
825+ changed = true ;
824826 }
825827 }
826828 }
@@ -874,28 +876,30 @@ impl<T: Idx> BitRelations<ChunkedBitSet<T>> for ChunkedBitSet<T> {
874876 Mixed ( self_chunk_count, self_chunk_words) ,
875877 Mixed ( _other_chunk_count, other_chunk_words) ,
876878 ) => {
877- // See [`<Self as BitRelations<ChunkedBitSet<T>>>::union`] for the explanation
878- let op = |a : u64 , b : u64 | a & !b;
879+ // See `ChunkedBitSet::union` for details on what is happening here.
879880 let num_words = num_words ( chunk_domain_size as usize ) ;
880- if bitwise_changes (
881+ let op = |a : u64 , b : u64 | a & !b;
882+ if !bitwise_changes (
881883 & self_chunk_words[ 0 ..num_words] ,
882884 & other_chunk_words[ 0 ..num_words] ,
883885 op,
884886 ) {
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) ;
887+ continue ;
888+ }
889+
890+ let self_chunk_words = Rc :: make_mut ( self_chunk_words) ;
891+ let has_changed = bitwise (
892+ & mut self_chunk_words[ 0 ..num_words] ,
893+ & other_chunk_words[ 0 ..num_words] ,
894+ op,
895+ ) ;
896+ debug_assert ! ( has_changed) ;
892897 * self_chunk_count =
893898 count_ones ( & self_chunk_words[ 0 ..num_words] ) as ChunkSize ;
894- if * self_chunk_count == 0 {
895- * self_chunk = Zeros ;
896- }
897- changed = true ;
899+ if * self_chunk_count == 0 {
900+ * self_chunk = Zeros ;
898901 }
902+ changed = true ;
899903 }
900904 }
901905 }
@@ -931,28 +935,30 @@ impl<T: Idx> BitRelations<ChunkedBitSet<T>> for ChunkedBitSet<T> {
931935 Mixed ( self_chunk_count, self_chunk_words) ,
932936 Mixed ( _other_chunk_count, other_chunk_words) ,
933937 ) => {
934- // See [`<Self as BitRelations<ChunkedBitSet<T>>>::union`] for the explanation
935- let op = |a, b| a & b;
938+ // See `ChunkedBitSet::union` for details on what is happening here.
936939 let num_words = num_words ( chunk_domain_size as usize ) ;
937- if bitwise_changes (
940+ let op = |a, b| a & b;
941+ if !bitwise_changes (
938942 & self_chunk_words[ 0 ..num_words] ,
939943 & other_chunk_words[ 0 ..num_words] ,
940944 op,
941945 ) {
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) ;
946+ continue ;
947+ }
948+
949+ let self_chunk_words = Rc :: make_mut ( self_chunk_words) ;
950+ let has_changed = bitwise (
951+ & mut self_chunk_words[ 0 ..num_words] ,
952+ & other_chunk_words[ 0 ..num_words] ,
953+ op,
954+ ) ;
955+ debug_assert ! ( has_changed) ;
949956 * self_chunk_count =
950957 count_ones ( & self_chunk_words[ 0 ..num_words] ) as ChunkSize ;
951- if * self_chunk_count == 0 {
952- * self_chunk = Zeros ;
953- }
954- changed = true ;
958+ if * self_chunk_count == 0 {
959+ * self_chunk = Zeros ;
955960 }
961+ changed = true ;
956962 }
957963 }
958964 }
0 commit comments