add another class
[IRC.git] / Robust / src / Analysis / TaskStateAnalysis / TaskQueueIterator.java
1 package Analysis.TaskStateAnalysis;
2 import IR.*;
3 import IR.Tree.*;
4 import IR.Flat.*;
5 import java.util.*;
6
7 public class TaskQueueIterator {
8     TaskQueue tq;
9     int index;
10     FlagTagState fts;
11     FlagTagState ftsarray[];
12     Hashtable<TempDescriptor, TagState> tsarray;
13     Hashtable<TempDescriptor, Integer> tsindexarray;
14     Iterator<FlagTagState> itarray[];
15     boolean needit;
16     boolean needinit;
17
18     public TaskQueueIterator(TaskQueue tq, int index, FlagTagState fts) {
19         this.tq=tq;
20         this.index=index;
21         this.fts=fts;
22         this.ftsarray=new FlagTagState[tq.numParameters()];
23         this.ftsarray[index]=fts;
24         this.tsarray=new Hashtable<TempDescriptor, TagState>();
25         this.tsindexarray=new Hashtable<TempDescriptor, Integer>();
26         this.itarray=(Iterator<FlagTagState>[]) new Iterator[tq.numParameters()];
27         needit=false;
28         needinit=true;
29         init();
30     }
31     
32     private void init() {
33         for(int i=ftsarray.length-1;i>=0;i--) {
34             if (i!=index)
35                 itarray[i]=tq.parameterset[i].iterator();
36             VarDescriptor vd=tq.task.getParameter(i);
37             TagExpressionList tel=tq.task.getTag(vd);
38             for(int j=0;j<tel.numTags();j++) {
39                 TempDescriptor tmp=tel.getTemp(j);
40                 if (!tsindexarray.containsKey(tmp)) {
41                     tsindexarray.put(tmp, new Integer(i));
42                 }
43             }
44         }
45     }
46
47     public boolean hasNext() {
48         TaskDescriptor td=tq.task;
49         int i;
50         if (needinit) {
51             i=ftsarray.length-1;
52             if (i!=index)
53                 ftsarray[i]=itarray[i].next();
54         } else {
55             i=0;
56         }
57
58         objloop:
59         for(;i<ftsarray.length;i++) {
60             FlagState currfs=ftsarray[i].fs;
61             VarDescriptor vd=td.getParameter(i);
62             TagExpressionList tel=td.getTag(vd);
63             int j;
64             if (needinit) {
65                 j=tel.numTags()>0?tel.numTags()-1:0;
66                 needinit=false;
67             } else
68                 j=0;
69             tagloop:
70             for(;j<tel.numTags();j++) {
71                 TempDescriptor tmp=tel.getTemp(j);
72                 TagState currtag=tsarray.get(tmp);
73                 String type=tel.getType(j);
74
75                 if (tsindexarray.get(tmp).intValue()==i) {
76                     //doing the assignment right here!!!
77                     Vector<FlagTagState> possts=tq.map.get(currfs);
78                     int index=0;
79                     if (currtag!=null)
80                         index=possts.indexOf(new FlagTagState(currtag,currfs));
81                     if (needit) {
82                         index++;
83                         needit=false;
84                     }
85                     for(int k=index;k<possts.size();k++) {
86                         FlagTagState posstag=possts.get(k);
87                         if (posstag.ts.getTag().getSymbol().equals(type)) {
88                             tsarray.put(tmp, posstag.ts);
89                             if (j==0) {
90                                 if (i==0) {
91                                     //We are done!
92                                     return true;
93                                 } else {
94                                     //Backtrack on objects
95                                     i-=2;
96                                     continue objloop;
97                                 }
98                             } else {
99                                 //Backtrack on tags
100                                 j-=2;
101                                 continue tagloop;
102                             }
103                         }
104                     }
105                     //couldn't find a tag
106                     tsarray.put(tmp, null);
107                     needit=true;
108                 } else {
109                     //check tag compatibility
110                     if (!currtag.containsFS(currfs)) {
111                         //incompatible tag set by previous level
112                         //need to increment object state
113                         needit=true;
114                         break;
115                     }
116                 }
117             }
118             if (index==i) {
119                 continue;
120             }
121             if (needit) {
122                 if (itarray[i].hasNext()) {
123                     ftsarray[i]=itarray[i].next();
124                     needit=false;
125                     i-=1;
126                     continue objloop; //backtrack and fix up everything
127                 } else {
128                     itarray[i]=tq.parameterset[i].iterator();//keep going backwards
129                 }
130             } else {
131                 throw new Error();
132             }
133         }
134         return false;
135     }
136
137     public FlagTagState getFTS(int index) {
138         return ftsarray[index];
139     }
140
141     public TagState getTS(TempDescriptor tmp) {
142         return tsarray.get(tmp);
143     }
144     
145     public void next() {
146         needit=true;
147     }
148 }