Skip to content

Commit f04a07d

Browse files
committed
Adapt generic tests to model modified enum values scheme
1 parent 50e3d4a commit f04a07d

File tree

5 files changed

+35
-21
lines changed

5 files changed

+35
-21
lines changed

tests/run/generic/Color.scala

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,16 @@ import Shapes._
1010
*/
1111
sealed trait Color extends Enum
1212

13-
object Color extends EnumValues[Color](3) {
13+
object Color {
14+
15+
private val $values = new EnumValues[Color]
16+
def valueOf: Int => Color = $values
17+
def values = $values.values
1418

1519
private def $new(tag: Int, name: String) = new Color {
1620
def enumTag = tag
1721
override def toString = name
18-
registerEnumValue(this)
22+
$values.register(this)
1923
}
2024

2125
val Red: Color = $new(0, "Red")
@@ -25,6 +29,6 @@ object Color extends EnumValues[Color](3) {
2529
implicit val ColorShape: Color `shaped` EnumValue[Color] =
2630
new (Color `shaped` EnumValue[Color]) {
2731
def toShape(x: Color) = EnumValue(x.enumTag)
28-
def fromShape(x: EnumValue[Color]) = Color.value(x.tag)
32+
def fromShape(x: EnumValue[Color]) = Color.valueOf(x.tag)
2933
}
30-
}
34+
}

tests/run/generic/Enum.scala

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
11
package generic
22

33
import Shapes.Singleton
4+
import scala.collection.mutable.ResizableArray
5+
import scala.collection.immutable.Seq
46

57
trait Enum {
68
def enumTag: Int
79
}
810

911
trait FiniteEnum extends Enum
1012

11-
abstract class EnumValues[E <: Enum](numVals: Int) {
12-
private var myValues = new Array[AnyRef](numVals)
13-
14-
def registerEnumValue(v: E) =
15-
myValues(v.enumTag) = v
16-
17-
def value: IndexedSeq[E] = (myValues: IndexedSeq[AnyRef]).asInstanceOf[IndexedSeq[E]]
13+
class EnumValues[E <: Enum] extends ResizableArray[E] {
14+
private var valuesCache: Seq[E] = Nil
15+
def register(v: E) = {
16+
ensureSize(v.enumTag + 1)
17+
array(v.enumTag) = v
18+
valuesCache = null
19+
}
20+
def values: Seq[E] = {
21+
if (valuesCache == null) valuesCache = array.filter(_ != null).toList.asInstanceOf[scala.List[E]]
22+
valuesCache
23+
}
1824
}

tests/run/generic/List.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ object List0 {
4646
}
4747
}
4848

49-
/** enum List[T] {
49+
/** enum List[+T] {
5050
* case Cons(x: T, xs: List[T])
5151
* case Nil extends List[Nothing]
5252
* }

tests/run/generic/SearchResult.scala

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ import Shapes._
1111
*/
1212
sealed trait SearchResult extends Enum
1313

14-
object SearchResult extends EnumValues[SearchResult](3) {
14+
object SearchResult extends {
15+
16+
private val $values = new EnumValues[SearchResult]
17+
def valueOf: Int => SearchResult = $values
18+
def values = $values.values
1519

1620
private def $new(tag: Int, name: String) = new SearchResult {
1721
def enumTag = tag
1822
override def toString = name
19-
registerEnumValue(this)
23+
$values.register(this)
2024
}
2125

2226
abstract case class Success(result: Color) extends SearchResult {
@@ -31,8 +35,8 @@ object SearchResult extends EnumValues[SearchResult](3) {
3135
}
3236
}
3337

34-
val Diverging = $new(1, "Diverging")
35-
val NoMatch = $new(2, "NoMatch")
38+
val Diverging: SearchResult = $new(1, "Diverging")
39+
val NoMatch: SearchResult = $new(2, "NoMatch")
3640

3741
abstract case class Ambiguous(alt1: SearchResult, alt2: SearchResult) extends SearchResult {
3842
def enumTag = 3
@@ -58,7 +62,7 @@ object SearchResult extends EnumValues[SearchResult](3) {
5862
def fromShape(x: Sum[Success, Sum[Ambiguous, EnumValue[SearchResult]]]): SearchResult = x match {
5963
case Fst(s) => s
6064
case Snd(Fst(a)) => a
61-
case Snd(Snd(ev)) => value(ev.tag)
65+
case Snd(Snd(ev)) => valueOf(ev.tag)
6266
}
6367
}
64-
}
68+
}

tests/run/generic/Tree.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ package generic
22

33
import Shapes._
44

5-
/** enum Tree[TS] {
5+
/** enum Tree[T] {
66
* case True extends Tree[Boolean]
77
* case False extends Tree[Boolean]
88
* case Zero extends Tree[Int]
99
* case Succ(n: Tree[Int]) extends Tree[Int]
1010
* case Pred(n: Tree[Int]) extends Tree[Int]
1111
* case IsZero(n: Tree[Int]) extends Tree[Boolean]
12-
* case If(cond: Boolean, thenp: Tree[T], elsep: Tree[T]) extends Tree[T]
12+
* case If(cond: Boolean, thenp: Tree[T], elsep: Tree[T])
1313
* }
1414
*/
1515
sealed trait Tree[TR] extends Enum
@@ -110,4 +110,4 @@ object Tree {
110110
case Snd(Snd(_if)) => _if
111111
}
112112
}
113-
}
113+
}

0 commit comments

Comments
 (0)