From cea243a4fc38dcc8831000d1066e10362df37576 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 8 Feb 2017 21:23:15 +1100 Subject: Implement enum desugaring --- library/src/scala/Enum.scala | 8 ++++++++ library/src/scala/runtime/EnumValues.scala | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 library/src/scala/Enum.scala create mode 100644 library/src/scala/runtime/EnumValues.scala (limited to 'library') 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 + } +} -- cgit v1.2.3