Search in sources :

Example 1 with InternalNumber

use of org.mvel2.util.InternalNumber in project mvel by mikebrock.

the class MathProcessor method doOperationsSameType.

private static Object doOperationsSameType(int type1, Object val1, int operation, Object val2) {
    switch(type1) {
        case DataTypes.COLLECTION:
            switch(operation) {
                case ADD:
                    List list = new ArrayList((Collection) val1);
                    list.addAll((Collection) val2);
                    return list;
                case EQUAL:
                    return val1.equals(val2);
                case NEQUAL:
                    return !val1.equals(val2);
                default:
                    throw new UnsupportedOperationException("illegal operation on Collection type");
            }
        case DataTypes.INTEGER:
        case DataTypes.W_INTEGER:
            switch(operation) {
                case ADD:
                    return ((Integer) val1) + ((Integer) val2);
                case SUB:
                    return ((Integer) val1) - ((Integer) val2);
                case DIV:
                    return ((Integer) val1).doubleValue() / ((Integer) val2).doubleValue();
                case MULT:
                    return ((Integer) val1) * ((Integer) val2);
                case POWER:
                    double d = Math.pow((Integer) val1, (Integer) val2);
                    if (d > Integer.MAX_VALUE)
                        return d;
                    else
                        return (int) d;
                case MOD:
                    return ((Integer) val1) % ((Integer) val2);
                case GTHAN:
                    return ((Integer) val1) > ((Integer) val2) ? Boolean.TRUE : Boolean.FALSE;
                case GETHAN:
                    return ((Integer) val1) >= ((Integer) val2) ? Boolean.TRUE : Boolean.FALSE;
                case LTHAN:
                    return ((Integer) val1) < ((Integer) val2) ? Boolean.TRUE : Boolean.FALSE;
                case LETHAN:
                    return ((Integer) val1) <= ((Integer) val2) ? Boolean.TRUE : Boolean.FALSE;
                case EQUAL:
                    return ((Integer) val1).intValue() == ((Integer) val2).intValue() ? Boolean.TRUE : Boolean.FALSE;
                case NEQUAL:
                    return ((Integer) val1).intValue() != ((Integer) val2).intValue() ? Boolean.TRUE : Boolean.FALSE;
                case BW_AND:
                    return (Integer) val1 & (Integer) val2;
                case BW_OR:
                    return (Integer) val1 | (Integer) val2;
                case BW_SHIFT_LEFT:
                    return (Integer) val1 << (Integer) val2;
                case BW_SHIFT_RIGHT:
                    return (Integer) val1 >> (Integer) val2;
                case BW_USHIFT_RIGHT:
                    return (Integer) val1 >>> (Integer) val2;
                case BW_XOR:
                    return (Integer) val1 ^ (Integer) val2;
            }
        case DataTypes.SHORT:
        case DataTypes.W_SHORT:
            switch(operation) {
                case ADD:
                    return ((Short) val1) + ((Short) val2);
                case SUB:
                    return ((Short) val1) - ((Short) val2);
                case DIV:
                    return ((Short) val1).doubleValue() / ((Short) val2).doubleValue();
                case MULT:
                    return ((Short) val1) * ((Short) val2);
                case POWER:
                    double d = Math.pow((Short) val1, (Short) val2);
                    if (d > Short.MAX_VALUE)
                        return d;
                    else
                        return (short) d;
                case MOD:
                    return ((Short) val1) % ((Short) val2);
                case GTHAN:
                    return ((Short) val1) > ((Short) val2) ? Boolean.TRUE : Boolean.FALSE;
                case GETHAN:
                    return ((Short) val1) >= ((Short) val2) ? Boolean.TRUE : Boolean.FALSE;
                case LTHAN:
                    return ((Short) val1) < ((Short) val2) ? Boolean.TRUE : Boolean.FALSE;
                case LETHAN:
                    return ((Short) val1) <= ((Short) val2) ? Boolean.TRUE : Boolean.FALSE;
                case EQUAL:
                    return ((Short) val1).shortValue() == ((Short) val2).shortValue() ? Boolean.TRUE : Boolean.FALSE;
                case NEQUAL:
                    return ((Short) val1).shortValue() != ((Short) val2).shortValue() ? Boolean.TRUE : Boolean.FALSE;
                case BW_AND:
                    return (Short) val1 & (Short) val2;
                case BW_OR:
                    return (Short) val1 | (Short) val2;
                case BW_SHIFT_LEFT:
                    return (Short) val1 << (Short) val2;
                case BW_SHIFT_RIGHT:
                    return (Short) val1 >> (Short) val2;
                case BW_USHIFT_RIGHT:
                    return (Short) val1 >>> (Short) val2;
                case BW_XOR:
                    return (Short) val1 ^ (Short) val2;
            }
        case DataTypes.LONG:
        case DataTypes.W_LONG:
            switch(operation) {
                case ADD:
                    return ((Long) val1) + ((Long) val2);
                case SUB:
                    return ((Long) val1) - ((Long) val2);
                case DIV:
                    return ((Long) val1).doubleValue() / ((Long) val2).doubleValue();
                case MULT:
                    return ((Long) val1) * ((Long) val2);
                case POWER:
                    double d = Math.pow((Long) val1, (Long) val2);
                    if (d > Long.MAX_VALUE)
                        return d;
                    else
                        return (long) d;
                case MOD:
                    return ((Long) val1) % ((Long) val2);
                case GTHAN:
                    return ((Long) val1) > ((Long) val2) ? Boolean.TRUE : Boolean.FALSE;
                case GETHAN:
                    return ((Long) val1) >= ((Long) val2) ? Boolean.TRUE : Boolean.FALSE;
                case LTHAN:
                    return ((Long) val1) < ((Long) val2) ? Boolean.TRUE : Boolean.FALSE;
                case LETHAN:
                    return ((Long) val1) <= ((Long) val2) ? Boolean.TRUE : Boolean.FALSE;
                case EQUAL:
                    return ((Long) val1).longValue() == ((Long) val2).longValue() ? Boolean.TRUE : Boolean.FALSE;
                case NEQUAL:
                    return ((Long) val1).longValue() != ((Long) val2).longValue() ? Boolean.TRUE : Boolean.FALSE;
                case BW_AND:
                    return (Long) val1 & (Long) val2;
                case BW_OR:
                    return (Long) val1 | (Long) val2;
                case BW_SHIFT_LEFT:
                    return (Long) val1 << (Long) val2;
                case BW_USHIFT_LEFT:
                    throw new UnsupportedOperationException("unsigned left-shift not supported");
                case BW_SHIFT_RIGHT:
                    return (Long) val1 >> (Long) val2;
                case BW_USHIFT_RIGHT:
                    return (Long) val1 >>> (Long) val2;
                case BW_XOR:
                    return (Long) val1 ^ (Long) val2;
            }
        case DataTypes.UNIT:
            val2 = ((Unit) val1).convertFrom(val2);
            val1 = ((Unit) val1).getValue();
        case DataTypes.DOUBLE:
        case DataTypes.W_DOUBLE:
            switch(operation) {
                case ADD:
                    return ((Double) val1) + ((Double) val2);
                case SUB:
                    return ((Double) val1) - ((Double) val2);
                case DIV:
                    return ((Double) val1) / ((Double) val2);
                case MULT:
                    return ((Double) val1) * ((Double) val2);
                case POWER:
                    return Math.pow((Double) val1, (Double) val2);
                case MOD:
                    return ((Double) val1) % ((Double) val2);
                case GTHAN:
                    return ((Double) val1) > ((Double) val2) ? Boolean.TRUE : Boolean.FALSE;
                case GETHAN:
                    return ((Double) val1) >= ((Double) val2) ? Boolean.TRUE : Boolean.FALSE;
                case LTHAN:
                    return ((Double) val1) < ((Double) val2) ? Boolean.TRUE : Boolean.FALSE;
                case LETHAN:
                    return ((Double) val1) <= ((Double) val2) ? Boolean.TRUE : Boolean.FALSE;
                case EQUAL:
                    return ((Double) val1).doubleValue() == ((Double) val2).doubleValue() ? Boolean.TRUE : Boolean.FALSE;
                case NEQUAL:
                    return ((Double) val1).doubleValue() != ((Double) val2).doubleValue() ? Boolean.TRUE : Boolean.FALSE;
                case BW_AND:
                case BW_OR:
                case BW_SHIFT_LEFT:
                case BW_SHIFT_RIGHT:
                case BW_USHIFT_RIGHT:
                case BW_XOR:
                    throw new RuntimeException("bitwise operation on a non-fixed-point number.");
            }
        case DataTypes.FLOAT:
        case DataTypes.W_FLOAT:
            switch(operation) {
                case ADD:
                    return ((Float) val1) + ((Float) val2);
                case SUB:
                    return ((Float) val1) - ((Float) val2);
                case DIV:
                    return ((Float) val1).doubleValue() / ((Float) val2).doubleValue();
                case MULT:
                    return ((Float) val1) * ((Float) val2);
                case POWER:
                    return narrowType(new InternalNumber((Float) val1, MATH_CONTEXT).pow(new InternalNumber((Float) val2).intValue(), MATH_CONTEXT), -1);
                case MOD:
                    return ((Float) val1) % ((Float) val2);
                case GTHAN:
                    return ((Float) val1) > ((Float) val2) ? Boolean.TRUE : Boolean.FALSE;
                case GETHAN:
                    return ((Float) val1) >= ((Float) val2) ? Boolean.TRUE : Boolean.FALSE;
                case LTHAN:
                    return ((Float) val1) < ((Float) val2) ? Boolean.TRUE : Boolean.FALSE;
                case LETHAN:
                    return ((Float) val1) <= ((Float) val2) ? Boolean.TRUE : Boolean.FALSE;
                case EQUAL:
                    return ((Float) val1).floatValue() == ((Float) val2).floatValue() ? Boolean.TRUE : Boolean.FALSE;
                case NEQUAL:
                    return ((Float) val1).floatValue() != ((Float) val2).floatValue() ? Boolean.TRUE : Boolean.FALSE;
                case BW_AND:
                case BW_OR:
                case BW_SHIFT_LEFT:
                case BW_SHIFT_RIGHT:
                case BW_USHIFT_RIGHT:
                case BW_XOR:
                    throw new RuntimeException("bitwise operation on a non-fixed-point number.");
            }
        case DataTypes.BIG_INTEGER:
            switch(operation) {
                case ADD:
                    return ((BigInteger) val1).add(((BigInteger) val2));
                case SUB:
                    return ((BigInteger) val1).subtract(((BigInteger) val2));
                case DIV:
                    return ((BigInteger) val1).divide(((BigInteger) val2));
                case MULT:
                    return ((BigInteger) val1).multiply(((BigInteger) val2));
                case POWER:
                    return ((BigInteger) val1).pow(((BigInteger) val2).intValue());
                case MOD:
                    return ((BigInteger) val1).remainder(((BigInteger) val2));
                case GTHAN:
                    return ((BigInteger) val1).compareTo(((BigInteger) val2)) == 1 ? Boolean.TRUE : Boolean.FALSE;
                case GETHAN:
                    return ((BigInteger) val1).compareTo(((BigInteger) val2)) >= 0 ? Boolean.TRUE : Boolean.FALSE;
                case LTHAN:
                    return ((BigInteger) val1).compareTo(((BigInteger) val2)) == -1 ? Boolean.TRUE : Boolean.FALSE;
                case LETHAN:
                    return ((BigInteger) val1).compareTo(((BigInteger) val2)) <= 0 ? Boolean.TRUE : Boolean.FALSE;
                case EQUAL:
                    return ((BigInteger) val1).compareTo(((BigInteger) val2)) == 0 ? Boolean.TRUE : Boolean.FALSE;
                case NEQUAL:
                    return ((BigInteger) val1).compareTo(((BigInteger) val2)) != 0 ? Boolean.TRUE : Boolean.FALSE;
                case BW_AND:
                case BW_OR:
                case BW_SHIFT_LEFT:
                case BW_SHIFT_RIGHT:
                case BW_USHIFT_RIGHT:
                case BW_XOR:
                    throw new RuntimeException("bitwise operation on a number greater than 32-bits not possible");
            }
        default:
            switch(operation) {
                case EQUAL:
                    return safeEquals(val2, val1);
                case NEQUAL:
                    return safeNotEquals(val2, val1);
                case ADD:
                    return valueOf(val1) + valueOf(val2);
            }
    }
    return null;
}
Also used : BigInteger(java.math.BigInteger) InternalNumber(org.mvel2.util.InternalNumber) ArrayList(java.util.ArrayList) BigInteger(java.math.BigInteger) ArrayList(java.util.ArrayList) List(java.util.List)

Aggregations

BigInteger (java.math.BigInteger)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 InternalNumber (org.mvel2.util.InternalNumber)1