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

History | View | Annotate | Download (3.28 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
        if (op1 == null || op2 == null) {
26
            return null;
27
        }
28
        int type = this.getType(op1, op2);
29
        if( (type & TYPE_DOUBLE) == TYPE_DOUBLE ) {
30
            double value = getDouble(op1,1) * getDouble(op2,2);
31
            return value;
32
        }
33
        if( (type & TYPE_FLOAT) == TYPE_FLOAT ) {
34
            double value = getFloat(op1,1) * getFloat(op2,2);
35
            return value;
36
        }
37
        if( (type & TYPE_LONG) == TYPE_LONG ) {
38
            long value = getLong(op1,1) * getLong(op2,2);
39
            return value;
40
        }
41
        if( (type & TYPE_INT) == TYPE_INT ) {
42
            int value = getInt(op1,1) * getInt(op2,2);
43
            return value;
44
        }
45
        throw new IllegalArgumentException("Types not allowed in '"+name()+"' operand.");
46
    }
47

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

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

    
92
        return caller;
93
    }
94
    
95

    
96
}