Skip to content

Commit b949c3a

Browse files
committed
Add tests
1 parent 5131e6a commit b949c3a

File tree

5 files changed

+189
-110
lines changed

5 files changed

+189
-110
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
((arr: scala.Array[scala.Int], f: scala.Function1[scala.Int, scala.Unit]) => {
2+
val size: scala.Int = arr.length
3+
var i: scala.Int = 0
4+
while (i.<(size)) {
5+
val element: scala.Int = arr.apply(i)
6+
f.apply(element)
7+
i = i.+(1)
8+
}
9+
})
10+
11+
((arr: scala.Array[scala.Predef.String], f: scala.Function1[scala.Predef.String, scala.Unit]) => {
12+
val size: scala.Int = arr.length
13+
var i: scala.Int = 0
14+
while (i.<(size)) {
15+
val element: java.lang.String = arr.apply(i)
16+
f.apply(element)
17+
i = i.+(1)
18+
}
19+
})
20+
21+
((arr: scala.Array[scala.Predef.String], f: scala.Function1[scala.Predef.String, scala.Unit]) => {
22+
val size: scala.Int = arr.length
23+
var i: scala.Int = 0
24+
while (i.<(size)) {
25+
val element: java.lang.String = arr.apply(i)
26+
f.apply(element)
27+
i = i.+(1)
28+
}
29+
})
30+
31+
((arr: scala.Array[scala.Int]) => {
32+
val size: scala.Int = arr.length
33+
var i: scala.Int = 0
34+
while (i.<(size)) {
35+
val element: scala.Int = arr.apply(i)
36+
37+
((i: scala.Int) => java.lang.System.out.println(i)).apply(element)
38+
i = i.+(1)
39+
}
40+
})
41+
42+
((arr: scala.Array[scala.Int], f: scala.Function1[scala.Int, scala.Unit]) => {
43+
val size: scala.Int = arr.length
44+
var i: scala.Int = 0
45+
dotty.DottyPredef.assert(size.%(3).==(0))
46+
while (i.<(size)) {
47+
f.apply(arr.apply(i))
48+
f.apply(arr.apply(i.+(1)))
49+
f.apply(arr.apply(i.+(2)))
50+
i = i.+(3)
51+
}
52+
})
53+
54+
((arr: scala.Array[scala.Int], f: scala.Function1[scala.Int, scala.Unit]) => {
55+
val size: scala.Int = arr.length
56+
var i: scala.Int = 0
57+
dotty.DottyPredef.assert(size.%(4).==(0))
58+
while (i.<(size)) {
59+
f.apply(arr.apply(i.+(0)))
60+
f.apply(arr.apply(i.+(1)))
61+
f.apply(arr.apply(i.+(2)))
62+
f.apply(arr.apply(i.+(3)))
63+
()
64+
i = i.+(4)
65+
}
66+
})
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import scala.annotation.tailrec
2+
import scala.quoted._
3+
4+
object Test {
5+
implicit val toolbox: scala.quoted.Toolbox = dotty.tools.dotc.quoted.Toolbox.make
6+
7+
def main(args: Array[String]): Unit = {
8+
val code1 = '{ (arr: Array[Int], f: Int => Unit) => ~foreach1('(arr), '(f)) }
9+
println(code1.show)
10+
println()
11+
12+
val code1Tpe = '{ (arr: Array[String], f: String => Unit) => ~foreach1Tpe1('(arr), '(f)) }
13+
println(code1Tpe.show)
14+
println()
15+
16+
val code1Tpe2 = '{ (arr: Array[String], f: String => Unit) => ~foreach1Tpe1('(arr), '(f)) }
17+
println(code1Tpe2.show)
18+
println()
19+
20+
val code2 = '{ (arr: Array[Int]) => ~foreach1('(arr), '(i => System.out.println(i))) }
21+
println(code2.show)
22+
println()
23+
24+
val code3 = '{ (arr: Array[Int], f: Int => Unit) => ~foreach3('(arr), '(f)) }
25+
println(code3.show)
26+
println()
27+
28+
val code4 = '{ (arr: Array[Int], f: Int => Unit) => ~foreach4('(arr), '(f), 4) }
29+
println(code4.show)
30+
}
31+
32+
def foreach1(arrRef: Expr[Array[Int]], f: Expr[Int => Unit]): Expr[Unit] = '{
33+
val size = (~arrRef).length
34+
var i = 0
35+
while (i < size) {
36+
val element: Int = (~arrRef)(i)
37+
(~f)(element)
38+
i += 1
39+
}
40+
}
41+
42+
def foreach1Tpe1[T](arrRef: Expr[Array[T]], f: Expr[T => Unit])(implicit t: Type[T]): Expr[Unit] = '{
43+
val size = (~arrRef).length
44+
var i = 0
45+
while (i < size) {
46+
val element: ~t = (~arrRef)(i)
47+
(~f)(element)
48+
i += 1
49+
}
50+
}
51+
52+
def foreach1Tpe2[T: Type](arrRef: Expr[Array[T]], f: Expr[T => Unit]): Expr[Unit] = '{
53+
val size = (~arrRef).length
54+
var i = 0
55+
while (i < size) {
56+
val element: T = (~arrRef)(i)
57+
(~f)(element)
58+
i += 1
59+
}
60+
}
61+
62+
def foreach2(arrRef: Expr[Array[Int]], f: Expr[Int => Unit]): Expr[Unit] = '{
63+
val size = (~arrRef).length
64+
var i = 0
65+
while (i < size) {
66+
val element = (~arrRef)(i)
67+
~f('(element)) // Use AppliedFuntion
68+
i += 1
69+
}
70+
}
71+
72+
def foreach3(arrRef: Expr[Array[Int]], f: Expr[Int => Unit]): Expr[Unit] = '{
73+
val size = (~arrRef).length
74+
var i = 0
75+
assert(size % 3 == 0) // for simplicity of the implementation
76+
while (i < size) {
77+
(~f)((~arrRef)(i))
78+
(~f)((~arrRef)(i + 1))
79+
(~f)((~arrRef)(i + 2))
80+
i += 3
81+
}
82+
}
83+
84+
def foreach4(arrRef: Expr[Array[Int]], f: Expr[Int => Unit], unrollSize: Int): Expr[Unit] = '{
85+
val size = (~arrRef).length
86+
var i = 0
87+
assert(size % ~unrollSize.toExpr == 0) // for simplicity of the implementation
88+
while (i < size) {
89+
~{
90+
@tailrec def loop(j: Int, acc: Expr[Unit]): Expr[Unit] =
91+
if (j >= 0) loop(j - 1, '{ (~f)((~arrRef)(i + ~j.toExpr)); ~acc })
92+
else acc
93+
loop(unrollSize - 1, '())
94+
}
95+
i += ~unrollSize.toExpr
96+
}
97+
}
98+
99+
}
Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
<log> start loop
22
0
3-
2
4-
4
5-
<log> start loop
63
6
7-
8
8-
10
9-
<log> start loop
104
12
11-
14
12-
16
135
<log> start loop
146
18
15-
20
16-
22
17-
<log> start loop
187
24
19-
26
20-
28
21-
<log> start loop
228
30
23-
32
24-
34
259
<log> start loop
2610
36
27-
38
28-
40
11+
42
12+
48
13+
<log> start loop
14+
54
15+
60
16+
66
17+
<log> start loop
18+
72
19+
78
20+
84
21+
<log> start loop
22+
90
23+
96
24+
102
25+
<log> start loop
26+
108
27+
114
28+
120

