start of a revised disjoint reachability analysis
[IRC.git] / Robust / src / Analysis / Disjoint / RefSrcNode.java
1 package Analysis.DisjointAnalysis;
2
3 import IR.*;
4 import IR.Flat.*;
5 import java.util.*;
6
7 public abstract class ReferenceSourceNode {
8
9   protected HashSet<RefEdge> referencees;
10
11   public ReferenceSourceNode() {
12     referencees = new HashSet<RefEdge>();
13   }
14
15
16   public Iterator<RefEdge> iteratorToReferencees() {
17     return referencees.iterator();
18   }
19
20   public Iterator<RefEdge> iteratorToReferenceesClone() {
21     HashSet<RefEdge> clone = (HashSet<RefEdge>)referencees.clone();
22     return clone.iterator();
23   }
24
25   public int getNumReferencees() {
26     return referencees.size();
27   }
28
29   public void addReferencee( RefEdge edge ) {
30     assert edge != null;
31     referencees.add( edge );
32   }
33
34   public void removeReferencee( RefEdge edge ) {
35     assert edge != null;
36     assert referencees.contains( edge );
37     referencees.remove( edge );
38   }
39
40   public RefEdge getReferenceTo(HeapRegionNode hrn,
41                                       TypeDescriptor type,
42                                       String field) {
43     assert hrn != null;
44
45     Iterator<RefEdge> itrEdge = referencees.iterator();
46     while( itrEdge.hasNext() ) {
47       RefEdge edge = itrEdge.next();
48       if( edge.getDst().equals(hrn) &&
49           edge.typeEquals( type ) &&
50           edge.fieldEquals( field ) ) {
51         return edge;
52       }
53     }
54
55     return null;
56   }
57 }