/** * */ package soottocfg.cfg.util; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Queue; import org.jgrapht.DirectedGraph; import org.jgrapht.Graphs; import com.google.common.base.Preconditions; /** * @author schaef * */ public class BfsIterator<V> implements Iterator<V> { private final Iterator<V> listIterator; private final List<V> elements; /** * Requires that g has a unique source. * @param g */ public BfsIterator(DirectedGraph<V, ?> g) { elements = createOrderedVertexList(g, GraphUtil.getSource(g)); listIterator = elements.iterator(); } public BfsIterator(DirectedGraph<V, ?> g, V startPos) { Preconditions.checkArgument(g.containsVertex(startPos)); elements = createOrderedVertexList(g, startPos); listIterator = elements.iterator(); } public List<V> getElements() { return new LinkedList<V>(elements); } private List<V> createOrderedVertexList(DirectedGraph<V, ?> graph, V start) { Queue<V> todo = new LinkedList<V>(); List<V> visited = new LinkedList<V>(); todo.add(start); while (!todo.isEmpty()) { V current = todo.poll(); visited.add(current); for (V suc : Graphs.successorListOf(graph, current)) { if (!todo.contains(suc) && !visited.contains(suc)) { todo.add(suc); } } } return visited; } @Override public boolean hasNext() { return listIterator.hasNext(); } @Override public V next() { return listIterator.next(); } @Override public void remove() { throw new UnsupportedOperationException("remove"); } }