aboutsummaryrefslogtreecommitdiff
path: root/library
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2017-02-08 21:23:15 +1100
committerMartin Odersky <odersky@gmail.com>2017-04-04 13:28:44 +0200
commitcea243a4fc38dcc8831000d1066e10362df37576 (patch)
tree38bf1795d9c0d4ce973e405b842d80cec40ae215 /library
parent41d83d42650d0c0b54c47c1a9043d0b92315aa4e (diff)
downloaddotty-cea243a4fc38dcc8831000d1066e10362df37576.tar.gz
dotty-cea243a4fc38dcc8831000d1066e10362df37576.tar.bz2
dotty-cea243a4fc38dcc8831000d1066e10362df37576.zip
Implement enum desugaring
Diffstat (limited to 'library')
-rw-r--r--library/src/scala/Enum.scala8
-rw-r--r--library/src/scala/runtime/EnumValues.scala18
2 files changed, 26 insertions, 0 deletions
diff --git a/library/src/scala/Enum.scala b/library/src/scala/Enum.scala
new file mode 100644
index 000000000..7d2eefb3d
--- /dev/null
+++ b/library/src/scala/Enum.scala
@@ -0,0 +1,8 @@
+package scala
+
+/** A base trait of all enum classes */
+trait Enum {
+
+ /** A number uniquely identifying a case of an enum */
+ def enumTag: Int
+}
diff --git a/library/src/scala/runtime/EnumValues.scala b/library/src/scala/runtime/EnumValues.scala
new file mode 100644
index 000000000..6d2e56cf3
--- /dev/null
+++ b/library/src/scala/runtime/EnumValues.scala
@@ -0,0 +1,18 @@
+package scala.runtime
+
+import scala.collection.immutable.Seq
+import scala.collection.mutable.ResizableArray
+
+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
+ }
+ def values: Seq[E] = {
+ if (valuesCache == null) valuesCache = array.filter(_ != null).toList.asInstanceOf[scala.List[E]]
+ valuesCache
+ }
+}