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

Commit 9ca10a4

Browse files
Tage Johanssonlqd
authored andcommitted
Make ThinBitSet tests independent of DenseBitSet.
1 parent 1e8b895 commit 9ca10a4

File tree

1 file changed

+82
-32
lines changed

1 file changed

+82
-32
lines changed

compiler/rustc_index/src/bit_set/thin_bit_set.rs

Lines changed: 82 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ impl<T> ThinBitSet<T> {
353353

354354
debug_assert!(domain_size <= Self::INLINE_CAPACITY);
355355

356-
*self_word |= !other_word & !(Word::MAX >> domain_size);
356+
*self_word |= !other_word & Word::MAX.unbounded_shr((WORD_BITS - domain_size) as u32);
357357
} else if other.is_empty_unallocated() {
358358
self.insert_all(domain_size);
359359
} else {
@@ -1271,7 +1271,7 @@ mod tests {
12711271

12721272
use super::super::CHUNK_BITS;
12731273
use super::*;
1274-
use crate::bit_set::DenseBitSet;
1274+
use crate::IndexVec;
12751275

12761276
/// A very simple pseudo random generator using linear xorshift.
12771277
///
@@ -1446,9 +1446,9 @@ mod tests {
14461446
const TEST_ITERATIONS: u32 = 512;
14471447

14481448
let mut set_1 = ThinBitSet::<usize>::new_empty(domain_size);
1449-
let mut set_1_reference = DenseBitSet::<usize>::new_empty(domain_size);
1449+
let mut set_1_reference = IndexVec::<usize, bool>::from_elem_n(false, domain_size);
14501450
let mut set_2 = ThinBitSet::<usize>::new_empty(domain_size);
1451-
let mut set_2_reference = DenseBitSet::<usize>::new_empty(domain_size);
1451+
let mut set_2_reference = IndexVec::<usize, bool>::from_elem_n(false, domain_size);
14521452

14531453
let hasher = BuildHasherDefault::<DefaultHasher>::new();
14541454

@@ -1467,9 +1467,11 @@ mod tests {
14671467
let elem = rng.next() % domain_size;
14681468
// Choose set to insert into.
14691469
if rng.next_bool() {
1470-
assert_eq!(set_1.insert(elem), set_1_reference.insert(elem));
1470+
assert_eq!(!set_1.contains(elem), set_1.insert(elem));
1471+
set_1_reference[elem] = true;
14711472
} else {
1472-
assert_eq!(set_2.insert(elem), set_2_reference.insert(elem));
1473+
assert_eq!(!set_2.contains(elem), set_2.insert(elem));
1474+
set_2_reference[elem] = true;
14731475
}
14741476
}
14751477
20..40 => {
@@ -1482,20 +1484,28 @@ mod tests {
14821484
// Choose set to insert into.
14831485
if rng.next_bool() {
14841486
set_1.insert_range_inclusive(range.clone());
1485-
set_1_reference.insert_range_inclusive(range);
1487+
for i in range {
1488+
set_1_reference[i] = true;
1489+
}
14861490
} else {
14871491
set_2.insert_range_inclusive(range.clone());
1488-
set_2_reference.insert_range_inclusive(range);
1492+
for i in range {
1493+
set_2_reference[i] = true;
1494+
}
14891495
}
14901496
}
14911497
40..50 => {
14921498
// Test insert_all().
14931499
if rng.next_bool() {
14941500
set_1.insert_all(domain_size);
1495-
set_1_reference.insert_all(domain_size);
1501+
for x in set_1_reference.iter_mut() {
1502+
*x = true;
1503+
}
14961504
} else {
14971505
set_2.insert_all(domain_size);
1498-
set_2_reference.insert_all(domain_size);
1506+
for x in set_2_reference.iter_mut() {
1507+
*x = true;
1508+
}
14991509
}
15001510
}
15011511
50..70 => {
@@ -1506,66 +1516,106 @@ mod tests {
15061516
let elem = rng.next() % domain_size;
15071517
// Choose set to remove into.
15081518
if rng.next_bool() {
1509-
assert_eq!(set_1.remove(elem), set_1_reference.remove(elem));
1519+
assert_eq!(set_1.contains(elem), set_1.remove(elem),);
1520+
set_1_reference[elem] = false;
15101521
} else {
1511-
assert_eq!(set_2.remove(elem), set_2_reference.remove(elem));
1522+
assert_eq!(set_2.contains(elem), set_2.remove(elem),);
1523+
set_2_reference[elem] = false;
15121524
}
15131525
}
15141526
70..76 => {
15151527
// Union
1516-
assert_eq!(set_1.union(&set_2), set_1_reference.union(&set_2_reference));
1528+
let old_set_1 = set_1.clone();
1529+
let changed = set_1.union(&set_2);
1530+
assert_eq!(changed, old_set_1 != set_1);
1531+
1532+
// Adjust the reference sets.
1533+
for (x, val) in set_2_reference.iter_enumerated() {
1534+
set_1_reference[x] |= val;
1535+
}
15171536
}
15181537
76..82 => {
15191538
// Intersection
1520-
assert_eq!(
1521-
set_1.intersect(&set_2),
1522-
set_1_reference.intersect(&set_2_reference)
1523-
);
1539+
let old_set_1 = set_1.clone();
1540+
let changed = set_1.intersect(&set_2);
1541+
assert_eq!(changed, old_set_1 != set_1);
1542+
1543+
// Adjust the reference sets.
1544+
for (x, val) in set_2_reference.iter_enumerated() {
1545+
set_1_reference[x] &= val;
1546+
}
15241547
}
15251548
82..88 => {
15261549
// Subtraction
1527-
assert_eq!(set_1.subtract(&set_2), set_1_reference.subtract(&set_2_reference));
1550+
let old_set_1 = set_1.clone();
1551+
let changed = set_1.subtract(&set_2);
1552+
assert_eq!(changed, old_set_1 != set_1);
1553+
1554+
// Adjust the reference sets.
1555+
for (x, val) in set_2_reference.iter_enumerated() {
1556+
set_1_reference[x] &= !val;
1557+
}
15281558
}
15291559
88..94 => {
15301560
// Union_not
15311561
set_1.union_not(&set_2, domain_size);
1532-
set_1_reference.union_not(&set_2_reference, domain_size);
1562+
1563+
// Adjust the reference sets.
1564+
for (x, val) in set_2_reference.iter_enumerated() {
1565+
set_1_reference[x] |= !val;
1566+
}
15331567
}
15341568
94..97 => {
15351569
// Clear
15361570
if rng.next_bool() {
15371571
set_1.clear();
1538-
set_1_reference.clear();
1572+
for x in set_1_reference.iter_mut() {
1573+
*x = false;
1574+
}
15391575
} else {
15401576
set_2.clear();
1541-
set_2_reference.clear();
1577+
for x in set_2_reference.iter_mut() {
1578+
*x = false;
1579+
}
15421580
}
15431581
}
15441582
97..100 => {
15451583
// Test new_filled().
15461584
if rng.next_bool() {
15471585
set_1 = ThinBitSet::new_filled(domain_size);
1548-
set_1_reference = DenseBitSet::new_filled(domain_size);
1586+
for x in set_1_reference.iter_mut() {
1587+
*x = true;
1588+
}
15491589
} else {
15501590
set_2 = ThinBitSet::new_filled(domain_size);
1551-
set_2_reference = DenseBitSet::new_filled(domain_size);
1591+
for x in set_2_reference.iter_mut() {
1592+
*x = true;
1593+
}
15521594
}
15531595
}
15541596
_ => unreachable!(),
15551597
}
15561598

15571599
// Check the contains function.
15581600
for i in 0..domain_size {
1559-
assert_eq!(set_1.contains(i), set_1_reference.contains(i));
1560-
assert_eq!(set_2.contains(i), set_2_reference.contains(i));
1601+
assert_eq!(set_1.contains(i), set_1_reference[i]);
1602+
assert_eq!(set_2.contains(i), set_2_reference[i]);
15611603
}
15621604

15631605
// Check iter function.
1564-
assert!(set_1.iter().eq(set_1_reference.iter()),);
1565-
assert!(set_2.iter().eq(set_2_reference.iter()));
1606+
assert!(
1607+
set_1
1608+
.iter()
1609+
.eq(set_1_reference.iter_enumerated().filter(|&(_, &v)| v).map(|(x, _)| x))
1610+
);
1611+
assert!(
1612+
set_2
1613+
.iter()
1614+
.eq(set_2_reference.iter_enumerated().filter(|&(_, &v)| v).map(|(x, _)| x))
1615+
);
15661616

15671617
// Check the superset relation.
1568-
assert_eq!(set_1.superset(&set_2), set_1_reference.superset(&set_2_reference));
1618+
assert_eq!(set_1.superset(&set_2), set_2.iter().all(|x| set_1.contains(x)));
15691619

15701620
// Check the `==` operator.
15711621
assert_eq!(set_1 == set_2, set_1_reference == set_2_reference);
@@ -1577,19 +1627,19 @@ mod tests {
15771627
}
15781628

15791629
// Check the count function.
1580-
assert_eq!(set_1.count(), set_1_reference.count());
1581-
assert_eq!(set_2.count(), set_2_reference.count());
1630+
assert_eq!(set_1.count(), set_1_reference.iter().filter(|&&x| x).count());
1631+
assert_eq!(set_2.count(), set_2_reference.iter().filter(|&&x| x).count());
15821632

15831633
// Check `last_set_in()`.
15841634
if domain_size > 0 {
15851635
let range = rng.sample_range(domain_size - 1);
15861636
assert_eq!(
15871637
set_1.last_set_in(range.clone()),
1588-
set_1_reference.last_set_in(range.clone())
1638+
range.clone().filter(|&i| set_1.contains(i)).last()
15891639
);
15901640
assert_eq!(
15911641
set_2.last_set_in(range.clone()),
1592-
set_2_reference.last_set_in(range.clone())
1642+
range.filter(|&i| set_2.contains(i)).last()
15931643
);
15941644
}
15951645

0 commit comments

Comments
 (0)