in algebird-core/src/main/scala/com/twitter/algebird/BloomFilter.scala [202:246]
override def plus(left: BF[A], right: BF[A]): BF[A] = left ++ right
override def sumOption(as: TraversableOnce[BF[A]]): Option[BF[A]] =
if (as.iterator.isEmpty) None
else {
// share a single mutable bitset
val longBitSet = LongBitSet.empty(width)
var sets = 0
@inline def set(i: Int): Unit = {
longBitSet.set(i)
sets += 1
}
var oneItem: BFItem[A] = null
@inline def add(it: BFItem[A]): Unit = {
oneItem = it
val hs = hashes(it.item)
var pos = 0
while (pos < hs.length) {
set(hs(pos))
pos += 1
}
}
as.iterator.foreach {
case BFZero(_, _) => ()
case bf @ BFItem(_, _, _) => add(bf)
case BFSparse(_, cbitset, _) =>
val iter = cbitset.intIterator
while (iter.hasNext) { set(iter.next) }
case BFInstance(_, bitset, _) =>
// these Ints are boxed so, that's a minor bummer
val iter = bitset.iterator
while (iter.hasNext) { set(iter.next()) }
}
if (sets == 0) Some(zero)
else if (sets == numHashes && (oneItem != null)) Some(oneItem)
else if (sets < (width / 10)) {
val sbs = RichCBitSet.fromBitSet(longBitSet.toBitSetNoCopy)
Some(BFSparse(hashes, sbs, width))
} else Some(BFInstance(hashes, longBitSet.toBitSetNoCopy, width))
}