/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.pdfbox.pdmodel.common.function.type4; import java.util.Stack; /** * Provides the relational operators such as "eq" and "le". * * @version $Revision$ */ 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; } } }