/** * */ package soottocfg.cfg.util; import java.util.HashSet; import java.util.Set; import org.jgrapht.DirectedGraph; import org.jgrapht.Graphs; /** * @author schaef * */ public class CategorizeEdges<V, E> { private final DirectedGraph<V, E> graph; private final Set<V> visited = new HashSet<V>(); private final Tree<V> traversalTree = new Tree<V>(); private final Set<E> forwardEdges = new HashSet<E>(); private final Set<E> backwardEdges = new HashSet<E>(); private final Set<E> crossEdges = new HashSet<E>(); public CategorizeEdges(DirectedGraph<V, E> g, V root) { graph = g; dfs(root); } public Set<E> getForwardEdges() { return forwardEdges; } public Set<E> getBackwardEdges() { return backwardEdges; } public Set<E> getCrossEdges() { return crossEdges; } private void dfs(V vertex) { visited.add(vertex); for (V suc : Graphs.successorListOf(graph, vertex)) { if (!visited.contains(suc)) { traversalTree.addEdge(vertex, suc); dfs(suc); } else { if (traversalTree.isAncestor(vertex, suc)) { backwardEdges.add(graph.getEdge(vertex, suc)); } else if (traversalTree.isDescendant(vertex, suc)) { forwardEdges.add(graph.getEdge(vertex, suc)); } else { crossEdges.add(graph.getEdge(vertex, suc)); } } } } }