Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 415d5e8

Browse files
committed
Remove BitRelations impls for SparseBitSet, add optimizations
1 parent 6cf3786 commit 415d5e8

File tree

1 file changed

+29
-63
lines changed

1 file changed

+29
-63
lines changed

compiler/rustc_index/src/bit_set.rs

Lines changed: 29 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -262,86 +262,50 @@ fn sparse_intersect<T: Idx>(
262262
set: &mut SparseBitSet<T>,
263263
other_contains: impl Fn(&T) -> bool,
264264
) -> bool {
265-
let mut changed = false;
266-
for i in (0..set.len()).rev() {
267-
if !other_contains(&set.elems[i]) {
268-
set.elems.remove(i);
269-
changed = true;
270-
}
271-
}
272-
changed
273-
}
274-
275-
impl<T: Idx> BitRelations<SparseBitSet<T>> for BitSet<T> {
276-
fn union(&mut self, other: &SparseBitSet<T>) -> bool {
277-
sequential_update(|elem| self.insert(elem), other.iter().cloned())
278-
}
279-
280-
fn subtract(&mut self, other: &SparseBitSet<T>) -> bool {
281-
sequential_update(|elem| self.remove(elem), other.iter().cloned())
282-
}
283-
284-
fn intersect(&mut self, other: &SparseBitSet<T>) -> bool {
285-
self.intersect(&other.to_dense())
286-
}
265+
let size = set.elems.len();
266+
set.elems.retain(|elem| other_contains(elem));
267+
set.elems.len() != size
287268
}
288269

289-
impl<T: Idx> BitRelations<BitSet<T>> for SparseBitSet<T> {
290-
fn union(&mut self, other: &BitSet<T>) -> bool {
291-
sequential_update(|elem| self.insert(elem), other.iter())
292-
}
293-
294-
fn subtract(&mut self, other: &BitSet<T>) -> bool {
295-
sequential_update(|elem| self.remove(elem), other.iter())
296-
}
297-
298-
fn intersect(&mut self, other: &BitSet<T>) -> bool {
299-
sparse_intersect(self, |el| other.contains(*el))
300-
}
301-
}
302-
303-
impl<T: Idx> BitRelations<SparseBitSet<T>> for SparseBitSet<T> {
304-
fn union(&mut self, other: &SparseBitSet<T>) -> bool {
305-
sequential_update(|elem| self.insert(elem), other.iter().cloned())
306-
}
307-
308-
fn subtract(&mut self, other: &SparseBitSet<T>) -> bool {
309-
sequential_update(|elem| self.insert(elem), other.iter().cloned())
310-
}
311-
312-
fn intersect(&mut self, other: &SparseBitSet<T>) -> bool {
313-
sparse_intersect(self, |el| other.contains(*el))
314-
}
315-
}
316-
317-
impl<T: Idx, S> BitRelations<HybridBitSet<T>> for S
318-
where
319-
S: BitRelations<BitSet<T>> + BitRelations<SparseBitSet<T>>,
320-
{
270+
impl<T: Idx> BitRelations<HybridBitSet<T>> for BitSet<T> {
321271
fn union(&mut self, other: &HybridBitSet<T>) -> bool {
272+
assert_eq!(self.domain_size, other.domain_size());
322273
match other {
323-
HybridBitSet::Sparse(sparse) => self.union(sparse),
274+
HybridBitSet::Sparse(sparse) => {
275+
sequential_update(|elem| self.insert(elem), sparse.iter().cloned())
276+
}
324277
HybridBitSet::Dense(dense) => self.union(dense),
325278
}
326279
}
327280

328281
fn subtract(&mut self, other: &HybridBitSet<T>) -> bool {
282+
assert_eq!(self.domain_size, other.domain_size());
329283
match other {
330-
HybridBitSet::Sparse(sparse) => self.subtract(sparse),
284+
HybridBitSet::Sparse(sparse) => {
285+
sequential_update(|elem| self.remove(elem), sparse.iter().cloned())
286+
}
331287
HybridBitSet::Dense(dense) => self.subtract(dense),
332288
}
333289
}
334290

335291
fn intersect(&mut self, other: &HybridBitSet<T>) -> bool {
292+
assert_eq!(self.domain_size, other.domain_size());
336293
match other {
337-
HybridBitSet::Sparse(sparse) => self.intersect(sparse),
294+
HybridBitSet::Sparse(sparse) => {
295+
let n = self.count();
296+
let mut sparse_copy = sparse.clone();
297+
sparse_intersect(&mut sparse_copy, |el| !self.contains(*el));
298+
*self = sparse_copy.to_dense();
299+
self.count() != n
300+
}
338301
HybridBitSet::Dense(dense) => self.intersect(dense),
339302
}
340303
}
341304
}
342305

343306
impl<T: Idx> BitRelations<HybridBitSet<T>> for HybridBitSet<T> {
344307
fn union(&mut self, other: &HybridBitSet<T>) -> bool {
308+
assert_eq!(self.domain_size(), other.domain_size());
345309
match self {
346310
HybridBitSet::Sparse(self_sparse) => {
347311
match other {
@@ -385,20 +349,22 @@ impl<T: Idx> BitRelations<HybridBitSet<T>> for HybridBitSet<T> {
385349
}
386350

387351
fn subtract(&mut self, other: &HybridBitSet<T>) -> bool {
388-
// FIXME(willcrichton): should there be an optimized sparse / dense version?
352+
assert_eq!(self.domain_size(), other.domain_size());
389353
match self {
390-
HybridBitSet::Sparse(self_sparse) => self_sparse.subtract(other),
354+
HybridBitSet::Sparse(self_sparse) => {
355+
sequential_update(|elem| self_sparse.remove(elem), other.iter())
356+
}
391357
HybridBitSet::Dense(self_dense) => self_dense.subtract(other),
392358
}
393359
}
394360

395361
fn intersect(&mut self, other: &HybridBitSet<T>) -> bool {
396-
// FIXME(willcrichton): should there be an optimized sparse / dense version?
362+
assert_eq!(self.domain_size(), other.domain_size());
397363
match self {
398-
HybridBitSet::Sparse(self_sparse) => self_sparse.intersect(other),
399-
HybridBitSet::Dense(self_dense) => {
400-
<BitSet<T> as BitRelations<HybridBitSet<T>>>::intersect(self_dense, other)
364+
HybridBitSet::Sparse(self_sparse) => {
365+
sparse_intersect(self_sparse, |elem| other.contains(*elem))
401366
}
367+
HybridBitSet::Dense(self_dense) => self_dense.intersect(other),
402368
}
403369
}
404370
}

0 commit comments

Comments
 (0)