@@ -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