diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstarctBasicBlock.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstarctBasicBlock.java new file mode 100644 index 00000000000..1318698a431 --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstarctBasicBlock.java @@ -0,0 +1,29 @@ +package org.eclipse.cdt.codan.internal.core.cfg; + +import java.util.Iterator; + +import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock; + +public abstract class AbstarctBasicBlock implements IBasicBlock { + static class OneElementIterator implements Iterator { + private T o; + + public OneElementIterator(T o) { + this.o = o; + } + + public boolean hasNext() { + return o != null; + } + + public T next() { + T x = o; + o = null; + return x; + } + + public void remove() { + throw new UnsupportedOperationException(); + } + } +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/JumpNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/JumpNode.java new file mode 100644 index 00000000000..5cc008b0dee --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/JumpNode.java @@ -0,0 +1,63 @@ +package org.eclipse.cdt.codan.internal.core.cfg; + +import java.util.Iterator; + +import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock; +import org.eclipse.cdt.codan.provisional.core.model.cfg.IConnectorNode; +import org.eclipse.cdt.codan.provisional.core.model.cfg.IJumpNode; + +/** + * Plain node has one prev one jump + * + */ +public class JumpNode extends AbstarctBasicBlock implements IJumpNode { + final private IBasicBlock entry; + private IBasicBlock jump; + private boolean backward; + + public JumpNode(IBasicBlock entry, IBasicBlock jump, boolean backward) { + super(); + this.entry = entry; + this.jump = jump; + this.backward = backward; + } + + public Iterator getIncomingIterator() { + return new OneElementIterator(entry); + } + + public Iterator getOutgoingIterator() { + return new OneElementIterator(jump); + } + + public int getIncomingSize() { + return 1; + } + + public int getOutgoingSize() { + return 1; + } + + public IBasicBlock getIncoming() { + return entry; + } + + public IBasicBlock getOutgoing() { + return jump; + } + + public boolean isBackwardArc() { + return backward; + } + + public void setJump(IBasicBlock jump) { + if (!(jump instanceof IConnectorNode)) + throw new IllegalArgumentException("Jump target must be a connection node"); //$NON-NLS-1$ + this.jump = jump; + } + + public void setBackward(boolean backward) { + this.backward = backward; + } + +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/PlainNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/PlainNode.java new file mode 100644 index 00000000000..4f407e45ad6 --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/PlainNode.java @@ -0,0 +1,50 @@ +package org.eclipse.cdt.codan.internal.core.cfg; + +import java.util.Iterator; + +import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock; +import org.eclipse.cdt.codan.provisional.core.model.cfg.IPlainNode; + +/** + * Plain node has one prev one jump + * + */ +public class PlainNode extends AbstarctBasicBlock implements IPlainNode { + final IBasicBlock prev; + IBasicBlock next; + + public PlainNode(IBasicBlock entry, IBasicBlock exit) { + super(); + this.prev = entry; + this.next = exit; + } + + public Iterator getIncomingIterator() { + return new OneElementIterator(prev); + } + + public Iterator getOutgoingIterator() { + return new OneElementIterator(next); + } + + public int getIncomingSize() { + return 1; + } + + public int getOutgoingSize() { + return 1; + } + + public IBasicBlock getIncoming() { + return prev; + } + + public IBasicBlock getOutgoing() { + return next; + } + + public void setOutgoing(IBasicBlock exit) { + if (this.next != null) throw new IllegalArgumentException("Cannot modify already exiting connector"); //$NON-NLS-1$ + this.next = exit; + } +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/StartNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/StartNode.java new file mode 100644 index 00000000000..34d037fc09a --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/StartNode.java @@ -0,0 +1,65 @@ +package org.eclipse.cdt.codan.internal.core.cfg; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock; +import org.eclipse.cdt.codan.provisional.core.model.cfg.IStartNode; + +/** + * Start node has no prev, one jump and it is connect to function exits + * + */ +public class StartNode extends AbstarctBasicBlock implements IStartNode { + private IBasicBlock next; + private List exitNodes; + + public StartNode(IBasicBlock next, Collection exitNodes) { + super(); + this.next = next; + if (exitNodes != null) this.exitNodes = Collections.unmodifiableList(new ArrayList(exitNodes)); + else this.exitNodes = null; // incomplete node + } + + @SuppressWarnings("unchecked") + public Iterator getIncomingIterator() { + return Collections.EMPTY_LIST.iterator(); + } + + public Iterator getOutgoingIterator() { + return new OneElementIterator(next); + } + + public int getIncomingSize() { + return 0; + } + + public int getOutgoingSize() { + return 1; + } + + public IBasicBlock getOutgoing() { + return next; + } + + public Iterator getExitNodeIterator() { + return exitNodes.iterator(); + } + + public int getExitNodeSize() { + return exitNodes.size(); + } + + public void setOutgoing(IBasicBlock next) { + if (this.next != null) throw new IllegalArgumentException("Cannot modify already exiting connector"); //$NON-NLS-1$ + this.next = next; + } + + public void setExitNodes(Collection exitNodes) { + if (this.exitNodes != null) throw new IllegalArgumentException("Cannot modify already exiting connector"); //$NON-NLS-1$ + this.exitNodes = Collections.unmodifiableList(new ArrayList(exitNodes)); + } +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IBasicBlock.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IBasicBlock.java new file mode 100644 index 00000000000..616caf06613 --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IBasicBlock.java @@ -0,0 +1,14 @@ +package org.eclipse.cdt.codan.provisional.core.model.cfg; + +import java.util.Iterator; + +public interface IBasicBlock { + Iterator getIncomingIterator(); + + Iterator getOutgoingIterator(); + + int getIncomingSize(); + + int getOutgoingSize(); + +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IConnectorNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IConnectorNode.java new file mode 100644 index 00000000000..7a2b9ce55ef --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IConnectorNode.java @@ -0,0 +1,5 @@ +package org.eclipse.cdt.codan.provisional.core.model.cfg; + +public interface IConnectorNode extends IBasicBlock { + +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IDecisionArc.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IDecisionArc.java new file mode 100644 index 00000000000..0c167576cd2 --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IDecisionArc.java @@ -0,0 +1,5 @@ +package org.eclipse.cdt.codan.provisional.core.model.cfg; + +public interface IDecisionArc { + +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IDecisionNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IDecisionNode.java new file mode 100644 index 00000000000..f7bb6c2bfe7 --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IDecisionNode.java @@ -0,0 +1,5 @@ +package org.eclipse.cdt.codan.provisional.core.model.cfg; + +public interface IDecisionNode extends IBasicBlock { + +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IJumpNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IJumpNode.java new file mode 100644 index 00000000000..b4516521ff0 --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IJumpNode.java @@ -0,0 +1,5 @@ +package org.eclipse.cdt.codan.provisional.core.model.cfg; + +public interface IJumpNode extends IBasicBlock { + boolean isBackwardArc(); +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IPlainNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IPlainNode.java new file mode 100644 index 00000000000..296a6b4f197 --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IPlainNode.java @@ -0,0 +1,5 @@ +package org.eclipse.cdt.codan.provisional.core.model.cfg; + +public interface IPlainNode extends IBasicBlock, ISingleOutgoing, ISingleIncoming { + +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/ISingleIncoming.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/ISingleIncoming.java new file mode 100644 index 00000000000..60e2e4d501d --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/ISingleIncoming.java @@ -0,0 +1,5 @@ +package org.eclipse.cdt.codan.provisional.core.model.cfg; + +public interface ISingleIncoming { + IBasicBlock getIncoming(); +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/ISingleOutgoing.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/ISingleOutgoing.java new file mode 100644 index 00000000000..50d4227edb2 --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/ISingleOutgoing.java @@ -0,0 +1,5 @@ +package org.eclipse.cdt.codan.provisional.core.model.cfg; + +public interface ISingleOutgoing { + IBasicBlock getOutgoing(); +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IStartNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IStartNode.java new file mode 100644 index 00000000000..47e3ec7e3b9 --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IStartNode.java @@ -0,0 +1,9 @@ +package org.eclipse.cdt.codan.provisional.core.model.cfg; + +import java.util.Iterator; + +public interface IStartNode extends IBasicBlock, ISingleOutgoing { + Iterator getExitNodeIterator(); + + int getExitNodeSize(); +}