|
@@ -1,7 +1,7 @@
|
|
|
package bk;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
-import java.util.Stack;
|
|
|
+import java.util.List;
|
|
|
|
|
|
import javax.swing.JTree;
|
|
|
|
|
@@ -11,12 +11,12 @@ import animation.CodeLine;
|
|
|
import animation.ControlFlow;
|
|
|
import animation.Memory;
|
|
|
import animation.PseudoCodeNode;
|
|
|
-import animation.PseudoCodeNode.CodeAction;
|
|
|
-import animation.StackFrame;
|
|
|
-import animation.StackFrame.FrameType;
|
|
|
import codelines.DeclareVariable;
|
|
|
+import codelines.ForEachLoop;
|
|
|
import codelines.ForLoop;
|
|
|
import codelines.FunctionDefinition;
|
|
|
+import codelines.IfLoop;
|
|
|
+import codelines.WhileLoop;
|
|
|
import graph.LayeredGraphEdge;
|
|
|
import graph.LayeredGraphNode;
|
|
|
import lib.TextLayoutHelper;
|
|
@@ -29,11 +29,9 @@ import lib.TextLayoutHelper;
|
|
|
*/
|
|
|
public class ConflictDetection implements AlgorithmStage {
|
|
|
|
|
|
- private LayeredGraphNode graph;
|
|
|
private AnimatedAlgorithm alg;
|
|
|
|
|
|
- public ConflictDetection(LayeredGraphNode graph, AnimatedAlgorithm alg) {
|
|
|
- this.graph = graph;
|
|
|
+ public ConflictDetection( AnimatedAlgorithm alg ) {
|
|
|
this.alg = alg;
|
|
|
}
|
|
|
|
|
@@ -80,44 +78,52 @@ public class ConflictDetection implements AlgorithmStage {
|
|
|
outerLoop.add( line );
|
|
|
PseudoCodeNode innerLoop = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "for l1=0 to |L[i+1]|-1 do", vars ), tree, new ForLoop( "l1", "0", "end_" ), alg );
|
|
|
outerLoop.add( innerLoop );
|
|
|
- PseudoCodeNode ifNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if l1==|L[i+1]|-1 or L[i+1][l1] incident to inner segment between L[i+1] and L[i] then", vars ), tree, new CodeLine() {
|
|
|
+ PseudoCodeNode ifNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if l1==|L[i+1]|-1 or L[i+1][l1] incident to inner segment between L[i+1] and L[i] then", vars ), tree, new IfLoop() {
|
|
|
@Override
|
|
|
- public ControlFlow runForward(Memory m) {
|
|
|
- if( m.isDefined( "line_" + lineId + "_inside", false ) )
|
|
|
- {
|
|
|
- StackFrame old = m.removeFrame();
|
|
|
- actions.push( (Memory mem) -> {
|
|
|
- mem.addFrame( old );
|
|
|
- return new ControlFlow( ControlFlow.STEP_INTO );
|
|
|
- } );
|
|
|
- return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if( m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().get( m.<Integer>read( "i", false ) + 1).size() == m.<Integer>read( "l1", false ) ||
|
|
|
- incidentToInnerSegmentBetweenLiPlusOneAndLi( m ) ) {
|
|
|
- m.addFrame( new StackFrame( FrameType.LOOP ) );
|
|
|
- m.declare( "line_" + lineId + "_inside", true, false );
|
|
|
- actions.push( (Memory mem) -> {
|
|
|
- mem.removeFrame();
|
|
|
- return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
- } );
|
|
|
- return new ControlFlow( ControlFlow.STEP_INTO );
|
|
|
- } else {
|
|
|
- m.declare( "line_" + lineId + "_inside", false, false );
|
|
|
- actions.push( (Memory mem) -> {
|
|
|
- mem.undeclare( "line_" + lineId + "_inside", false );
|
|
|
- return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
- } );
|
|
|
- return new ControlFlow( ControlFlow.STEP_OVER );
|
|
|
- }
|
|
|
- }
|
|
|
+ protected boolean condition(Memory m) {
|
|
|
+ return m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().get( m.<Integer>read( "i", false ) + 1).size() == m.<Integer>read( "l1", false ) ||
|
|
|
+ incidentToInnerSegmentBetweenLiPlusOneAndLi( m );
|
|
|
}
|
|
|
}, alg );
|
|
|
innerLoop.add( ifNode );
|
|
|
+ line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k1 = |L[i]|-1;", vars ), tree, new DeclareVariable<Integer>( "k1" ) {
|
|
|
+ @Override
|
|
|
+ protected Integer value(Memory m) {
|
|
|
+ return m.<ArrayList<ArrayList<LayeredGraphNode>>>read( "L", false ).get( m.read( "i", false ) ).size() - 1;
|
|
|
+ }
|
|
|
+ }, alg );
|
|
|
+ ifNode.add( line );
|
|
|
+ PseudoCodeNode innerIfNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if L[i+1][l1] incident to inner segment between L[i+1] and L[i] then", vars ), tree, new IfLoop() {
|
|
|
+ @Override
|
|
|
+ protected boolean condition(Memory m) {
|
|
|
+ return incidentToInnerSegmentBetweenLiPlusOneAndLi( m );
|
|
|
+ }
|
|
|
+ }, alg );
|
|
|
+ ifNode.add( innerIfNode );
|
|
|
+
|
|
|
+ line = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k1 = pos(pred(L[i+1][l1])[0]);", vars ), tree, new DeclareVariable<Integer>( "k1" ) {
|
|
|
+ @Override
|
|
|
+ protected Integer value(Memory m) {
|
|
|
+ return m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().get( m.read( "i", false ) ).indexOf(
|
|
|
+ m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().get( m.<Integer>read( "i", false ) + 1 ).get( m.read( "l1", false ) ).getSortedIncomingEdges().get( 0 ).getSources().get( 0 ) );
|
|
|
+ }
|
|
|
+ }, alg );
|
|
|
+ innerIfNode.add( line );
|
|
|
+ PseudoCodeNode whileLoop = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "while l <= l1 do", vars ), tree, new WhileLoop() {
|
|
|
+ @Override
|
|
|
+ protected boolean condition( Memory m ) {
|
|
|
+ return m.<Integer>read( "l", false ) <= m.<Integer>read( "l1", false );
|
|
|
+ }
|
|
|
+ }, alg );
|
|
|
+ ifNode.add( whileLoop );
|
|
|
+ PseudoCodeNode foreach = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "foreach v in pred(L[i+1][l]) do", vars ), tree, new ForEachLoop<LayeredGraphEdge>( "v" ) {
|
|
|
+ @Override
|
|
|
+ protected List<LayeredGraphEdge> list(Memory m) {
|
|
|
+ return m.<LayeredGraphNode>read( "graph", false ).getContainedLayers().get( m.<Integer>read( "i", false ) + 1 ).get( m.read( "l", false ) ).getIncomingEdges();
|
|
|
+ }
|
|
|
+ }, alg );
|
|
|
+ whileLoop.add( foreach );
|
|
|
/*
|
|
|
- lines[ 4 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k1 = |L[i]|-1;", vars ), tree );
|
|
|
- lines[ 3 ].add( lines[ 4 ] );
|
|
|
lines[ 5 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if L[i+1][l1] incident to inner segment between L[i+1] and L[i] then", vars ), tree );
|
|
|
lines[ 3 ].add( lines[ 5 ] );
|
|
|
lines[ 6 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k1 = pos(pred(L[i+1][l1])[0]);", vars ), tree );
|