| 524 | } |
| 525 | |
| 526 | func (ac *arrayContainer) lazyorArray(value2 *arrayContainer) container { |
| 527 | value1 := ac |
| 528 | maxPossibleCardinality := value1.getCardinality() + value2.getCardinality() |
| 529 | if maxPossibleCardinality > arrayLazyLowerBound { // it could be a bitmap! |
| 530 | bc := newBitmapContainer() |
| 531 | for k := 0; k < len(value2.content); k++ { |
| 532 | v := value2.content[k] |
| 533 | i := uint(v) >> 6 |
| 534 | mask := uint64(1) << (v % 64) |
| 535 | bc.bitmap[i] |= mask |
| 536 | } |
| 537 | for k := 0; k < len(ac.content); k++ { |
| 538 | v := ac.content[k] |
| 539 | i := uint(v) >> 6 |
| 540 | mask := uint64(1) << (v % 64) |
| 541 | bc.bitmap[i] |= mask |
| 542 | } |
| 543 | bc.cardinality = invalidCardinality |
| 544 | return bc |
| 545 | } |
| 546 | answer := newArrayContainerCapacity(maxPossibleCardinality) |
| 547 | nl := union2by2(value1.content, value2.content, answer.content) |
| 548 | answer.content = answer.content[:nl] // reslice to match actual used capacity |
| 549 | return answer |
| 550 | } |
| 551 | |
| 552 | func (ac *arrayContainer) and(a container) container { |
| 553 | switch x := a.(type) { |