MCPcopy Create free account
hub / github.com/RoaringBitmap/roaring / intersect

Method intersect

runcontainer.go:606–702  ·  view source on GitHub ↗

intersect returns a new runContainer16 holding the intersection of rc (also known as 'a') and b.

(b *runContainer16)

Source from the content-addressed store, hash-verified

604// intersect returns a new runContainer16 holding the
605// intersection of rc (also known as 'a') and b.
606func (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
633toploop:
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 {

Callers 6

andMethod · 0.95
inplaceIntersectMethod · 0.95
TestRleIntersection16Function · 0.80
NotMethod · 0.80

Calls 4

haveOverlap16Function · 0.85
intersectWithLeftover16Function · 0.85
lastMethod · 0.80

Tested by 3

TestRleIntersection16Function · 0.64