package jeql.syntax.operation;
import jeql.api.error.ImplementationException;
import jeql.engine.Scope;
import jeql.syntax.ParseTreeNode;
import jeql.util.TypeUtil;
public class ComparisonOperation
extends Operation
{
public ComparisonOperation(ParseTreeNode e1, ParseTreeNode e2, String opStr, int opCode) {
super(e1, e2, opStr, opCode);
}
public Class getType(Scope scope)
{
return Boolean.class;
}
public Object compute(Object o1, Object o2)
{
Class exprType = getMostGeneralType(o1, o2);
Object v1 = coerce(o1, exprType);
Object v2 = coerce(o2, exprType);
return new Boolean(computeComparison(TypeUtil.compareValue(v1, v2)));
}
private boolean computeComparison(int compSign)
{
switch(opCode) {
case Operation.GT: return compSign > 0;
case Operation.GE: return compSign >= 0;
case Operation.LT: return compSign < 0;
case Operation.LE: return compSign <= 0;
case Operation.EQ: return compSign == 0;
case Operation.NE: return compSign != 0;
}
throw new ImplementationException("Unknown op code for comparison");
}
}