Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.lib / org.gvsig.expressionevaluator.lib.impl / src / main / java / org / gvsig / expressionevaluator / impl / function / operator / SubstOperator.java @ 44752

History | View | Annotate | Download (2.66 KB)

1 43512 jjdelcerro
package org.gvsig.expressionevaluator.impl.function.operator;
2
3 44010 jjdelcerro
import org.gvsig.expressionevaluator.Code;
4 44207 jjdelcerro
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_SUBST;
5 43521 jjdelcerro
import org.gvsig.expressionevaluator.Function;
6
import org.gvsig.expressionevaluator.Interpreter;
7 44010 jjdelcerro
import org.gvsig.expressionevaluator.Optimizer;
8
import org.gvsig.expressionevaluator.Optimizer.FunctionOptimizer;
9 43521 jjdelcerro
10 44010 jjdelcerro
public class SubstOperator
11
        extends AbstractBinaryOperator
12
        implements FunctionOptimizer
13
    {
14 44207 jjdelcerro
15 43512 jjdelcerro
    public SubstOperator() {
16 44207 jjdelcerro
        super(Function.GROUP_NUMERIC, OPERATOR_SUBST, true);
17 43512 jjdelcerro
    }
18
19
    @Override
20 44009 jjdelcerro
    public boolean allowConstantFolding() {
21
        return true;
22
    }
23
24
    @Override
25 43521 jjdelcerro
    public Object call(Interpreter interpreter, Object op1, Object op2) {
26 43512 jjdelcerro
        int type = this.getType(op1, op2);
27
        if( (type & TYPE_DOUBLE) == TYPE_DOUBLE ) {
28
            double value = ((Number) op1).doubleValue() - ((Number) op2).doubleValue();
29
            return value;
30
        }
31
        if( (type & TYPE_FLOAT) == TYPE_FLOAT ) {
32
            double value = ((Number) op1).floatValue() - ((Number) op2).floatValue();
33
            return value;
34
        }
35
        if( (type & TYPE_LONG) == TYPE_LONG ) {
36
            long value = ((Number) op1).longValue() - ((Number) op2).longValue();
37
            return value;
38
        }
39
        if( (type & TYPE_INT) == TYPE_INT ) {
40
            int value = ((Number) op1).intValue() - ((Number) op2).intValue();
41
            return value;
42
        }
43
        throw new IllegalArgumentException("Types not allowed in '"+name()+"' operand.");
44
    }
45 44010 jjdelcerro
46
    @Override
47 44752 jjdelcerro
    public Code optimize(Optimizer optimizer, Code.Callable caller) {
48 44198 jjdelcerro
        Code op1 = optimizer.optimize(caller.parameters().get(0));
49
        Code op2 = optimizer.optimize(caller.parameters().get(1));
50 44010 jjdelcerro
51
        if ( op1.code() == Code.CONSTANT && op2.code() == Code.CONSTANT) {
52
            Code newCode = optimizer.getCodeBuilder().constant(
53
                    call(
54
                            optimizer.getInterpreter(),
55
                            ((Code.Constant)op1).value(),
56
                            ((Code.Constant)op2).value()
57
                    )
58
            );
59
            return newCode;
60
61
        } else if ( op2.code() == Code.CONSTANT ) {
62
            Object value = ((Code.Constant)op2).value();
63
            if( value instanceof Number ) {
64
                double n = ((Number) value).doubleValue();
65
                if( n == 0 ) {
66
                    return op1;
67
                }
68
            }
69
            Code newCode = optimizer.getCodeBuilder().operator(caller.name(), op1, op2);
70
            return newCode;
71
        }
72 43512 jjdelcerro
73 44010 jjdelcerro
        return caller;
74
    }
75
76 43512 jjdelcerro
}