Intersect our bitmap with the RHS and return true if ours changed.
| 585 | |
| 586 | // Intersect our bitmap with the RHS and return true if ours changed. |
| 587 | bool operator&=(const SparseBitVector &RHS) { |
| 588 | if (this == &RHS) |
| 589 | return false; |
| 590 | |
| 591 | bool changed = false; |
| 592 | ElementListIter Iter1 = Elements.begin(); |
| 593 | ElementListConstIter Iter2 = RHS.Elements.begin(); |
| 594 | |
| 595 | // Check if both bitmaps are empty. |
| 596 | if (Elements.empty() && RHS.Elements.empty()) |
| 597 | return false; |
| 598 | |
| 599 | // Loop through, intersecting as we go, erasing elements when necessary. |
| 600 | while (Iter2 != RHS.Elements.end()) { |
| 601 | if (Iter1 == Elements.end()) { |
| 602 | CurrElementIter = Elements.begin(); |
| 603 | return changed; |
| 604 | } |
| 605 | |
| 606 | if (Iter1->index() > Iter2->index()) { |
| 607 | ++Iter2; |
| 608 | } else if (Iter1->index() == Iter2->index()) { |
| 609 | bool BecameZero; |
| 610 | changed |= Iter1->intersectWith(*Iter2, BecameZero); |
| 611 | if (BecameZero) { |
| 612 | ElementListIter IterTmp = Iter1; |
| 613 | ++Iter1; |
| 614 | Elements.erase(IterTmp); |
| 615 | } else { |
| 616 | ++Iter1; |
| 617 | } |
| 618 | ++Iter2; |
| 619 | } else { |
| 620 | ElementListIter IterTmp = Iter1; |
| 621 | ++Iter1; |
| 622 | Elements.erase(IterTmp); |
| 623 | changed = true; |
| 624 | } |
| 625 | } |
| 626 | if (Iter1 != Elements.end()) { |
| 627 | Elements.erase(Iter1, Elements.end()); |
| 628 | changed = true; |
| 629 | } |
| 630 | CurrElementIter = Elements.begin(); |
| 631 | return changed; |
| 632 | } |
| 633 | |
| 634 | // Intersect our bitmap with the complement of the RHS and return true |
| 635 | // if ours changed. |