aboutsummaryrefslogtreecommitdiff
path: root/library
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2017-02-14 11:17:53 +0100
committerMartin Odersky <odersky@gmail.com>2017-04-04 13:29:38 +0200
commitcf10e28a54aaeab124f9a939f71da7e09d299bcb (patch)
treef48e018cc4a02d955366db9b7b31315c6502127e /library
parent4bdad3c21a1461bed6e91ef69dd767fa5211f60d (diff)
downloaddotty-cf10e28a54aaeab124f9a939f71da7e09d299bcb.tar.gz
dotty-cf10e28a54aaeab124f9a939f71da7e09d299bcb.tar.bz2
dotty-cf10e28a54aaeab124f9a939f71da7e09d299bcb.zip
Change enumeration members.
Based on the discussion in #1970, enumeration objects now have three public members: - valueOf: Map[Int, E] - withName: Map[String, E] - values: Iterable[E] Also, the variance of case type parameters is now the same as in the corresponding type parameter of the enum class.
Diffstat (limited to 'library')
-rw-r--r--library/src/scala/runtime/EnumValues.scala25
1 files changed, 14 insertions, 11 deletions
diff --git a/library/src/scala/runtime/EnumValues.scala b/library/src/scala/runtime/EnumValues.scala
index 6d2e56cf3..6f9d907b3 100644
--- a/library/src/scala/runtime/EnumValues.scala
+++ b/library/src/scala/runtime/EnumValues.scala
@@ -1,18 +1,21 @@
package scala.runtime
-import scala.collection.immutable.Seq
-import scala.collection.mutable.ResizableArray
+import scala.collection.immutable.Map
+
+class EnumValues[E <: Enum] {
+ private var myMap: Map[Int, E] = Map()
+ private var fromNameCache: Map[String, E] = null
-class EnumValues[E <: Enum] extends ResizableArray[E] {
- private var valuesCache: List[E] = Nil
def register(v: E) = {
- ensureSize(v.enumTag + 1)
- size0 = size0 max (v.enumTag + 1)
- array(v.enumTag) = v
- valuesCache = null
+ require(!myMap.contains(v.enumTag))
+ myMap = myMap.updated(v.enumTag, v)
+ fromNameCache = null
}
- def values: Seq[E] = {
- if (valuesCache == null) valuesCache = array.filter(_ != null).toList.asInstanceOf[scala.List[E]]
- valuesCache
+
+ def fromInt: Map[Int, E] = myMap
+ def fromName: Map[String, E] = {
+ if (fromNameCache == null) fromNameCache = myMap.values.map(v => v.toString -> v).toMap
+ fromNameCache
}
+ def values: Iterable[E] = myMap.values
}