package com.tom_roush.pdfbox.pdmodel.common.function.type4;
import java.util.Stack;
/**
* Provides the relational operators such as "eq" and "le".
*/
class RelationalOperators
{
/** Implements the "eq" operator. */
static class Eq implements Operator
{
public void execute(ExecutionContext context)
{
Stack<Object> stack = context.getStack();
Object op2 = stack.pop();
Object op1 = stack.pop();
boolean result = isEqual(op1, op2);
stack.push(result);
}
protected boolean isEqual(Object op1, Object op2)
{
boolean result = false;
if (op1 instanceof Number && op2 instanceof Number)
{
Number num1 = (Number)op1;
Number num2 = (Number)op2;
result = num1.floatValue() == num2.floatValue();
}
else
{
result = op1.equals(op2);
}
return result;
}
}
/** Abstract base class for number comparison operators. */
private abstract static class AbstractNumberComparisonOperator implements Operator
{
public void execute(ExecutionContext context)
{
Stack<Object> stack = context.getStack();
Object op2 = stack.pop();
Object op1 = stack.pop();
Number num1 = (Number)op1;
Number num2 = (Number)op2;
boolean result = compare(num1, num2);
stack.push(result);
}
protected abstract boolean compare(Number num1, Number num2);
}
/** Implements the "ge" operator. */
static class Ge extends AbstractNumberComparisonOperator
{
@Override
protected boolean compare(Number num1, Number num2)
{
return num1.floatValue() >= num2.floatValue();
}
}
/** Implements the "gt" operator. */
static class Gt extends AbstractNumberComparisonOperator
{
@Override
protected boolean compare(Number num1, Number num2)
{
return num1.floatValue() > num2.floatValue();
}
}
/** Implements the "le" operator. */
static class Le extends AbstractNumberComparisonOperator
{
@Override
protected boolean compare(Number num1, Number num2)
{
return num1.floatValue() <= num2.floatValue();
}
}
/** Implements the "lt" operator. */
static class Lt extends AbstractNumberComparisonOperator
{
@Override
protected boolean compare(Number num1, Number num2)
{
return num1.floatValue() < num2.floatValue();
}
}
/** Implements the "ne" operator. */
static class Ne extends Eq
{
@Override
protected boolean isEqual(Object op1, Object op2)
{
boolean result = super.isEqual(op1, op2);
return !result;
}
}
}