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