package xsched.analysis.wala.util; import java.util.Iterator; import com.ibm.wala.util.graph.AbstractNumberedGraph; import com.ibm.wala.util.graph.EdgeManager; import com.ibm.wala.util.graph.NodeManager; import com.ibm.wala.util.graph.impl.SparseNumberedEdgeManager; import com.ibm.wala.util.intset.IntSet; public class SimpleGraph<T> extends AbstractNumberedGraph<T> { private final SimpleNodeManager<T> nodeManager; private final SparseNumberedEdgeManager<T> edgeManager; public SimpleGraph() { super(); nodeManager = new SimpleNodeManager<T>(); edgeManager = new SparseNumberedEdgeManager<T>(nodeManager); } public void addAllNodesAndEdges(SimpleGraph<T> other) { this.nodeManager.addAllNodes(other.nodeManager); Iterator<T> nodes = other.iterator(); while(nodes.hasNext()) { T node = nodes.next(); Iterator<T> succs = other.edgeManager.getSuccNodes(node); while(succs.hasNext()) { T succ = succs.next(); edgeManager.addEdge(node, succ); } } } @Override protected EdgeManager<T> getEdgeManager() { return edgeManager; } @Override protected NodeManager<T> getNodeManager() { return nodeManager; } public boolean stateEquals(SimpleGraph<T> other) { if (! this.nodeManager.stateEquals(other.nodeManager)) return false; Iterator<T> nodes = this.iterator(); while(nodes.hasNext()) { T node = nodes.next(); IntSet otherSuccs = other.edgeManager.getSuccNodeNumbers(node); IntSet mySuccs = edgeManager.getSuccNodeNumbers(node); if(mySuccs == null && otherSuccs != null) return false; else if(otherSuccs == null && mySuccs != null) return false; else if(mySuccs != null && otherSuccs != null && ! mySuccs.sameValue(otherSuccs)) return false; } return true; } public String edgesToString() { return edgeManager.toString(); } public String nodesToString() { return nodeManager.toString(); } }