package algvis.ds.dynamicarray;
import algvis.core.Algorithm;
import algvis.core.Node;
import algvis.ui.view.REL;
import algvis.core.NodeColor;
public class DynamicArrayPop extends DynamicArrayAlg {
DynamicArray D;
DynamicArrayPop(DynamicArray D) {
super(D);
this.D = D;
}
@Override
public void runAlgorithm() {
D.newCoins.clear();
setHeader("pop");
for(int i=0; i < 3; i++) {
D.newCoins.add(new DynamicArrayCoin(D, D.invisible, (int) (i * Node.RADIUS * 2.25), 0));
}
if(D.size == 0) {
addStep((Node)D.array.get(0), REL.TOP, "dynamicarray-empty");
}
else {
D.newCoins.get(2).setColor(NodeColor.RED);
addStep((Node) D.array.get(D.size - 1), REL.TOPRIGHT, "dynamicarray-pop");
pause();
D.newCoins.get(2).setState(Node.UP);
D.size--;
D.array.get(D.size).setKey(Node.NOKEY);
if(D.coinsForCopy.get(D.size).state != Node.INVISIBLE) D.coinsForCopy.get(D.size).setState(Node.DOWN);
if(D.coinsForArray.get(D.size).state != Node.INVISIBLE) D.coinsForArray.get(D.size).setState(Node.UP);
boolean needless = true;
if(D.size >= D.capacity/4 && D.size < D.capacity/2) {
if(D.coinsForArray.get(D.size - D.capacity/4).state == Node.INVISIBLE) {
needless = false;
D.newCoins.get(1).setColor(NodeColor.GREEN);
D.newCoins.get(0).setColor(NodeColor.GREEN);
D.newCoins.get(1).changeRelative(D.array.get(D.size - D.capacity/4)); D.newCoins.get(0).moveTo(0, -D.coinsDist);
D.newCoins.get(0).changeRelative(D.array.get(D.size - D.capacity/4)); D.newCoins.get(1).moveTo(0, D.coinsDist);
D.coinsForArray.set(D.size - D.capacity/4, D.newCoins.get(0));
D.coinsForCopy.set(D.size - D.capacity/4, D.newCoins.get(1));
}
}
if(needless) {
if(D.size != 0) addStep((Node) D.newCoins.get(0), REL.TOP, "dynamicarray-needless-second");
else addStep((Node) D.newCoins.get(0), REL.TOP, "dynamicarray-needless-empty");
D.newCoins.get(1).setColor(NodeColor.RED);
D.newCoins.get(0).setColor(NodeColor.RED);
pause();
D.newCoins.get(0).setState(Node.UP);
D.newCoins.get(1).setState(Node.UP);
}
if(D.size != 0 && D.size * 4 <= D.capacity){
addStep(D.delimiter4, REL.TOP, "dynamicarray-small");
pause();
for(int i= D.capacity/2; i < D.capacity; i++) {
D.array.get(i).setColor(NodeColor.RED);
}
createNewArray(D.capacity / 2);
needless = true;
}
}
}
}