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

org.opalj.collection.IntSet.scala Maven / Gradle / Ivy

The newest version!
/* BSD 2-Clause License - see OPAL/LICENSE for details. */
package org.opalj
package collection

import scala.collection.mutable.Builder
import org.opalj.collection.immutable.Chain

/**
 * A set of integer values.
 *
 * @author Michael Eichberg
 */
trait IntSet[T <: IntSet[T]] { intSet: T ⇒

    def isEmpty: Boolean
    def nonEmpty: Boolean = !isEmpty
    /** Tests if this set has exactly one element (complexity: O(1)). */
    def isSingletonSet: Boolean
    /** Tests if this set has more than one element (complexity: O(1)). */
    def hasMultipleElements: Boolean

    /**
     * The size of the set; may not be a constant operation; if possible use isEmpty, nonEmpty,
     * etc.; or lookup the complexity in the concrete data structures.
     */
    def size: Int

    def foreach[U](f: Int ⇒ U): Unit
    def withFilter(p: Int ⇒ Boolean): T
    def map(f: Int ⇒ Int): T
    /**
     * Uses the keys of this set to map them to the value found in the given array at the respective index.
     */
    def map(map: Array[Int]): T
    def map[A <: AnyRef](f: Int ⇒ A): Set[A] = foldLeft(Set.empty[A])(_ + f(_)) // IMPROVE Consider using SetBuilder to set the initial "expected" (maximum) size
    def flatMap(f: Int ⇒ T): T

    def foldLeft[B](z: B)(f: (B, Int) ⇒ B): B

    def head: Int
    def contains(value: Int): Boolean
    def exists(p: Int ⇒ Boolean): Boolean
    def forall(f: Int ⇒ Boolean): Boolean

    def -(i: Int): T
    def +(i: Int): T

    final def --(is: TraversableOnce[Int]): T = {
        var r = this
        is.foreach { i ⇒ r -= i }
        r
    }
    final def --(is: IntSet[_]): T = {
        var r = this
        is.foreach { i ⇒ r -= i }
        r
    }

    final def ++(that: T): T = {
        if (this.size >= that.size)
            that.foldLeft(this)(_ + _) // we expand `this` since `this` is larger
        else
            this.foldLeft(that)(_ + _) // we expand `that`
    }

    final def ++(that: TraversableOnce[Int]): T = that.foldLeft(this)(_ + _)

    final def ++(that: IntIterator): T = that.foldLeft(this)(_ + _)

    def iterator: IntIterator

    def toChain: Chain[Int]

    final def transform[B, To](f: Int ⇒ B, b: Builder[B, To]): To = {
        foreach(i ⇒ b += f(i))
        b.result()
    }

    def toArray: Array[Int] = {
        val size = this.size
        val data = new Array[Int](size)
        val it = iterator
        var i = 0
        while (i < size) {
            data(i) = it.next()
            i += 1
        }
        data
    }

    final def mkString(pre: String, in: String, post: String): String = {
        val sb = new StringBuilder(pre)
        val it = iterator
        var hasNext = it.hasNext
        while (hasNext) {
            sb.append(it.next().toString)
            hasNext = it.hasNext
            if (hasNext) sb.append(in)
        }
        sb.append(post)
        sb.toString()
    }

    final def mkString(in: String): String = mkString("", in, "")

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy