Skip to content

Commit cb7aa84

Browse files
committed
Specialized traits design draft
1 parent 01288d2 commit cb7aa84

File tree

1 file changed

+142
-0
lines changed

1 file changed

+142
-0
lines changed
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
import language.experimental.erasedDefinitions
2+
3+
// Source code
4+
5+
/*inline*/ trait Iterator[T/*: Specialized*/]:
6+
def hasNext: Boolean
7+
def next(): T
8+
9+
/*inline*/ trait ArrayIterator[T/*: Specialized*/](elems: Array[T]) extends Iterator[T]:
10+
private var current = 0
11+
def hasNext: Boolean = current < elems.length
12+
def next(): T = try elems(current) finally current += 1
13+
14+
/*inline*/ trait Iterable[T/*: Specialized*/]:
15+
def iterator: Iterator[T]
16+
def forall(f: T => Unit): Unit =
17+
val it = iterator
18+
while it.hasNext do f(it.next())
19+
20+
/*inline*/ trait Vec[T/*: Specialized*/](elems: Array[T])
21+
extends Iterable[T]:
22+
def length: Int = elems.length
23+
def apply(i: Int): T = elems(i)
24+
def iterator: Iterator[T] = new ArrayIterator[T](elems) {}
25+
26+
// Specialized trait APIs generated from specialization:
27+
28+
trait Iterator_Int extends Iterator[Int]:
29+
def hasNext: Boolean
30+
def next(): Int
31+
32+
trait ArrayIterator_Int extends ArrayIterator[Int], Iterator[Int]
33+
34+
trait Iterable_Int extends Iterable[Int]:
35+
def iterator: Iterator_Int
36+
def forall(f: Int => Unit): Unit
37+
38+
trait Vec_Int extends Vec[Int], Iterable[Int]:
39+
def length: Int
40+
def apply(i: Int): Int
41+
42+
class ArrayIterator_Int$impl(elems: Array[Int]) extends ArrayIterator_Int
43+
, ArrayIterator[Int](elems): // snd parent not needed in actual translation
44+
private var current = 0
45+
override def hasNext: Boolean =
46+
current < elems.length
47+
override def next(): Int =
48+
try elems(current) finally current += 1
49+
50+
class Vec_Int$impl(elems: Array[Int]) extends Vec_Int
51+
, Vec[Int](elems): // snd parent not needed in actual translation
52+
override def iterator: Iterator_Int =
53+
new ArrayIterator_Int$impl(elems).asInstanceOf
54+
// cast needed since the compiler does not not know that Iterable[Int] = Iterable_Int
55+
// after erasure. No cast would be needed in the actual translation.
56+
57+
override def forall(f: Int => Unit): Unit =
58+
val it = iterator
59+
while it.hasNext do f(it.next())
60+
override def length: Int = elems.length
61+
override def apply(i: Int): Int = elems(i)
62+
63+
// Inline trait APIs generated from inline traits transform:
64+
object InlineTraitAPIs:
65+
66+
trait Iterator[T]:
67+
def hasNext: Boolean
68+
def next(): T
69+
70+
trait ArrayIterator[T] extends Iterator[T]
71+
72+
trait Iterable[T]:
73+
def iterator: Iterator[T]
74+
def forall(f: T => Unit): Unit
75+
76+
trait Vec[T] extends Iterable[T]:
77+
def length: Int
78+
def apply(i: Int): T
79+
end InlineTraitAPIs
80+
81+
/* Code after erasure: */
82+
object AfterErasure:
83+
84+
trait Function1:
85+
def apply(x: Any): Any
86+
def apply_Int_Unit(x: Int): Unit
87+
88+
trait Iterator:
89+
def hasNext: Boolean
90+
def next(): Any
91+
92+
trait ArrayIterator extends Iterator
93+
94+
trait Iterable:
95+
def iterator: Iterator
96+
def forall(f: Function1): Unit
97+
98+
trait Vec:
99+
def length: Int
100+
def apply(i: Int): Any
101+
102+
trait Iterator_Int extends Iterator:
103+
def hasNext: Boolean
104+
def next(): Int
105+
106+
trait ArrayIterator_Int extends ArrayIterator, Iterator_Int
107+
108+
trait Iterable_Int extends Iterable:
109+
def iterator: Iterator_Int
110+
def forall(f: Function1): Unit
111+
112+
trait Vec_Int extends Vec, Iterable_Int:
113+
def length: Int
114+
def apply(i: Int): Int
115+
116+
class ArrayIterator_Int$impl(elems: Array[Int]) extends ArrayIterator_Int:
117+
private var current = 0
118+
override def hasNext: Boolean =
119+
current < elems.length
120+
override def next(): Int =
121+
try elems(current) finally current += 1
122+
123+
/* Bridges:
124+
override def next(): Any = Int.box(next())
125+
*/
126+
end ArrayIterator_Int$impl
127+
128+
class Vec_Int$impl(elems: Array[Int]) extends Vec_Int:
129+
override def iterator: Iterator_Int =
130+
new ArrayIterator_Int$impl(elems)
131+
override def forall(f: Function1): Unit =
132+
val it = iterator
133+
while it.hasNext do f.apply_Int_Unit(it.next())
134+
override def length: Int = elems.length
135+
override def apply(i: Int): Int = elems(i)
136+
137+
/* Bridges:
138+
override def iterator: Iterator = iterator
139+
override def apply(i: Int): Any = Int.box(apply(i))
140+
*/
141+
end Vec_Int$impl
142+

0 commit comments

Comments
 (0)