summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert.plociniczak@epfl.ch>2011-01-04 10:38:41 +0000
committerHubert Plociniczak <hubert.plociniczak@epfl.ch>2011-01-04 10:38:41 +0000
commita87d132bb752858dc5f8ac0d450a33f58dd12cba (patch)
tree32799c6c6515b752382f50d5ddf3b587e083f20f
parent1f4d528702ca32ed01e500ea2ef2e9b2ebbe07d1 (diff)
downloadscala-a87d132bb752858dc5f8ac0d450a33f58dd12cba.tar.gz
scala-a87d132bb752858dc5f8ac0d450a33f58dd12cba.tar.bz2
scala-a87d132bb752858dc5f8ac0d450a33f58dd12cba.zip
Closes #3687, #3719, #3950, #3616.
-rw-r--r--src/library/scala/Enumeration.scala94
-rw-r--r--test/files/run/t3687.check2
-rw-r--r--test/files/run/t3687.scala6
-rw-r--r--test/files/run/t3719.check4
-rw-r--r--test/files/run/t3719.scala35
-rw-r--r--test/files/run/t3950.check3
-rw-r--r--test/files/run/t3950.scala17
7 files changed, 83 insertions, 78 deletions
diff --git a/src/library/scala/Enumeration.scala b/src/library/scala/Enumeration.scala
index 7039fec4bf..c73829bd6c 100644
--- a/src/library/scala/Enumeration.scala
+++ b/src/library/scala/Enumeration.scala
@@ -48,13 +48,12 @@ import java.lang.reflect.{ Modifier, Method => JMethod, Field => JField }
* @param names The sequence of names to give to this enumeration's values.
*
* @author Matthias Zenger
- * @version 1.0, 10/02/2004
*/
@SerialVersionUID(8476000850333817230L)
abstract class Enumeration(initial: Int, names: String*) extends Serializable {
thisenum =>
- def this() = this(0, null)
+ def this() = this(0)
def this(names: String*) = this(0, names: _*)
/* Note that `readResolve` cannot be private, since otherwise
@@ -81,7 +80,7 @@ abstract class Enumeration(initial: Int, names: String*) extends Serializable {
*/
def values: ValueSet = {
if (!vsetDefined) {
- vset = new ValueSet(immutable.BitSet.empty ++ (vmap.values map (_.id)))
+ vset = new ValueSet(immutable.SortedSet.empty[Int] ++ (vmap.values map (_.id)))
vsetDefined = true
}
vset
@@ -92,8 +91,8 @@ abstract class Enumeration(initial: Int, names: String*) extends Serializable {
/** The string to use to name the next created value. */
protected var nextName = names.iterator
- private def nextNameOrElse(orElse: => String) =
- if (nextName.hasNext) nextName.next else orElse
+ private def nextNameOrNull =
+ if (nextName.hasNext) nextName.next else null
/** The highest integer amongst those used to identify values in this
* enumeration. */
@@ -133,13 +132,14 @@ abstract class Enumeration(initial: Int, names: String*) extends Serializable {
*
* @param i An integer that identifies this value at run-time. It must be
* unique amongst all values of the enumeration.
- * @return ..
+ * @return Fresh value identified by <code>i</code>.
*/
- protected final def Value(i: Int): Value = Value(i, nextNameOrElse(null))
+ protected final def Value(i: Int): Value = Value(i, nextNameOrNull)
/** Creates a fresh value, part of this enumeration, called <code>name</code>.
*
* @param name A human-readable name for that value.
+ * @return Fresh value called <code>name</code>.
*/
protected final def Value(name: String): Value = Value(nextId, name)
@@ -149,14 +149,15 @@ abstract class Enumeration(initial: Int, names: String*) extends Serializable {
* @param i An integer that identifies this value at run-time. It must be
* unique amongst all values of the enumeration.
* @param name A human-readable name for that value.
- * @return ..
+ * @return Fresh value with the provided identifier <code>i</code> and name <code>name</code>.
*/
protected final def Value(i: Int, name: String): Value = new Val(i, name)
private def populateNameMap() {
// The list of possible Value methods: 0-args which return a conforming type
- val methods = getClass.getMethods filter (m => m.getParameterTypes.isEmpty && classOf[Value].isAssignableFrom(m.getReturnType))
-
+ val methods = getClass.getMethods filter (m => m.getParameterTypes.isEmpty &&
+ classOf[Value].isAssignableFrom(m.getReturnType) &&
+ m.getDeclaringClass != classOf[Enumeration])
methods foreach { m =>
val name = m.getName
// invoke method to obtain actual `Value` instance
@@ -172,9 +173,7 @@ abstract class Enumeration(initial: Int, names: String*) extends Serializable {
/* Obtains the name for the value with id `i`. If no name is cached
* in `nmap`, it populates `nmap` using reflection.
*/
- private def nameOf(i: Int): String = synchronized {
- nmap.getOrElse(i, { populateNameMap() ; nmap(i) })
- }
+ private def nameOf(i: Int): String = synchronized { nmap.getOrElse(i, { populateNameMap() ; nmap(i) }) }
/** The type of the enumerated values. */
@SerialVersionUID(7091335633555234129L)
@@ -190,23 +189,6 @@ abstract class Enumeration(initial: Int, names: String*) extends Serializable {
case _ => false
}
override def hashCode: Int = id.##
-
- /** this enumeration value as an <code>Int</code> bit mask.
- * @throws IllegalArgumentException if <code>id</code> is greater than 31
- */
- @deprecated("mask32 will be removed")
- def mask32: Int = {
- if (id >= 32) throw new IllegalArgumentException
- 1 << id
- }
- /** this enumeration value as a <code>Long</code> bit mask.
- * @throws IllegalArgumentException if <code>id</code> is greater than 63
- */
- @deprecated("mask64 will be removed")
- def mask64: Long = {
- if (id >= 64) throw new IllegalArgumentException
- 1L << id
- }
}
/** A class implementing the <a href="Enumeration.Value.html"
@@ -216,7 +198,7 @@ abstract class Enumeration(initial: Int, names: String*) extends Serializable {
*/
@SerialVersionUID(0 - 3501153230598116017L)
protected class Val(i: Int, name: String) extends Value with Serializable {
- def this(i: Int) = this(i, nextNameOrElse(i.toString))
+ def this(i: Int) = this(i, nextNameOrNull)
def this(name: String) = this(nextId, name)
def this() = this(nextId)
@@ -240,9 +222,9 @@ abstract class Enumeration(initial: Int, names: String*) extends Serializable {
/** A class for sets of values
* Iterating through this set will yield values in increasing order of their ids.
- * @param ids The set of ids of values, organized as a BitSet.
+ * @param ids The set of ids of values, organized as a SortedSet.
*/
- class ValueSet private[Enumeration] (val ids: immutable.BitSet) extends Set[Value] with SetLike[Value, ValueSet] {
+ class ValueSet private[Enumeration] (val ids: immutable.SortedSet[Int]) extends Set[Value] with SetLike[Value, ValueSet] {
override def empty = ValueSet.empty
def contains(v: Value) = ids contains (v.id)
def + (value: Value) = new ValueSet(ids + value.id)
@@ -257,7 +239,7 @@ abstract class Enumeration(initial: Int, names: String*) extends Serializable {
import generic.CanBuildFrom
/** The empty value set */
- val empty = new ValueSet(immutable.BitSet.empty)
+ val empty = new ValueSet(immutable.SortedSet.empty)
/** A value set consisting of given elements */
def apply(elems: Value*): ValueSet = empty ++ elems
/** A builder object for value sets */
@@ -269,48 +251,4 @@ abstract class Enumeration(initial: Int, names: String*) extends Serializable {
def apply() = newBuilder
}
}
-
- /** The name of this enumeration. */
- @deprecated("use toString instead") def name = toString
-
- @deprecated("use withName instead")
- def valueOf(s: String) = values.find(_.toString == s)
-
- /** A new iterator over all values of this enumeration. */
- @deprecated("use values.iterator instead")
- final def iterator: Iterator[Value] = values.iterator
-
- /** Apply a function f to all values of this enumeration. */
- @deprecated("use values.foreach instead")
- def foreach(f: Value => Unit): Unit = this.iterator foreach f
-
- /** Apply a predicate p to all values of this enumeration and return
- * true, iff the predicate yields true for all values.
- */
- @deprecated("use values.forall instead")
- def forall(p: Value => Boolean): Boolean = this.iterator forall p
-
- /** Apply a predicate p to all values of this enumeration and return
- * true, iff there is at least one value for which p yields true.
- */
- @deprecated("use values.exists instead")
- def exists(p: Value => Boolean): Boolean = this.iterator exists p
-
- /** Returns an iterator resulting from applying the given function f to each
- * value of this enumeration.
- */
- @deprecated("use values.map instead")
- def map[B](f: Value => B): Iterator[B] = this.iterator map f
-
- /** Applies the given function f to each value of this enumeration, then
- * concatenates the results.
- */
- @deprecated("use values.flatMap instead")
- def flatMap[B](f: Value => TraversableOnce[B]): Iterator[B] = this.iterator flatMap f
-
- /** Returns all values of this enumeration that satisfy the predicate p.
- * The order of values is preserved.
- */
- @deprecated("use values.filter instead")
- def filter(p: Value => Boolean): Iterator[Value] = this.iterator filter p
}
diff --git a/test/files/run/t3687.check b/test/files/run/t3687.check
new file mode 100644
index 0000000000..0f35862645
--- /dev/null
+++ b/test/files/run/t3687.check
@@ -0,0 +1,2 @@
+t.ValueSet(a, b)
+t.ValueSet(a, b) \ No newline at end of file
diff --git a/test/files/run/t3687.scala b/test/files/run/t3687.scala
new file mode 100644
index 0000000000..25141f8a32
--- /dev/null
+++ b/test/files/run/t3687.scala
@@ -0,0 +1,6 @@
+object t extends Enumeration { val a, b = Value }
+
+object Test extends Application {
+ println(t.values)
+ println(t.values)
+}
diff --git a/test/files/run/t3719.check b/test/files/run/t3719.check
new file mode 100644
index 0000000000..111fc7fd63
--- /dev/null
+++ b/test/files/run/t3719.check
@@ -0,0 +1,4 @@
+List(Mon, Tue, Wed, Thu, Fri, Sat, Sun)
+Mon
+Tue
+Mon \ No newline at end of file
diff --git a/test/files/run/t3719.scala b/test/files/run/t3719.scala
new file mode 100644
index 0000000000..2436e0cdf6
--- /dev/null
+++ b/test/files/run/t3719.scala
@@ -0,0 +1,35 @@
+object Days extends Enumeration {
+ type Day = DayValue
+ val Mon, Tue, Wed, Thu, Fri, Sat, Sun = new DayValue // DayValue
+
+ protected class DayValue extends Val {
+ def isWeekday: Boolean =
+ this match {
+ case Sun => false
+ case Sat => false
+ case _ => true
+ }
+ }
+}
+
+object Test extends Application {
+ def dayElementsShouldBeNamed(): List[String] =
+ Days.values.toList.sorted.map(x => x.toString)
+
+ def nameOfMon(): String = {
+ import Days._
+ val d: Day = Mon
+ d.toString
+ }
+
+ def nameOfTue(): String = {
+ import Days._
+ val d: Day = Tue
+ d.toString
+ }
+
+ println(dayElementsShouldBeNamed())
+ println(nameOfMon())
+ println(nameOfTue())
+ println(nameOfMon())
+}
diff --git a/test/files/run/t3950.check b/test/files/run/t3950.check
new file mode 100644
index 0000000000..10f81c51ad
--- /dev/null
+++ b/test/files/run/t3950.check
@@ -0,0 +1,3 @@
+minus
+zero
+plus \ No newline at end of file
diff --git a/test/files/run/t3950.scala b/test/files/run/t3950.scala
new file mode 100644
index 0000000000..fe99a7cc6f
--- /dev/null
+++ b/test/files/run/t3950.scala
@@ -0,0 +1,17 @@
+
+object NegativeId extends Enumeration {
+ val Negative = Value(-1, "minus")
+ val Zero = Value(0, "zero")
+ val Positive = Value(1, "plus")
+
+ def fromInt(id: Int) = values find (_.id == id) match {
+ case Some(v) => v
+ case None => null
+ }
+}
+
+object Test extends Application {
+ println(NegativeId.fromInt(-1))
+ println(NegativeId.fromInt(0))
+ println(NegativeId.fromInt(1))
+}