package de.gaalop.gapp.importing.optimization;
import de.gaalop.gapp.PosSelector;
import de.gaalop.gapp.PosSelectorset;
import de.gaalop.gapp.Valueset;
import de.gaalop.gapp.instructionSet.GAPPAssignMv;
import de.gaalop.gapp.variables.GAPPConstant;
import de.gaalop.gapp.variables.GAPPValueHolder;
import java.util.Iterator;
import java.util.LinkedList;
/**
* Optimizes the GAPP Code by
* removing assignMv instructions with a zero value.
*
* @author Christian Steinmetz
*/
public class GAPPRemoveZeroAssignments extends GAPPRemover {
//return Boolean: true, if command should be removed, otherwise false or null
@Override
public Object visitAssignMv(GAPPAssignMv gappAssignMv, Object arg) {
//Remove all zeros in AssignMv
LinkedList<PosSelector> delSelectors = new LinkedList<PosSelector>();
LinkedList<GAPPConstant> delVariables = new LinkedList<GAPPConstant>();
PosSelectorset selSet = gappAssignMv.getSelectors();
Valueset valSet = gappAssignMv.getValues();
Iterator<PosSelector> selIt = selSet.listIterator();
Iterator<GAPPConstant> valIt = valSet.listIterator();
while (selIt.hasNext() && valIt.hasNext()) {
PosSelector curSel = selIt.next();
GAPPValueHolder curVar = valIt.next();
if (!curVar.isVariable()) {
GAPPConstant constant = (GAPPConstant) curVar;
if (Math.abs(constant.getValue()) < 10E-04) {
delSelectors.add(curSel);
delVariables.add(constant);
}
}
}
for (PosSelector sel : delSelectors) {
selSet.remove(sel);
}
for (GAPPConstant val : delVariables) {
valSet.remove(val);
}
// if selList is Empty remove the whole command
return selSet.isEmpty();
}
}