package de.skuzzle.polly.core.parser.ast.lang.operators;
import de.skuzzle.polly.core.parser.Position;
import de.skuzzle.polly.core.parser.ast.declarations.Namespace;
import de.skuzzle.polly.core.parser.ast.declarations.types.Type;
import de.skuzzle.polly.core.parser.ast.expressions.literals.Literal;
import de.skuzzle.polly.core.parser.ast.expressions.literals.TimespanLiteral;
import de.skuzzle.polly.core.parser.ast.lang.BinaryOperator;
import de.skuzzle.polly.core.parser.ast.visitor.ASTTraversalException;
import de.skuzzle.polly.core.parser.ast.visitor.ExecutionVisitor;
import de.skuzzle.polly.tools.collections.Stack;
/**
* Binary operators that operate on {@link TimespanLiteral}s and produce a new
* {@link TimespanLiteral}.
*
* @author Simon Taddiken
*/
public class TimespanArithmetic extends BinaryOperator<TimespanLiteral, TimespanLiteral>{
public TimespanArithmetic(OpType id) {
super(id);
this.initTypes(Type.TIMESPAN, Type.TIMESPAN, Type.TIMESPAN);
}
@Override
protected void exec(Stack<Literal> stack, Namespace ns, TimespanLiteral left,
TimespanLiteral right, Position resultPos, ExecutionVisitor execVisitor)
throws ASTTraversalException {
switch (this.getOp()) {
case ADD:
stack.push(new TimespanLiteral(resultPos,
left.getSeconds() + right.getSeconds()));
break;
case SUB:
stack.push(new TimespanLiteral(resultPos,
left.getSeconds() - right.getSeconds()));
break;
default:
this.invalidOperatorType(this.getOp());
}
}
}