@@ -803,29 +803,31 @@ impl<T: Idx> BitRelations<ChunkedBitSet<T>> for ChunkedBitSet<T> {
803803 // words, and this happens often enough that it's a
804804 // performance win. Also, we only need to operate on the
805805 // in-use words, hence the slicing.
806- let op = |a, b| a | b;
807806 let num_words = num_words ( chunk_domain_size as usize ) ;
808- if bitwise_changes (
807+ let op = |a, b| a | b;
808+ if !bitwise_changes (
809809 & self_chunk_words[ 0 ..num_words] ,
810810 & other_chunk_words[ 0 ..num_words] ,
811811 op,
812812 ) {
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 = self_chunk_words[ 0 ..num_words]
821- . iter ( )
822- . map ( |w| w. count_ones ( ) as ChunkSize )
823- . sum ( ) ;
824- if * self_chunk_count == chunk_domain_size {
825- * self_chunk = Ones ;
826- }
827- changed = true ;
813+ continue ;
828814 }
815+
816+ let self_chunk_words = Rc :: make_mut ( self_chunk_words) ;
817+ let has_changed = bitwise (
818+ & mut self_chunk_words[ 0 ..num_words] ,
819+ & other_chunk_words[ 0 ..num_words] ,
820+ op,
821+ ) ;
822+ debug_assert ! ( has_changed) ;
823+ * self_chunk_count = self_chunk_words[ 0 ..num_words]
824+ . iter ( )
825+ . map ( |w| w. count_ones ( ) as ChunkSize )
826+ . sum ( ) ;
827+ if * self_chunk_count == chunk_domain_size {
828+ * self_chunk = Ones ;
829+ }
830+ changed = true ;
829831 }
830832 }
831833 }
@@ -882,30 +884,32 @@ impl<T: Idx> BitRelations<ChunkedBitSet<T>> for ChunkedBitSet<T> {
882884 Mixed ( self_chunk_count, self_chunk_words) ,
883885 Mixed ( _other_chunk_count, other_chunk_words) ,
884886 ) => {
885- // See [`<Self as BitRelations<ChunkedBitSet<T>>>::union`] for the explanation
886- let op = |a : u64 , b : u64 | a & !b;
887+ // See `ChunkedBitSet::union` for details on what is happening here.
887888 let num_words = num_words ( chunk_domain_size as usize ) ;
888- if bitwise_changes (
889+ let op = |a : u64 , b : u64 | a & !b;
890+ if !bitwise_changes (
889891 & self_chunk_words[ 0 ..num_words] ,
890892 & other_chunk_words[ 0 ..num_words] ,
891893 op,
892894 ) {
893- let self_chunk_words = Rc :: make_mut ( self_chunk_words) ;
894- let has_changed = bitwise (
895- & mut self_chunk_words[ 0 ..num_words] ,
896- & other_chunk_words[ 0 ..num_words] ,
897- op,
898- ) ;
899- debug_assert ! ( has_changed) ;
900- * self_chunk_count = self_chunk_words[ 0 ..num_words]
901- . iter ( )
902- . map ( |w| w. count_ones ( ) as ChunkSize )
903- . sum ( ) ;
904- if * self_chunk_count == 0 {
905- * self_chunk = Zeros ;
906- }
907- changed = true ;
895+ continue ;
908896 }
897+
898+ let self_chunk_words = Rc :: make_mut ( self_chunk_words) ;
899+ let has_changed = bitwise (
900+ & mut self_chunk_words[ 0 ..num_words] ,
901+ & other_chunk_words[ 0 ..num_words] ,
902+ op,
903+ ) ;
904+ debug_assert ! ( has_changed) ;
905+ * self_chunk_count = self_chunk_words[ 0 ..num_words]
906+ . iter ( )
907+ . map ( |w| w. count_ones ( ) as ChunkSize )
908+ . sum ( ) ;
909+ if * self_chunk_count == 0 {
910+ * self_chunk = Zeros ;
911+ }
912+ changed = true ;
909913 }
910914 }
911915 }
@@ -941,30 +945,32 @@ impl<T: Idx> BitRelations<ChunkedBitSet<T>> for ChunkedBitSet<T> {
941945 Mixed ( self_chunk_count, self_chunk_words) ,
942946 Mixed ( _other_chunk_count, other_chunk_words) ,
943947 ) => {
944- // See [`<Self as BitRelations<ChunkedBitSet<T>>>::union`] for the explanation
945- let op = |a, b| a & b;
948+ // See `ChunkedBitSet::union` for details on what is happening here.
946949 let num_words = num_words ( chunk_domain_size as usize ) ;
947- if bitwise_changes (
950+ let op = |a, b| a & b;
951+ if !bitwise_changes (
948952 & self_chunk_words[ 0 ..num_words] ,
949953 & other_chunk_words[ 0 ..num_words] ,
950954 op,
951955 ) {
952- let self_chunk_words = Rc :: make_mut ( self_chunk_words) ;
953- let has_changed = bitwise (
954- & mut self_chunk_words[ 0 ..num_words] ,
955- & other_chunk_words[ 0 ..num_words] ,
956- op,
957- ) ;
958- debug_assert ! ( has_changed) ;
959- * self_chunk_count = self_chunk_words[ 0 ..num_words]
960- . iter ( )
961- . map ( |w| w. count_ones ( ) as ChunkSize )
962- . sum ( ) ;
963- if * self_chunk_count == 0 {
964- * self_chunk = Zeros ;
965- }
966- changed = true ;
956+ continue ;
957+ }
958+
959+ let self_chunk_words = Rc :: make_mut ( self_chunk_words) ;
960+ let has_changed = bitwise (
961+ & mut self_chunk_words[ 0 ..num_words] ,
962+ & other_chunk_words[ 0 ..num_words] ,
963+ op,
964+ ) ;
965+ debug_assert ! ( has_changed) ;
966+ * self_chunk_count = self_chunk_words[ 0 ..num_words]
967+ . iter ( )
968+ . map ( |w| w. count_ones ( ) as ChunkSize )
969+ . sum ( ) ;
970+ if * self_chunk_count == 0 {
971+ * self_chunk = Zeros ;
967972 }
973+ changed = true ;
968974 }
969975 }
970976 }
0 commit comments