override def plus()

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))
    }