@@ -353,7 +353,7 @@ impl<T> ThinBitSet<T> {
353
353
354
354
debug_assert ! ( domain_size <= Self :: INLINE_CAPACITY ) ;
355
355
356
- * self_word |= !other_word & ! ( Word :: MAX >> domain_size) ;
356
+ * self_word |= !other_word & Word :: MAX . unbounded_shr ( ( WORD_BITS - domain_size) as u32 ) ;
357
357
} else if other. is_empty_unallocated ( ) {
358
358
self . insert_all ( domain_size) ;
359
359
} else {
@@ -1271,7 +1271,7 @@ mod tests {
1271
1271
1272
1272
use super :: super :: CHUNK_BITS ;
1273
1273
use super :: * ;
1274
- use crate :: bit_set :: DenseBitSet ;
1274
+ use crate :: IndexVec ;
1275
1275
1276
1276
/// A very simple pseudo random generator using linear xorshift.
1277
1277
///
@@ -1446,9 +1446,9 @@ mod tests {
1446
1446
const TEST_ITERATIONS : u32 = 512 ;
1447
1447
1448
1448
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) ;
1450
1450
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) ;
1452
1452
1453
1453
let hasher = BuildHasherDefault :: < DefaultHasher > :: new ( ) ;
1454
1454
@@ -1467,9 +1467,11 @@ mod tests {
1467
1467
let elem = rng. next ( ) % domain_size;
1468
1468
// Choose set to insert into.
1469
1469
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 ;
1471
1472
} 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 ;
1473
1475
}
1474
1476
}
1475
1477
20 ..40 => {
@@ -1482,20 +1484,28 @@ mod tests {
1482
1484
// Choose set to insert into.
1483
1485
if rng. next_bool ( ) {
1484
1486
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
+ }
1486
1490
} else {
1487
1491
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
+ }
1489
1495
}
1490
1496
}
1491
1497
40 ..50 => {
1492
1498
// Test insert_all().
1493
1499
if rng. next_bool ( ) {
1494
1500
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
+ }
1496
1504
} else {
1497
1505
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
+ }
1499
1509
}
1500
1510
}
1501
1511
50 ..70 => {
@@ -1506,66 +1516,106 @@ mod tests {
1506
1516
let elem = rng. next ( ) % domain_size;
1507
1517
// Choose set to remove into.
1508
1518
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 ;
1510
1521
} 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 ;
1512
1524
}
1513
1525
}
1514
1526
70 ..76 => {
1515
1527
// 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
+ }
1517
1536
}
1518
1537
76 ..82 => {
1519
1538
// 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
+ }
1524
1547
}
1525
1548
82 ..88 => {
1526
1549
// 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
+ }
1528
1558
}
1529
1559
88 ..94 => {
1530
1560
// Union_not
1531
1561
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
+ }
1533
1567
}
1534
1568
94 ..97 => {
1535
1569
// Clear
1536
1570
if rng. next_bool ( ) {
1537
1571
set_1. clear ( ) ;
1538
- set_1_reference. clear ( ) ;
1572
+ for x in set_1_reference. iter_mut ( ) {
1573
+ * x = false ;
1574
+ }
1539
1575
} else {
1540
1576
set_2. clear ( ) ;
1541
- set_2_reference. clear ( ) ;
1577
+ for x in set_2_reference. iter_mut ( ) {
1578
+ * x = false ;
1579
+ }
1542
1580
}
1543
1581
}
1544
1582
97 ..100 => {
1545
1583
// Test new_filled().
1546
1584
if rng. next_bool ( ) {
1547
1585
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
+ }
1549
1589
} else {
1550
1590
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
+ }
1552
1594
}
1553
1595
}
1554
1596
_ => unreachable ! ( ) ,
1555
1597
}
1556
1598
1557
1599
// Check the contains function.
1558
1600
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 ] ) ;
1561
1603
}
1562
1604
1563
1605
// 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
+ ) ;
1566
1616
1567
1617
// 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 ) ) ) ;
1569
1619
1570
1620
// Check the `==` operator.
1571
1621
assert_eq ! ( set_1 == set_2, set_1_reference == set_2_reference) ;
@@ -1577,19 +1627,19 @@ mod tests {
1577
1627
}
1578
1628
1579
1629
// 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( ) ) ;
1582
1632
1583
1633
// Check `last_set_in()`.
1584
1634
if domain_size > 0 {
1585
1635
let range = rng. sample_range ( domain_size - 1 ) ;
1586
1636
assert_eq ! (
1587
1637
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 ( )
1589
1639
) ;
1590
1640
assert_eq ! (
1591
1641
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 ( )
1593
1643
) ;
1594
1644
}
1595
1645
0 commit comments