intersectCardinality returns the cardinality of the intersection of rc (also known as 'a') and b.
(b *runContainer16)
| 704 | // intersectCardinality returns the cardinality of the |
| 705 | // intersection of rc (also known as 'a') and b. |
| 706 | func (rc *runContainer16) intersectCardinality(b *runContainer16) int { |
| 707 | answer := int(0) |
| 708 | |
| 709 | a := rc |
| 710 | numa := len(a.iv) |
| 711 | numb := len(b.iv) |
| 712 | if numa == 0 || numb == 0 { |
| 713 | return 0 |
| 714 | } |
| 715 | |
| 716 | if numa == 1 && numb == 1 { |
| 717 | if !haveOverlap16(a.iv[0], b.iv[0]) { |
| 718 | return 0 |
| 719 | } |
| 720 | } |
| 721 | |
| 722 | var acuri int |
| 723 | var bcuri int |
| 724 | |
| 725 | astart := int(a.iv[acuri].start) |
| 726 | bstart := int(b.iv[bcuri].start) |
| 727 | |
| 728 | var intersection interval16 |
| 729 | var leftoverstart int |
| 730 | var isOverlap, isLeftoverA, isLeftoverB bool |
| 731 | var done bool |
| 732 | pass := 0 |
| 733 | toploop: |
| 734 | for acuri < numa && bcuri < numb { |
| 735 | pass++ |
| 736 | |
| 737 | isOverlap, isLeftoverA, isLeftoverB, leftoverstart, intersection = intersectWithLeftover16(astart, int(a.iv[acuri].last()), bstart, int(b.iv[bcuri].last())) |
| 738 | |
| 739 | if !isOverlap { |
| 740 | switch { |
| 741 | case astart < bstart: |
| 742 | acuri, done = a.findNextIntervalThatIntersectsStartingFrom(acuri+1, bstart) |
| 743 | if done { |
| 744 | break toploop |
| 745 | } |
| 746 | astart = int(a.iv[acuri].start) |
| 747 | |
| 748 | case astart > bstart: |
| 749 | bcuri, done = b.findNextIntervalThatIntersectsStartingFrom(bcuri+1, astart) |
| 750 | if done { |
| 751 | break toploop |
| 752 | } |
| 753 | bstart = int(b.iv[bcuri].start) |
| 754 | } |
| 755 | } else { |
| 756 | // isOverlap |
| 757 | answer += int(intersection.last()) - int(intersection.start) + 1 |
| 758 | switch { |
| 759 | case isLeftoverA: |
| 760 | // note that we change astart without advancing acuri, |
| 761 | // since we need to capture any 2ndary intersections with a.iv[acuri] |
| 762 | astart = leftoverstart |
| 763 | bcuri++ |