a)Fix prefetch analysis bugs
[IRC.git] / Robust / src / Analysis / Prefetch / PrefetchPair.java
1 package Analysis.Prefetch;
2 import IR.Flat.*;
3 import java.util.*;
4 import IR.*;
5
6 public class PrefetchPair {
7         public TempDescriptor base;
8         public ArrayList<Descriptor> desc;
9
10         public PrefetchPair(){
11     base = new TempDescriptor("");
12                 desc = new ArrayList<Descriptor>();
13         }
14
15         public PrefetchPair(TempDescriptor t) {
16                 base = t;
17                 desc = null;
18         }
19
20         public PrefetchPair(TempDescriptor t, Descriptor f) {
21                 base = t;
22                 if (desc == null) 
23                         desc = new ArrayList<Descriptor>();
24                 desc.add(f);
25         }
26
27         public PrefetchPair(TempDescriptor t, ArrayList<Descriptor> descriptor) {
28                 base = t;
29                 if(desc == null){
30                         desc = new ArrayList<Descriptor>();
31                 }
32                 desc.addAll(descriptor);
33         }
34
35         public TempDescriptor getBase() {
36                 return base;
37         }
38
39         public Descriptor getDescAt(int index) {
40                 return desc.get(index);
41         }
42
43         public ArrayList<Descriptor> getDesc() {
44                 return desc;
45         }
46
47         public FieldDescriptor getFieldDesc(int index) {
48                 return (FieldDescriptor) desc.get(index);
49         }
50
51         public IndexDescriptor getIndexDesc(int index) {
52                 return (IndexDescriptor) desc.get(index);
53         }
54
55         public int hashCode() {
56                 int hashcode = base.toString().hashCode();
57                 if(desc != null) {
58                         ListIterator li = desc.listIterator();
59                         while(li.hasNext()) {
60                                 hashcode = hashcode ^ li.next().toString().hashCode();
61                         }
62                 }
63                 return hashcode;
64         }
65
66         public String toString() {
67                 String label= getBase().toString();
68                 if(getDesc() == null)
69                         return label;
70                 ListIterator it=getDesc().listIterator();
71                 for(;it.hasNext();) {
72                         Object o = it.next();
73                         if(o instanceof FieldDescriptor) {
74                                 FieldDescriptor fd = (FieldDescriptor) o;
75                                 label+="."+ fd.toString();
76                         } else { 
77                                 IndexDescriptor id = (IndexDescriptor) o;
78                                 label+= id.toString();
79                         }
80                 }
81                 return label;
82         }
83
84         public boolean equals(Object o) {
85                 if(o instanceof PrefetchPair) {
86                         PrefetchPair pp = (PrefetchPair) o;
87                         if(base != pp.base) {
88                                 return false;
89                         }
90                         if(desc == null && pp.desc == null) {
91                                 return true;
92                         } else if(desc != null && pp.desc != null) {
93                                 if(desc.equals((ArrayList<Descriptor>)pp.desc)) {
94                                         return true;
95                                 } 
96                         } else {
97                                 return false;
98                         }
99                 }
100                 return false;
101         }
102
103         public Object clone() {
104                 PrefetchPair newpp = new PrefetchPair();
105     ArrayList<TempDescriptor> td =  null;
106                 newpp.base = this.base;
107                 for(int i = 0; i < this.desc.size(); i++) {
108                         Object o = desc.get(i);
109                         if(o instanceof FieldDescriptor) {
110                                 newpp.desc.add((FieldDescriptor) o);
111                         } else {
112         td = new ArrayList<TempDescriptor>();
113                                 for(int j = 0; j < ((IndexDescriptor)o).tddesc.size(); j++) {
114                                         td.add(((IndexDescriptor)o).getTempDescAt(j));
115                                 }
116                                 IndexDescriptor idesc = new IndexDescriptor();
117                                 idesc.tddesc = td;
118                                 idesc.offset = ((IndexDescriptor)o).offset;
119                                 newpp.desc.add(idesc);
120                         }
121                 }
122                 return newpp;
123         }
124 }