intersect returns a new runContainer16 holding the intersection of rc (also known as 'a') and b.
(b *runContainer16)
| 604 | // intersect returns a new runContainer16 holding the |
| 605 | // intersection of rc (also known as 'a') and b. |
| 606 | func (rc *runContainer16) intersect(b *runContainer16) *runContainer16 { |
| 607 | a := rc |
| 608 | numa := len(a.iv) |
| 609 | numb := len(b.iv) |
| 610 | res := &runContainer16{} |
| 611 | if numa == 0 || numb == 0 { |
| 612 | return res |
| 613 | } |
| 614 | |
| 615 | if numa == 1 && numb == 1 { |
| 616 | if !haveOverlap16(a.iv[0], b.iv[0]) { |
| 617 | return res |
| 618 | } |
| 619 | } |
| 620 | |
| 621 | var output []interval16 |
| 622 | |
| 623 | var acuri int |
| 624 | var bcuri int |
| 625 | |
| 626 | astart := int(a.iv[acuri].start) |
| 627 | bstart := int(b.iv[bcuri].start) |
| 628 | |
| 629 | var intersection interval16 |
| 630 | var leftoverstart int |
| 631 | var isOverlap, isLeftoverA, isLeftoverB bool |
| 632 | var done bool |
| 633 | toploop: |
| 634 | for acuri < numa && bcuri < numb { |
| 635 | |
| 636 | isOverlap, isLeftoverA, isLeftoverB, leftoverstart, intersection = intersectWithLeftover16(astart, int(a.iv[acuri].last()), bstart, int(b.iv[bcuri].last())) |
| 637 | |
| 638 | if !isOverlap { |
| 639 | switch { |
| 640 | case astart < bstart: |
| 641 | acuri, done = a.findNextIntervalThatIntersectsStartingFrom(acuri+1, bstart) |
| 642 | if done { |
| 643 | break toploop |
| 644 | } |
| 645 | astart = int(a.iv[acuri].start) |
| 646 | |
| 647 | case astart > bstart: |
| 648 | bcuri, done = b.findNextIntervalThatIntersectsStartingFrom(bcuri+1, astart) |
| 649 | if done { |
| 650 | break toploop |
| 651 | } |
| 652 | bstart = int(b.iv[bcuri].start) |
| 653 | } |
| 654 | } else { |
| 655 | // isOverlap |
| 656 | output = append(output, intersection) |
| 657 | switch { |
| 658 | case isLeftoverA: |
| 659 | // note that we change astart without advancing acuri, |
| 660 | // since we need to capture any 2ndary intersections with a.iv[acuri] |
| 661 | astart = leftoverstart |
| 662 | bcuri++ |
| 663 | if bcuri >= numb { |