hide IteratorPlusOne constructor

git-svn-id: https://wala.svn.sourceforge.net/svnroot/wala/trunk@1706 f5eafffb-2e1d-0410-98e4-8ec43c5233c4
This commit is contained in:
sjfink 2007-08-31 23:50:48 +00:00
parent 43e0a28d9e
commit d604c4c99e
3 changed files with 13 additions and 10 deletions

View File

@ -253,7 +253,7 @@ public abstract class AbstractCFG implements ControlFlowGraph, Constants {
return result.iterator();
} else {
if (number > 0 && fallThru.get(number - 1)) {
return new IteratorPlusOne<IBasicBlock>(normalEdgeManager.getPredNodes(N), getNode(number - 1));
return IteratorPlusOne.make(normalEdgeManager.getPredNodes(N), getNode(number - 1));
} else {
return normalEdgeManager.getPredNodes(N);
}
@ -319,7 +319,7 @@ public abstract class AbstractCFG implements ControlFlowGraph, Constants {
private Iterator<IBasicBlock> iterateExceptionalSuccessors(int number) {
if (exceptionalEdgeManager.hasAnySuccessor(number)) {
if (exceptionalToExit.get(number)) {
return new IteratorPlusOne<IBasicBlock>(exceptionalEdgeManager.getSuccNodes(number), exit());
return IteratorPlusOne.make(exceptionalEdgeManager.getSuccNodes(number), exit());
} else {
return exceptionalEdgeManager.getSuccNodes(number);
}
@ -356,7 +356,7 @@ public abstract class AbstractCFG implements ControlFlowGraph, Constants {
} else {
int number = getNumber(N);
if (number > 0 && fallThru.get(number - 1)) {
return new IteratorPlusOne<IBasicBlock>(normalEdgeManager.getPredNodes(N), getNode(number - 1));
return IteratorPlusOne.make(normalEdgeManager.getPredNodes(N), getNode(number - 1));
} else {
return normalEdgeManager.getPredNodes(N);
}
@ -368,11 +368,11 @@ public abstract class AbstractCFG implements ControlFlowGraph, Constants {
if (normalToExit.get(number)) {
return new IteratorPlusTwo<IBasicBlock>(normalEdgeManager.getSuccNodes(number), getNode(number + 1), exit());
} else {
return new IteratorPlusOne<IBasicBlock>(normalEdgeManager.getSuccNodes(number), getNode(number + 1));
return IteratorPlusOne.make(normalEdgeManager.getSuccNodes(number), getNode(number + 1));
}
} else {
if (normalToExit.get(number)) {
return new IteratorPlusOne<IBasicBlock>(normalEdgeManager.getSuccNodes(number), exit());
return IteratorPlusOne.make(normalEdgeManager.getSuccNodes(number), exit());
} else {
return normalEdgeManager.getSuccNodes(number);
}
@ -381,7 +381,7 @@ public abstract class AbstractCFG implements ControlFlowGraph, Constants {
private Iterator<IBasicBlock> iterateNormalSuccessorsWithoutExit(int number) {
if (fallThru.get(number)) {
return new IteratorPlusOne<IBasicBlock>(normalEdgeManager.getSuccNodes(number), getNode(number + 1));
return IteratorPlusOne.make(normalEdgeManager.getSuccNodes(number), getNode(number + 1));
} else {
return normalEdgeManager.getSuccNodes(number);
}

View File

@ -193,7 +193,7 @@ public class TwoExitCFG implements ControlFlowGraph {
* @see com.ibm.wala.util.graph.NodeManager#iterateNodes()
*/
public Iterator<IBasicBlock> iterator() {
return new IteratorPlusOne<IBasicBlock>(delegate.iterator(), exceptionalExit);
return IteratorPlusOne.make(delegate.iterator(), exceptionalExit);
}
/*
@ -273,7 +273,7 @@ public class TwoExitCFG implements ControlFlowGraph {
return EmptyIterator.instance();
} else if (exceptionalPred.get(bb.getNumber())) {
if (normalPred.get(bb.getNumber())) {
return new IteratorPlusOne<IBasicBlock>(delegate.getSuccNodes(N), exceptionalExit);
return IteratorPlusOne.make(delegate.getSuccNodes(N), exceptionalExit);
} else {
return new SubstitutionIterator(delegate.getSuccNodes(N));
}

View File

@ -13,18 +13,21 @@ package com.ibm.wala.util;
import java.util.Iterator;
/**
*
* A utility to efficiently compose an iterator and a singleton
*
* @author sfink
*/
public class IteratorPlusOne<T> implements Iterator<T> {
public static <T> IteratorPlusOne<T> make(Iterator<? extends T> it, T xtra) {
return new IteratorPlusOne<T>(it, xtra);
}
private final Iterator<? extends T> it;
// the following field will be nulled out after visiting xtra.
private T xtra;
public IteratorPlusOne(Iterator<? extends T> it, T xtra) {
private IteratorPlusOne(Iterator<? extends T> it, T xtra) {
this.it = it;
this.xtra = xtra;
}