tests/run/quote-unrolled-foreach/quoted_1.scala

Lines changed: 2 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -12,96 +12,13 @@ object Macro {
1212
var i = 0
1313
while (i < size) {
1414
println("<log> start loop")
15-
~{
16-
for (j <- new UnrolledRange(0, unrollSize)) '{
17-
val element = (~seq)(i + ~j.toExpr)
18-
~f('(element)) // or `(~f)(element)` if `f` should not be inlined
19-
}
20-
}
21-
i += ~unrollSize.toExpr
22-
23-
24-
}
25-
26-
}
27-
28-
29-
def foreach1(arrRef: Expr[Array[Int]], f: Expr[Int => Unit]): Expr[Unit] = '{
30-
val size = (~arrRef).length
31-
var i = 0
32-
while (i < size) {
33-
val element: Int = (~arrRef)(i)
34-
(~f)(element)
35-
i += 1
36-
}
37-
}
38-
39-
def foreach1Tpe1[T](arrRef: Expr[Array[T]], f: Expr[T => Unit])(implicit t: Type[T]): Expr[Unit] = '{
40-
val size = (~arrRef).length
41-
var i = 0
42-
while (i < size) {
43-
val element: ~t = (~arrRef)(i)
44-
(~f)(element)
45-
i += 1
46-
}
47-
}
48-
49-
def foreach1Tpe2[T: Type](arrRef: Expr[Array[T]], f: Expr[T => Unit]): Expr[Unit] = '{
50-
val size = (~arrRef).length
51-
var i = 0
52-
while (i < size) {
53-
val element: T = (~arrRef)(i)
54-
(~f)(element)
55-
i += 1
56-
}
57-
}
58-
59-
def foreach2(arrRef: Expr[Array[Int]], f: Expr[Int => Unit]): Expr[Unit] = '{
60-
val size = (~arrRef).length
61-
var i = 0
62-
while (i < size) {
63-
val element = (~arrRef)(i)
64-
~f('(element)) // Use AppliedFuntion
65-
i += 1
66-
}
67-
}
68-
69-
def foreach3(arrRef: Expr[Array[Int]], f: Expr[Int => Unit]): Expr[Unit] = '{
70-
val size = (~arrRef).length
71-
var i = 0
72-
assert(size % 3 == 0) // for simplicity of the implementation
73-
while (i < size) {
74-
val element1 = (~arrRef)(i)
75-
~f('(element1))
76-
val element2 = (~arrRef)(i + 1)
77-
~f('(element2))
78-
val element3 = (~arrRef)(i + 3)
79-
~f('(element3))
80-
i += 3
81-
}
82-
}
83-
84-
def foreach4(arrRef: Expr[Array[Int]], f: Expr[Int => Unit], unrollSize: Int): Expr[Unit] = '{
85-
val size = (~arrRef).length
86-
var i = 0
87-
assert(size % ~unrollSize.toExpr == 0) // for simplicity of the implementation
88-
while (i < size) {
8915
~{
9016
@tailrec def loop(j: Int, acc: Expr[Unit]): Expr[Unit] =
91-
if (j >= 0) loop(j - 1, '{ (~f)(i + ~j.toExpr); ~acc })
92-
else acc
17+
if (j >= 0) loop(j - 1, '{ ~f('((~seq)(i + ~j.toExpr))); ~acc })
18+
else acc
9319
loop(unrollSize - 1, '())
9420
}
9521
i += ~unrollSize.toExpr
9622
}
9723
}
98-
99-
private class UnrolledRange(start: Int, end: Int) {
100-
def foreach(f: Int => Expr[Unit]): Expr[Unit] = {
101-
@tailrec def loop(i: Int, acc: Expr[Unit]): Expr[Unit] =
102-
if (i >= 0) loop(i - 1, '{ ~f(i); ~acc })
103-
else acc
104-
loop(end - 1, '())
105-
}
106-
}
10724
}

tests/run/quote-unrolled-foreach/quoted_2.scala

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import scala.quoted._
33

44
object Test {
55
def main(args: Array[String]): Unit = {
6-
val arr = Array.tabulate[Int](21)(x => x)
6+
val arr = Array.tabulate[Int](21)(x => 3 * x)
77
Macro.unrolledForeach(3, arr) { (x: Int) =>
88
System.out.println(2 * x)
99
}
@@ -15,14 +15,11 @@ object Test {
1515
var i: Int = 0
1616
while (i < size) {
1717
println("<log> start loop")
18-
val element$1: Int = arr(i)
19-
val x$1: Int = element$1
18+
val x$1: Int = arr(i)
2019
System.out.println(2 * x$1)
21-
val element$2: Int = arr(i + 1)
22-
val x$2: Int = element$2
20+
val x$2: Int = arr(i + 1)
2321
System.out.println(2 * x$2)
24-
val element$3: Int = arr(i + 2)
25-
val x$3: Int = element$3
22+
val x$3: Int = arr(i + 2)
2623
System.out.println(2 * x$3)
2724
i = i + 3
2825
}

0 commit comments

Comments
 (0)