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

Method intersectCardinality

runcontainer.go:706–798  ·  view source on GitHub ↗

intersectCardinality returns the cardinality of the intersection of rc (also known as 'a') and b.

(b *runContainer16)

Source from the content-addressed store, hash-verified

704// intersectCardinality returns the cardinality of the
705// intersection of rc (also known as 'a') and b.
706func (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
733toploop:
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++

Callers 2

andCardinalityMethod · 0.95

Calls 4

lastMethod · 0.95
haveOverlap16Function · 0.85
intersectWithLeftover16Function · 0.85

Tested by 1