Skip to content

Commit 4bdade6

Browse files
committed
Add step by step example
1 parent e6a396e commit 4bdade6

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,61 @@ object Macro {
1919
}
2020
}
2121
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 = (~arrRef)(i)
34+
(~f)(element)
35+
i += 1
36+
}
37+
}
38+
39+
def foreach2(arrRef: Expr[Array[Int]], f: Expr[Int => Unit]): Expr[Unit] = '{
40+
val size = (~arrRef).length
41+
var i = 0
42+
while (i < size) {
43+
val element = (~arrRef)(i)
44+
~f('(element)) // Use AppliedFuntion
45+
i += 1
2246
}
47+
}
48+
49+
def foreach3(arrRef: Expr[Array[Int]], f: Expr[Int => Unit]): Expr[Unit] = '{
50+
val size = (~arrRef).length
51+
var i = 0
52+
assert(size % 3 == 0) // for simplicity of the implementation
53+
while (i < size) {
54+
val element1 = (~arrRef)(i)
55+
~f('(element1))
56+
val element2 = (~arrRef)(i + 1)
57+
~f('(element2))
58+
val element3 = (~arrRef)(i + 3)
59+
~f('(element3))
60+
i += 3
61+
}
62+
}
2363

64+
def foreach4(arrRef: Expr[Array[Int]], f: Expr[Int => Unit], unrollSize: Int): Expr[Unit] = '{
65+
val size = (~arrRef).length
66+
var i = 0
67+
assert(size % ~unrollSize.toExpr == 0) // for simplicity of the implementation
68+
while (i < size) {
69+
~{
70+
@tailrec def loop(j: Int, acc: Expr[Unit]): Expr[Unit] =
71+
if (j >= 0) loop(j - 1, '{ (~f)(i + ~j.toExpr); ~acc })
72+
else acc
73+
loop(unrollSize - 1, '())
74+
}
75+
i += ~unrollSize.toExpr
76+
}
2477
}
2578

2679
private class UnrolledRange(start: Int, end: Int) {

0 commit comments

Comments
 (0)