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 / AddOperator.java @ 44010

History | View | Annotate | Download (3.04 KB)

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

    
3
import org.gvsig.expressionevaluator.Code;
4
import org.gvsig.expressionevaluator.Code.Caller;
5
import org.gvsig.expressionevaluator.Code.Constant;
6
import org.gvsig.expressionevaluator.Function;
7
import org.gvsig.expressionevaluator.Interpreter;
8
import org.gvsig.expressionevaluator.Optimizer;
9
import org.gvsig.expressionevaluator.Optimizer.FunctionOptimizer;
10

    
11
public class AddOperator 
12
        extends AbstractBinaryOperator 
13
        implements FunctionOptimizer
14
    {
15

    
16
    public AddOperator() {
17
        super(Function.GROUP_NUMERIC, "+");
18
    }
19

    
20
    @Override
21
    public boolean allowConstantFolding() {
22
        return true;
23
    }
24
    
25
    @Override
26
    public Object call(Interpreter interpreter, Object op1, Object op2) {       
27
        int type = this.getType(op1, op2);
28
        if( (type & TYPE_DOUBLE) == TYPE_DOUBLE ) {
29
            double value = ((Number) op1).doubleValue() + ((Number) op2).doubleValue();
30
            return value;
31
        }
32
        if( (type & TYPE_FLOAT) == TYPE_FLOAT ) {
33
            double value = ((Number) op1).floatValue() + ((Number) op2).floatValue();
34
            return value;
35
        }
36
        if( (type & TYPE_LONG) == TYPE_LONG ) {
37
            long value = ((Number) op1).longValue() + ((Number) op2).longValue();
38
            return value;
39
        }
40
        if( (type & TYPE_INT) == TYPE_INT ) {
41
            int value = ((Number) op1).intValue()+ ((Number) op2).intValue();
42
            return value;
43
        }
44
        throw new IllegalArgumentException("Types not allowed in '"+name()+"' operand.");
45
    }
46

    
47
    @Override
48
    public Code optimize(Optimizer optimizer, Caller caller) {
49
        Code op1 = optimizer.optimize(caller.args().get(0));
50
        Code op2 = optimizer.optimize(caller.args().get(1));
51
        
52
        if ( op1.code() == Code.CONSTANT && op2.code() == Code.CONSTANT) {
53
            Code newCode = optimizer.getCodeBuilder().constant(
54
                    call(
55
                            optimizer.getInterpreter(), 
56
                            ((Constant)op1).value(), 
57
                            ((Constant)op2).value()
58
                    )
59
            );
60
            return newCode;
61
            
62
        } else if ( op1.code() == Code.CONSTANT ) {
63
            Object value = ((Constant)op1).value();
64
            if( value instanceof Number ) {
65
                double n = ((Number) value).doubleValue();
66
                if( n == 0 ) {
67
                   return op2;
68
                }
69
            }
70
            Code newCode = optimizer.getCodeBuilder().operator(caller.name(), op1, op2);
71
            return newCode;
72

    
73
        } else if ( op2.code() == Code.CONSTANT ) {
74
            Object value = ((Code.Constant)op2).value();
75
            if( value instanceof Number ) {
76
                double n = ((Number) value).doubleValue();
77
                if( n == 0 ) {
78
                    return op1;
79
                }
80
            }
81
            Code newCode = optimizer.getCodeBuilder().operator(caller.name(), op1, op2);
82
            return newCode;
83
        }
84

    
85
        return caller;
86
    }
87
    
88
}