-
Notifications
You must be signed in to change notification settings - Fork 6
/
ForLoops.scala
84 lines (81 loc) · 1.69 KB
/
ForLoops.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package scalaxy; package rewrites
import macros._
import matchers._
//import scala.reflect.mirror._
object ForLoops {
def simpleForeachUntil[U](start: Int, end: Int, body: U) = replace(
for (i <- start until end)
body,
{
var ii = start
while (ii < end) {
val i = ii
body
ii = ii + 1
}
}
)
def simpleForeachTo[U](start: Int, end: Int, body: U) = replace(
for (i <- start to end) body,
{
var ii = start
while (ii <= end) {
val i = ii
body
ii = ii + 1
}
}
)
def rgForeachUntilBy[U](start: Int, end: Int, step: Int, body: U) =
when(
for (i <- start until end by step)
body
)(
step
) {
case Seq(PositiveConstant(_)) =>
replacement {
var ii = start
while (ii < end) {
val i = ii
body
ii = ii + step
}
}
case Seq(NegativeConstant(_)) =>
replacement {
var ii = start
while (ii > end) {
val i = ii
body
ii = ii - step
}
}
case _ =>
warning("Cannot optimize : step is not constant")
}
/*
def simpleForeachUntil[U](start: Int, end: Int, body: Int => U) = replace(
for (i <- start until end) body(i),
{
var ii = start
while (ii < end) {
val i = ii
body(i)
ii = ii + 1
}
}
)
def simpleForeachTo[U](start: Int, end: Int, body: Int => U) = replace(
for (i <- start to end) body(i),
{
var ii = start
while (ii <= end) {
val i = ii
body(i)
ii = ii + 1
}
}
)
*/
}