All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scalax.collection.mutable.ExtBitSet.scala Maven / Gradle / Ivy

The newest version!
package scalax.collection
package mutable

import scala.collection.mutable.BitSet

import State.Handle
import ExtBitSet._

final protected[collection] class ExtBitSet(words: Array[Long]) extends BitSet(words) {
  def this(initWords: Int = incrWords) = this(new Array[Long](initWords))
  def nrWords: Int = nwords

  /** Array containing the internal words. */
  def cloneWords: Array[Long] = {
    val arr = new Array[Long](nrWords)
    Array.copy(elems, 0, arr, 0, nrWords)
    arr
  }
  override def clone(): ExtBitSet = new ExtBitSet(cloneWords)

  final override protected def className = getClass.getSimpleName

  /** All bits of all words. */
  override def toString =
    (elems map (w => "%64s".format(java.lang.Long.toBinaryString(w)).replace(' ', '0'))).mkString(" ")

  /** Summary of the words each of which formatted as :. */
  def summary: String =
    elems.zipWithIndex.map(zWord => "%2d:%2d" format (zWord._2, java.lang.Long.bitCount(zWord._1))) mkString " "

  @inline def apply(idx: Int, mask: Long): Boolean =
    (word(idx) & mask) != 0

  @inline def apply(h: Handle): Boolean = apply(h.index, h.mask)

  def update(idx: Int, mask: Long, isSet: Boolean): Unit =
    if (isSet) {
      val word =
        if (idx >= nwords) { expand(idx); 0L }
        else elems(idx)
      elems(idx) = word | mask
    } else if (idx < nwords)
      elems(idx) = elems(idx) & ~mask

  @inline def update(h: Handle, isSet: Boolean): Unit = update(h.index, h.mask, isSet)

  def unary_~ : ExtBitSet = {
    val newBits = new ExtBitSet(nwords)
    var idx     = 0
    while (idx < nwords) {
      newBits.elems(idx) = ~this.elems(idx)
      idx += 1
    }
    newBits
  }

  def &=(other: ExtBitSet): this.type = {
    var idx = 0
    while (idx < nwords) {
      elems(idx) &= other.word(idx)
      idx += 1
    }
    this
  }

  def onOrFindUnset(other: ExtBitSet): Option[Handle] = {
    var idx = 0
    while (idx < nwords) {
      val or = elems(idx) | other.word(idx)
      if (or == ~0) idx += 1
      else return Some(new Handle(idx, java.lang.Long.lowestOneBit(~or)))
    }
    None
  }

  def lowestOneBit: Option[Handle] = {
    var idx = 0
    while (idx < nwords) {
      val bit = java.lang.Long.lowestOneBit(elems(idx))
      if (bit == 0) idx += 1
      else return Some(new Handle(idx, bit))
    }
    None
  }

  private def expand(mustHaveIdx: Int): Unit = {
    var newlen = nwords
    while (mustHaveIdx >= newlen) newlen = newlen + incrWords
    val newElems = new Array[Long](newlen)
    Array.copy(elems, 0, newElems, 0, nwords)
    elems = newElems
  }

  override protected def writeReplace() = this
}

object ExtBitSet {
  val incrWords = 8
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy