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 @ 45307

History | View | Annotate | Download (2.63 KB)

1
package org.gvsig.expressionevaluator.impl.function.operator;
2

    
3
import org.gvsig.expressionevaluator.Code;
4
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_SUBST;
5
import org.gvsig.expressionevaluator.Function;
6
import org.gvsig.expressionevaluator.Interpreter;
7
import org.gvsig.expressionevaluator.Optimizer;
8
import org.gvsig.expressionevaluator.Optimizer.FunctionOptimizer;
9

    
10
public class SubstOperator 
11
        extends AbstractBinaryOperator 
12
        implements FunctionOptimizer
13
    {
14
    
15
    public SubstOperator() {
16
        super(Function.GROUP_NUMERIC, OPERATOR_SUBST, true);
17
    }
18

    
19
    @Override
20
    public boolean allowConstantFolding() {
21
        return true;
22
    }
23
    
24
    @Override
25
    public Object call(Interpreter interpreter, Object op1, Object op2) {
26
        if (op1 == null || op2 == null) {
27
            return null;
28
        }
29
        int type = this.getType(op1, op2);
30
        if( (type & TYPE_DOUBLE) == TYPE_DOUBLE ) {
31
            double value = getDouble(op1,1) - getDouble(op2,2);
32
            return value;
33
        }
34
        if( (type & TYPE_FLOAT) == TYPE_FLOAT ) {
35
            double value = getFloat(op1,1) - getFloat(op2,2);
36
            return value;
37
        }
38
        if( (type & TYPE_LONG) == TYPE_LONG ) {
39
            long value = getLong(op1,1) - getLong(op2,2);
40
            return value;
41
        }
42
        if( (type & TYPE_INT) == TYPE_INT ) {
43
            int value = getInt(op1,1) - getInt(op2,2);
44
            return value;
45
        }
46
        throw new IllegalArgumentException("Types not allowed in '"+name()+"' operand.");
47
    }
48
    
49
    @Override
50
    public Code optimize(Optimizer optimizer, Code.Callable caller) {
51
        Code op1 = optimizer.optimize(caller.parameters().get(0));
52
        Code op2 = optimizer.optimize(caller.parameters().get(1));
53
        
54
        if ( op1.code() == Code.CONSTANT && op2.code() == Code.CONSTANT) {
55
            Code newCode = optimizer.getCodeBuilder().constant(
56
                    call(
57
                            optimizer.getInterpreter(), 
58
                            ((Code.Constant)op1).value(), 
59
                            ((Code.Constant)op2).value()
60
                    )
61
            );
62
            return newCode;
63
            
64
        } else if ( op2.code() == Code.CONSTANT ) {
65
            Object value = ((Code.Constant)op2).value();
66
            if( value instanceof Number ) {
67
                double n = ((Number) value).doubleValue();
68
                if( n == 0 ) {
69
                    return op1;
70
                }
71
            }
72
            Code newCode = optimizer.getCodeBuilder().operator(caller.name(), op1, op2);
73
            return newCode;
74
        }
75

    
76
        return caller;
77
    }
78

    
79
}