@@ -19,8 +19,61 @@ object Macro {
19
19
}
20
20
}
21
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 = (~ 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
22
46
}
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
+ }
23
63
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
+ }
24
77
}
25
78
26
79
private class UnrolledRange (start : Int , end : Int ) {
0 commit comments