Skip to content

Commit 8386278

Browse files
committed
Factor out a recurring pattern as count_ones.
1 parent 6e85c4e commit 8386278

File tree

1 file changed

+16
-29
lines changed

1 file changed

+16
-29
lines changed

compiler/rustc_index/src/bit_set.rs

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
17571744
pub trait FiniteBitSetTy:
17581745
BitAnd<Output = Self>

0 commit comments

Comments
 (0)