scala.collection.generic.Sorted.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of scala-library Show documentation
Show all versions of scala-library Show documentation
Standard library for the Scala Programming Language
/* __ *\
** ________ ___ / / ___ Scala API **
** / __/ __// _ | / / / _ | (c) 2006-2013, LAMP/EPFL **
** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
** /____/\___/_/ |_/____/_/ | | **
** |/ **
\* */
package scala.collection
package generic
/** Any collection (including maps) whose keys (or elements) are ordered.
*
* @author Sean McDirmid
* @since 2.8
*/
trait Sorted[K, +This <: Sorted[K, This]] {
def ordering : Ordering[K]
/** The current collection */
protected def repr: This
/** return as a projection the set of keys in this collection */
def keySet: SortedSet[K]
/** Returns the first key of the collection. */
def firstKey: K
/** Returns the last key of the collection. */
def lastKey: K
/** Comparison function that orders keys. */
def compare(k0: K, k1: K): Int = ordering.compare(k0, k1)
/** Creates a ranged projection of this collection. Any mutations in the
* ranged projection will update this collection and vice versa.
*
* Note: keys are not garuanteed to be consistent between this collection
* and the projection. This is the case for buffers where indexing is
* relative to the projection.
*
* @param from The lower-bound (inclusive) of the ranged projection.
* `None` if there is no lower bound.
* @param until The upper-bound (exclusive) of the ranged projection.
* `None` if there is no upper bound.
*/
def rangeImpl(from: Option[K], until: Option[K]): This
/** Creates a ranged projection of this collection with no upper-bound.
*
* @param from The lower-bound (inclusive) of the ranged projection.
*/
def from(from: K): This = rangeImpl(Some(from), None)
/** Creates a ranged projection of this collection with no lower-bound.
*
* @param until The upper-bound (exclusive) of the ranged projection.
*/
def until(until: K): This = rangeImpl(None, Some(until))
/** Creates a ranged projection of this collection with both a lower-bound
* and an upper-bound.
*
* @param from The upper-bound (exclusive) of the ranged projection.
*/
def range(from: K, until: K): This = rangeImpl(Some(from), Some(until))
/** Create a range projection of this collection with no lower-bound.
* @param to The upper-bound (inclusive) of the ranged projection.
*/
def to(to: K): This = {
val i = keySet.from(to).iterator
if (i.isEmpty) return repr
val next = i.next
if (compare(next, to) == 0)
if (i.isEmpty) repr
else until(i.next)
else
until(next)
}
protected def hasAll(j: Iterator[K]): Boolean = {
val i = keySet.iterator
if (i.isEmpty) return j.isEmpty
var in = i.next;
while (j.hasNext) {
val jn = j.next;
while ({
val n = compare(jn, in);
if (n == 0) false;
else if (n < 0) return false;
else if (!i.hasNext) return false;
else true;
}) in = i.next;
}
true
}
}