summaryrefslogtreecommitdiff
path: root/src/library/scalax/collection/generic/SetTemplate.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/library/scalax/collection/generic/SetTemplate.scala')
-rwxr-xr-xsrc/library/scalax/collection/generic/SetTemplate.scala173
1 files changed, 173 insertions, 0 deletions
diff --git a/src/library/scalax/collection/generic/SetTemplate.scala b/src/library/scalax/collection/generic/SetTemplate.scala
new file mode 100755
index 0000000000..9c3056cc04
--- /dev/null
+++ b/src/library/scalax/collection/generic/SetTemplate.scala
@@ -0,0 +1,173 @@
+/* __ *\
+** ________ ___ / / ___ 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
+
+
+/** <p>
+ * A set is a collection that includes at most one of any object.
+ * </p>
+ * <p>
+ * This trait provides a limited interface, only allowing reading of elements.
+ * There are two extensions of this trait, in packages
+ * <code><a href="mutable$content.html" target="contentFrame">
+ * scala.collection.mutable</a></code>
+ * and <code><a href="immutable$content.html" target="contentFrame">
+ * scala.collection.immutable</a></code>, 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 <code>elem</code>.
+ *
+ * @param elem the element to check for membership.
+ * @return <code>true</code> iff <code>elem</code> 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 <code>true</code> 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 <code>true</code>, iff this set contains element
+ * <code>elem</code>.
+ *
+ * @param elem the element to check for membership.
+ * @return <code>true</code> iff <code>elem</code> 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 <code>elems</code> 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
+ * <code>elems</code> 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 <code>that</code>.
+ * It removes all the elements that are not present in <code>that</code>.
+ *
+ * @param that the set to intersect with.
+ */
+ def intersect(that: Set[A]): CC[A] = filter(that.contains)
+
+ /** This method is an alias for <code>intersect</code>.
+ * It computes an intersection with set <code>that</code>.
+ * It removes all the elements that are not present in <code>that</code>.
+ *
+ * @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 <code>that</code>.
+ *
+ * @param that another set.
+ * @return <code>true</code> 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 <code>true</code> 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 <code>toString</code> 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
+}