1 package Analysis.SSJava;
3 import java.util.HashSet;
4 import java.util.Hashtable;
5 import java.util.Iterator;
11 public class SharedStatus {
13 // maps location to its current writing var set and flag
14 Hashtable<Location, Pair<Set<Descriptor>, Boolean>> mapLocation2Status;
16 public SharedStatus() {
17 mapLocation2Status = new Hashtable<Location, Pair<Set<Descriptor>, Boolean>>();
20 private Pair<Set<Descriptor>, Boolean> getStatus(Location loc) {
21 Pair<Set<Descriptor>, Boolean> pair = mapLocation2Status.get(loc);
23 pair = new Pair<Set<Descriptor>, Boolean>(new HashSet<Descriptor>(), new Boolean(false));
24 mapLocation2Status.put(loc, pair);
29 public void addVar(Location loc, Descriptor d) {
30 getStatus(loc).getFirst().add(d);
33 public void removeVar(Location loc, Descriptor d) {
35 Set<Descriptor> dSet = getStatus(loc).getFirst();
36 boolean isClared = getStatus(loc).getSecond().booleanValue();
39 // if (dSet.isEmpty() && !isClared) {
40 // if status has empty descriptor set and 'false' status, remove it!
41 // mapLocation2Status.remove(loc);
46 public String toString() {
47 return mapLocation2Status.toString();
50 public Set<Location> getLocationSet() {
51 return mapLocation2Status.keySet();
54 public void merge(SharedStatus inState) {
55 Set<Location> keySet = inState.getLocationSet();
56 for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
57 Location inLoc = (Location) iterator.next();
59 Pair<Set<Descriptor>, Boolean> inPair = inState.getStatus(inLoc);
60 Pair<Set<Descriptor>, Boolean> currPair = mapLocation2Status.get(inLoc);
62 if (currPair == null) {
64 new Pair<Set<Descriptor>, Boolean>(new HashSet<Descriptor>(), new Boolean(false));
65 mapLocation2Status.put(inLoc, currPair);
67 mergeSet(currPair.getFirst(), inPair.getFirst());
71 public void mergeSet(Set<Descriptor> curr, Set<Descriptor> in) {
73 // Varset has a special initial value which covers all possible
75 // For the first time of intersection, we can take all previous set
82 public int hashCode() {
83 return mapLocation2Status.hashCode();
86 public Hashtable<Location, Pair<Set<Descriptor>, Boolean>> getMap() {
87 return mapLocation2Status;
90 public boolean equals(Object o) {
91 if (!(o instanceof SharedStatus)) {
94 SharedStatus in = (SharedStatus) o;
95 return in.getMap().equals(mapLocation2Status);
98 public Set<Descriptor> getVarSet(Location loc) {
99 return mapLocation2Status.get(loc).getFirst();
102 public void updateFlag(Location loc, boolean b) {
103 Pair<Set<Descriptor>, Boolean> pair = mapLocation2Status.get(loc);
104 if (pair.getSecond() != b) {
105 mapLocation2Status.put(loc,
106 new Pair<Set<Descriptor>, Boolean>(pair.getFirst(), Boolean.valueOf(b)));
110 public void updateFlag(boolean b) {
111 Set<Location> locKeySet = mapLocation2Status.keySet();
112 for (Iterator iterator = locKeySet.iterator(); iterator.hasNext();) {
113 Location loc = (Location) iterator.next();
114 Pair<Set<Descriptor>, Boolean> pair = mapLocation2Status.get(loc);
115 mapLocation2Status.put(loc,
116 new Pair<Set<Descriptor>, Boolean>(pair.getFirst(), Boolean.valueOf(b)));
121 public boolean getFlag(Location loc) {
122 return mapLocation2Status.get(loc).getSecond().booleanValue();
125 public SharedStatus clone() {
126 SharedStatus newState = new SharedStatus();
127 newState.mapLocation2Status =
128 (Hashtable<Location, Pair<Set<Descriptor>, Boolean>>) mapLocation2Status.clone();