@@ -160,7 +160,7 @@ impl<T: Idx> DenseBitSet<T> {
160160
161161 /// Count the number of set bits in the set.
162162 pub fn count ( & self ) -> usize {
163- self . words . iter ( ) . map ( |e| e . count_ones ( ) as usize ) . sum ( )
163+ count_ones ( & self . words )
164164 }
165165
166166 /// Returns `true` if `self` contains `elem`.
@@ -817,10 +817,8 @@ impl<T: Idx> BitRelations<ChunkedBitSet<T>> for ChunkedBitSet<T> {
817817 op,
818818 ) ;
819819 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 ( ) ;
820+ * self_chunk_count =
821+ count_ones ( & self_chunk_words[ 0 ..num_words] ) as ChunkSize ;
824822 if * self_chunk_count == chunk_domain_size {
825823 * self_chunk = Ones ;
826824 }
@@ -871,10 +869,7 @@ impl<T: Idx> BitRelations<ChunkedBitSet<T>> for ChunkedBitSet<T> {
871869 let self_chunk_count = chunk_domain_size - * other_chunk_count;
872870 debug_assert_eq ! (
873871 self_chunk_count,
874- self_chunk_words[ 0 ..num_words]
875- . iter( )
876- . map( |w| w. count_ones( ) as ChunkSize )
877- . sum( )
872+ count_ones( & self_chunk_words[ 0 ..num_words] ) as ChunkSize
878873 ) ;
879874 * self_chunk = Mixed ( self_chunk_count, Rc :: new ( self_chunk_words) ) ;
880875 }
@@ -897,10 +892,8 @@ impl<T: Idx> BitRelations<ChunkedBitSet<T>> for ChunkedBitSet<T> {
897892 op,
898893 ) ;
899894 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 ( ) ;
895+ * self_chunk_count =
896+ count_ones ( & self_chunk_words[ 0 ..num_words] ) as ChunkSize ;
904897 if * self_chunk_count == 0 {
905898 * self_chunk = Zeros ;
906899 }
@@ -956,10 +949,8 @@ impl<T: Idx> BitRelations<ChunkedBitSet<T>> for ChunkedBitSet<T> {
956949 op,
957950 ) ;
958951 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 ( ) ;
952+ * self_chunk_count =
953+ count_ones ( & self_chunk_words[ 0 ..num_words] ) as ChunkSize ;
963954 if * self_chunk_count == 0 {
964955 * self_chunk = Zeros ;
965956 }
@@ -1046,21 +1037,12 @@ impl Chunk {
10461037 assert ! ( 0 < count && count < chunk_domain_size) ;
10471038
10481039 // Check the number of set bits matches `count`.
1049- assert_eq ! (
1050- words. iter( ) . map( |w| w. count_ones( ) as ChunkSize ) . sum:: <ChunkSize >( ) ,
1051- count
1052- ) ;
1040+ assert_eq ! ( count_ones( words. as_slice( ) ) as ChunkSize , count) ;
10531041
10541042 // Check the not-in-use words are all zeroed.
10551043 let num_words = num_words ( chunk_domain_size as usize ) ;
10561044 if num_words < CHUNK_WORDS {
1057- assert_eq ! (
1058- words[ num_words..]
1059- . iter( )
1060- . map( |w| w. count_ones( ) as ChunkSize )
1061- . sum:: <ChunkSize >( ) ,
1062- 0
1063- ) ;
1045+ assert_eq ! ( count_ones( & words[ num_words..] ) as ChunkSize , 0 ) ;
10641046 }
10651047 }
10661048 }
@@ -1542,7 +1524,7 @@ impl<R: Idx, C: Idx> BitMatrix<R, C> {
15421524 /// Returns the number of elements in `row`.
15431525 pub fn count ( & self , row : R ) -> usize {
15441526 let ( start, end) = self . range ( row) ;
1545- self . words [ start..end] . iter ( ) . map ( |e| e . count_ones ( ) as usize ) . sum ( )
1527+ count_ones ( & self . words [ start..end] )
15461528 }
15471529}
15481530
@@ -1753,6 +1735,11 @@ fn max_bit(word: Word) -> usize {
17531735 WORD_BITS - 1 - word. leading_zeros ( ) as usize
17541736}
17551737
1738+ #[ inline]
1739+ fn count_ones ( words : & [ Word ] ) -> usize {
1740+ words. iter ( ) . map ( |word| word. count_ones ( ) as usize ) . sum ( )
1741+ }
1742+
17561743/// Integral type used to represent the bit set.
17571744pub trait FiniteBitSetTy :
17581745 BitAnd < Output = Self >
0 commit comments