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.NumberLiteral; import de.skuzzle.polly.core.parser.ast.lang.UnaryOperator; 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; public class UnaryArithmetic extends UnaryOperator<NumberLiteral> { public UnaryArithmetic(OpType op) { super(op); this.initTypes(Type.NUM, Type.NUM); } @Override protected void exec(Stack<Literal> stack, Namespace ns, NumberLiteral operand, Position resultPos, ExecutionVisitor execVisitor) throws ASTTraversalException { switch (this.getOp()) { case EXCLAMATION: stack.push(new NumberLiteral(resultPos, (double) ~operand.isInteger(execVisitor.getReporter()))); break; case SUB: stack.push(new NumberLiteral(resultPos, -operand.getValue())); break; case LOG: stack.push(new NumberLiteral(resultPos, Math.log10(operand.getValue()))); break; case LN: stack.push(new NumberLiteral(resultPos, Math.log(operand.getValue()))); break; case SQRT: stack.push(new NumberLiteral(resultPos, Math.sqrt(operand.getValue()))); break; case CEIL: stack.push(new NumberLiteral(resultPos, Math.ceil(operand.getValue()))); break; case FLOOR: stack.push(new NumberLiteral(resultPos, Math.floor(operand.getValue()))); break; case ROUND: stack.push(new NumberLiteral(resultPos, Math.round(operand.getValue()))); break; case SIG: stack.push(new NumberLiteral(resultPos, Math.signum(operand.getValue()))); break; case COS: stack.push(new NumberLiteral(resultPos, Math.cos(operand.getValue()))); break; case SIN: stack.push(new NumberLiteral(resultPos, Math.sin(operand.getValue()))); break; case TAN: stack.push(new NumberLiteral(resultPos, Math.tan(operand.getValue()))); break; case ASIN: stack.push(new NumberLiteral(resultPos, Math.asin(operand.getValue()))); break; case ACOS: stack.push(new NumberLiteral(resultPos, Math.acos(operand.getValue()))); break; case ATAN: stack.push(new NumberLiteral(resultPos, Math.atan(operand.getValue()))); break; case ABS: stack.push(new NumberLiteral(resultPos, Math.abs(operand.getValue()))); break; case TO_DEGREES: stack.push(new NumberLiteral(resultPos, Math.toDegrees(operand.getValue()))); break; case TO_RADIANS: stack.push(new NumberLiteral(resultPos, Math.toRadians(operand.getValue()))); break; case EXP: stack.push(new NumberLiteral(resultPos, Math.exp(operand.getValue()))); break; default: this.invalidOperatorType(this.getOp()); } } }