/* __ *\ ** ________ ___ / / ___ Scala API ** ** / __/ __// _ | / / / _ | (c) 2003-2009, LAMP/EPFL ** ** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** ** /____/\___/_/ |_/____/_/ | | ** ** |/ ** \* */ // $Id: Set.scala 16893 2009-01-13 13:09:22Z cunei $ package scalax.collection.generic /**

* A set is a collection that includes at most one of any object. *

*

* This trait provides a limited interface, only allowing reading of elements. * There are two extensions of this trait, in packages * * scala.collection.mutable * and * scala.collection.immutable, which provide functionality for * adding and removing objects from the set. The trait in the first package is * for sets that are modified destructively, whereas the trait in * the second package is for immutable sets which create a new set * when something is added or removed to them. * * @author Matthias Zenger * @author Martin Odersky * @version 2.8 */ trait SetTemplate[+CC[B] <: SetTemplate[CC, B] with Set[B], A] extends (A => Boolean) with SizedIterable[A] with OrderedIterableTemplate[CC, A] { /** Returns the number of elements in this set. * * @return number of set elements. */ def size: Int /** Creates a new set of this kind with given elements */ def newBuilder[B]: Builder[CC, B] /** Checks if this set contains element elem. * * @param elem the element to check for membership. * @return true iff elem is contained in * this set. */ def contains(elem: A): Boolean /** Create a new set with an additional element. */ def +(elem: A): CC[A] /** Remove a single element from a set. * @param elem the element to be removed * @return a new set with the element removed. */ def -(elem: A): CC[A] /** Checks if this set is empty. * * @return true iff there is no element in the set. */ override def isEmpty: Boolean = size == 0 /** This method allows sets to be interpreted as predicates. * It returns true, iff this set contains element * elem. * * @param elem the element to check for membership. * @return true iff elem is contained in * this set. */ def apply(elem: A): Boolean = contains(elem) /** Add two or more elements to this set. * @param elem1 the first element. * @param elem2 the second element. * @param elems the remaining elements. * @return a new set with the elements added. */ def + (elem1: A, elem2: A, elems: A*): CC[A] = { thisCC + elem1 + elem2 ++ elems.asInstanceOf[Iterable[A]] } /** Remove two or more elements from this set. * * @param elem1 the first element. * @param elem2 the second element. * @param elems the remaining elements. * @return a new set with the elements removed. */ def - (elem1: A, elem2: A, elems: A*): CC[A] = this - elem1 - elem2 -- elems.asInstanceOf[Iterable[A]] /** Remove all the elements provided by an iterator * of the iterable object elems from the set. * * @param elems An iterable object containing the elements to remove from the set. * @return a new set with the elements removed. */ def -- (elems: Iterable[A]): CC[A] = this -- elems.elements /** Remove all the elements provided by an iterator * elems from the set. * * @param elems An iterator containing the elements to remove from the set. * @return a new set with the elements removed. */ def -- (elems: Iterator[A]): CC[A] = (thisCC /: elems) (_ - _) /** This method computes an intersection with set that. * It removes all the elements that are not present in that. * * @param that the set to intersect with. */ def intersect(that: Set[A]): CC[A] = filter(that.contains) /** This method is an alias for intersect. * It computes an intersection with set that. * It removes all the elements that are not present in that. * * @param that the set to intersect with */ def ** (that: collection.Set[A]): CC[A] = intersect(that) /** Checks if this set is a subset of set that. * * @param that another set. * @return true iff the other set is a superset of * this set. * todo: rename to isSubsetOf */ def subsetOf(that: Set[A]): Boolean = forall(that.contains) /** Compares this set with another object and returns true, iff the * other object is also a set which contains the same elements as * this set. * * @param that the other object * @note not necessarily run-time type safe. * @return true iff this set and the other set * contain the same elements. * @deprecated equals is not stable for mutable sets. * If you wish object identity, use eq or cast this set of AnyRef and then use * equals. If you wish element comparisons, use `sameElements` instead. */ @deprecated override def equals(that: Any): Boolean = that match { case other: Set[_] => this.size == other.size && subsetOf(other.asInstanceOf[Set[A]]) case _ => false } /* @deprecated hashCode is not stable for mutable sets. * if you intend to have object identity hashCode and wish the deprecated warning * to go away, cast this set to AnyRef before calling hashCode. */ @deprecated override def hashCode() = (0 /: this)((hash, e) => hash + e.hashCode()) /** Defines the prefix of this object's toString representation. */ override def stringPrefix: String = "Set" /** Need to override string, so that it's not the Function1's string that gets mixed in. */ override def toString = super[OrderedIterableTemplate].toString }