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

History | View | Annotate | Download (3.08 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 static final String NAME = "+";
17

    
18
    public AddOperator() {
19
        super(Function.GROUP_NUMERIC, NAME);
20
    }
21

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

    
49
    @Override
50
    public Code optimize(Optimizer optimizer, Caller caller) {
51
        Code op1 = optimizer.optimize(caller.args().get(0));
52
        Code op2 = optimizer.optimize(caller.args().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
                            ((Constant)op1).value(), 
59
                            ((Constant)op2).value()
60
                    )
61
            );
62
            return newCode;
63
            
64
        } else if ( op1.code() == Code.CONSTANT ) {
65
            Object value = ((Constant)op1).value();
66
            if( value instanceof Number ) {
67
                double n = ((Number) value).doubleValue();
68
                if( n == 0 ) {
69
                   return op2;
70
                }
71
            }
72
            Code newCode = optimizer.getCodeBuilder().operator(caller.name(), op1, op2);
73
            return newCode;
74

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

    
87
        return caller;
88
    }
89
    
90
}