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 / MulOperator.java @ 44207

History | View | Annotate | Download (3.3 KB)

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

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

    
9
public class MulOperator 
10
        extends AbstractBinaryOperator 
11
        implements Optimizer.FunctionOptimizer
12
    {
13

    
14
    public MulOperator() {
15
        super(Function.GROUP_NUMERIC, OPERATOR_MULT, true);
16
    }
17

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

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

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

    
89
        return caller;
90
    }
91
    
92

    
93
}