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

Method union

runcontainer.go:371–480  ·  view source on GitHub ↗

union merges two runContainer16s, producing a new runContainer16 with the union of rc and b.

(b *runContainer16)

Source from the content-addressed store, hash-verified

369// union merges two runContainer16s, producing
370// a new runContainer16 with the union of rc and b.
371func (rc *runContainer16) union(b *runContainer16) *runContainer16 {
372 // rc is also known as 'a' here, but golint insisted we
373 // call it rc for consistency with the rest of the methods.
374
375 var m []interval16
376
377 alim := len(rc.iv)
378 blim := len(b.iv)
379
380 var na int // next from a
381 var nb int // next from b
382
383 // merged holds the current merge output, which might
384 // get additional merges before being appended to m.
385 var merged interval16
386 var mergedUsed bool // is merged being used at the moment?
387
388 var cura interval16 // currently considering this interval16 from a
389 var curb interval16 // currently considering this interval16 from b
390
391 pass := 0
392 for na < alim && nb < blim {
393 pass++
394 cura = rc.iv[na]
395 curb = b.iv[nb]
396
397 if mergedUsed {
398 mergedUpdated := false
399 if canMerge16(cura, merged) {
400 merged = mergeInterval16s(cura, merged)
401 na = rc.indexOfIntervalAtOrAfter(int(merged.last())+1, na+1)
402 mergedUpdated = true
403 }
404 if canMerge16(curb, merged) {
405 merged = mergeInterval16s(curb, merged)
406 nb = b.indexOfIntervalAtOrAfter(int(merged.last())+1, nb+1)
407 mergedUpdated = true
408 }
409 if !mergedUpdated {
410 // we know that merged is disjoint from cura and curb
411 m = append(m, merged)
412 mergedUsed = false
413 }
414 continue
415
416 } else {
417 // !mergedUsed
418 if !canMerge16(cura, curb) {
419 if cura.start < curb.start {
420 m = append(m, cura)
421 na++
422 } else {
423 m = append(m, curb)
424 nb++
425 }
426 } else {
427 merged = mergeInterval16s(cura, curb)
428 mergedUsed = true

Callers 7

setMethod · 0.95
iaddRangeMethod · 0.95
orMethod · 0.95
TestRleRunIterator16Function · 0.80
TestRleRandomUnion16Function · 0.80
NotMethod · 0.80

Calls 4

lastMethod · 0.95
canMerge16Function · 0.85
mergeInterval16sFunction · 0.85

Tested by 3

TestRleRunIterator16Function · 0.64
TestRleRandomUnion16Function · 0.64