package Analysis.SSJava;
+import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.List;
import java.util.Set;
import IR.Descriptor;
public class NodeTupleSet {
- Set<NTuple<Descriptor>> set;
+ private ArrayList<NTuple<Descriptor>> list;
+
+ private ArrayList<NTuple<Location>> globalLocTupleList;
+
+ private NTuple<Descriptor> baseDescTuple;
public NodeTupleSet() {
- set = new HashSet<NTuple<Descriptor>>();
+ list = new ArrayList<NTuple<Descriptor>>();
+ globalLocTupleList = new ArrayList<NTuple<Location>>();
}
public void addTuple(NTuple<Descriptor> tuple) {
- // need to add additional elements because we need to create edges even from
- // the base
- // for example, if we have input <a,b,c>, we need to add additional element
- // <a,b> and <a> to the set
-
- NTuple<Descriptor> cur = new NTuple<Descriptor>();
- for (int i = 0; i < tuple.size(); i++) {
- Descriptor d = tuple.get(i);
- cur.add(d);
- set.add(new NTuple<Descriptor>(cur));
+ for (Iterator iterator = list.iterator(); iterator.hasNext();) {
+ NTuple<Descriptor> t = (NTuple<Descriptor>) iterator.next();
+ if (t.equals(tuple)) {
+ return;
+ }
}
- set.add(tuple);
+ list.add(tuple);
+ }
+
+ public void setMethodInvokeBaseDescTuple(NTuple<Descriptor> in) {
+ baseDescTuple = in;
+ }
+
+ public NTuple<Descriptor> getBaseDesc() {
+ return baseDescTuple;
+ }
+
+ public void addGlobalFlowTuple(NTuple<Location> tuple) {
+ globalLocTupleList.add(tuple);
+ }
+
+ public void addGlobalFlowTupleSet(ArrayList<NTuple<Location>> in) {
+ globalLocTupleList.addAll(in);
+ }
+
+ public Iterator<NTuple<Location>> globalIterator() {
+ return globalLocTupleList.iterator();
+ }
+
+ public void removeTuple(NTuple<Descriptor> tuple) {
+ list.remove(tuple);
}
public Iterator<NTuple<Descriptor>> iterator() {
- return set.iterator();
+ return list.iterator();
}
public String toString() {
- return set.toString();
+ String str = list.toString();
+
+ if (globalLocTupleList.size() > 0) {
+ str += " GlobalFlow=" + globalLocTupleList.toString();
+ }
+
+ return str;
}
+ public Set<NTuple<Descriptor>> getSet() {
+ Set<NTuple<Descriptor>> set = new HashSet<NTuple<Descriptor>>();
+ set.addAll(list);
+ return set;
+ }
+
+ public void addTupleSet(NodeTupleSet in) {
+ if (in != null) {
+ for (Iterator iterator = in.iterator(); iterator.hasNext();) {
+ NTuple<Descriptor> inTuple = (NTuple<Descriptor>) iterator.next();
+ addTuple(inTuple);
+ }
+ }
+ }
+
+ public int size() {
+ return list.size();
+ }
+
+ public void clear() {
+ list.clear();
+ }
+
+ public int globalLocTupleSize() {
+ return globalLocTupleList.size();
+ }
+
+ private void setGlobalLocTupleList(ArrayList<NTuple<Location>> in) {
+ globalLocTupleList = in;
+ }
+
+ public ArrayList<NTuple<Location>> getGlobalLocTupleSet() {
+ return globalLocTupleList;
+ }
+
+ private void setDescTupleList(ArrayList<NTuple<Descriptor>> in) {
+ list = in;
+ }
+
+ public NodeTupleSet clone() {
+ NodeTupleSet set = new NodeTupleSet();
+ set.setDescTupleList((ArrayList<NTuple<Descriptor>>) list.clone());
+ set.setGlobalLocTupleList((ArrayList<NTuple<Location>>) globalLocTupleList.clone());
+ return set;
+ }
}