All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.moon.runner.core.Computes Maven / Gradle / Ivy

package com.moon.runner.core;

import java.util.Objects;

/**
 * @author moonsky
 */
enum Computes implements AsCompute {
    /**
     * 这个符号仅用于提升优先级的标记,没有计算意义
     */
    YUAN_LEFT(ConstPriorities.MAX),

    BIT_LEFT(ConstPriorities.BIT_LEFT) {
        @Override
        public Object exe(Object o2, Object o1) { return ((Number) o1).intValue() << ((Number) o2).intValue(); }
    },
    UN_BIT_RIGHT(ConstPriorities.UN_BIT_RIGHT) {
        @Override
        public Object exe(Object o2, Object o1) { return ((Number) o1).intValue() >>> ((Number) o2).intValue(); }
    },
    BIT_RIGHT(ConstPriorities.BIT_RIGHT) {
        @Override
        public Object exe(Object o2, Object o1) { return ((Number) o1).intValue() >> ((Number) o2).intValue(); }
    },
    BIT_AND(ConstPriorities.BIT_AND) {
        @Override
        public Object exe(Object o2, Object o1) {
            if (o1 instanceof Number || o2 instanceof Number) {
                return ((Number) o1).intValue() & ((Number) o2).intValue();
            }
            return ((Boolean) o1).booleanValue() & ((Boolean) o2).booleanValue();
        }
    },
    BIT_OR(ConstPriorities.BIT_OR) {
        @Override
        public Object exe(Object o2, Object o1) {
            if (o1 instanceof Number || o2 instanceof Number) {
                return ((Number) o1).intValue() | ((Number) o2).intValue();
            }
            return ((Boolean) o1).booleanValue() | ((Boolean) o2).booleanValue();
        }
    },
    NOT_OR(ConstPriorities.NOT_OR) {
        @Override
        public Object exe(Object o2, Object o1) {
            if (o1 instanceof Number || o2 instanceof Number) {
                return ((Number) o1).intValue() ^ ((Number) o2).intValue();
            }
            return ((Boolean) o1).booleanValue() ^ ((Boolean) o2).booleanValue();
        }
    },

    PLUS(ConstPriorities.PLUS) {
        @Override
        public Object exe(Object o2, Object o1) {
            if (o1 instanceof Number && o2 instanceof Number) {
                if (o1 instanceof Integer && o2 instanceof Integer) {
                    return ((Number) o1).intValue() + ((Number) o2).intValue();
                }
                return ((Number) o1).doubleValue() + ((Number) o2).doubleValue();
            }
            return String.valueOf(o1) + o2;
        }
    },
    MINUS(ConstPriorities.MINUS) {
        @Override
        public Object exe(Object o2, Object o1) {
            if (o1 instanceof Double || o2 instanceof Double || o1 instanceof Float || o2 instanceof Float) {
                return ((Number) o1).doubleValue() - ((Number) o2).doubleValue();
            }
            return ((Number) o1).intValue() - ((Number) o2).intValue();
        }
    },
    MULTI(ConstPriorities.MULTI) {
        @Override
        public Object exe(Object o2, Object o1) {
            if (o1 instanceof Double || o2 instanceof Double || o1 instanceof Float || o2 instanceof Float) {
                return ((Number) o1).doubleValue() * ((Number) o2).doubleValue();
            }
            return ((Number) o1).intValue() * ((Number) o2).intValue();
        }
    },
    DIVIDE(ConstPriorities.DIVIDE) {
        @Override
        public Object exe(Object o2, Object o1) {
            if (o1 instanceof Double || o2 instanceof Double || o1 instanceof Float || o2 instanceof Float) {
                return ((Number) o1).doubleValue() / ((Number) o2).doubleValue();
            }
            return ((Number) o1).intValue() / ((Number) o2).intValue();
        }
    },
    MOD(ConstPriorities.MOD) {
        @Override
        public Object exe(Object o2, Object o1) {
            if (o1 instanceof Double || o2 instanceof Double || o1 instanceof Float || o2 instanceof Float) {
                return ((Number) o1).doubleValue() % ((Number) o2).doubleValue();
            }
            return ((Number) o1).intValue() % ((Number) o2).intValue();
        }
    },
    AND(ConstPriorities.AND) {
        /**
         * 计算
         *
         * @param right
         * @param left
         * @param data
         * @return
         */
        @Override
        public Object exe(AsRunner right, AsRunner left, Object data) {
            return (Boolean) left.run(data) && (Boolean) right.run(data);
        }
    },
    OR(ConstPriorities.OR) {
        /**
         * 计算
         *
         * @param right
         * @param left
         * @param data
         * @return
         */
        @Override
        public Object exe(AsRunner right, AsRunner left, Object data) {
            return (Boolean) left.run(data) || (Boolean) right.run(data);
        }
    },
    NOT_EQ(ConstPriorities.NOT_EQ) {
        @Override
        public Object exe(Object right, Object left) {
            if (right == left) {
                return false;
            }
            if (right instanceof Number && left instanceof Number) {
                if (right instanceof Double ||
                    right instanceof Float ||
                    left instanceof Double ||
                    left instanceof Float) {
                    return ((Number) right).doubleValue() == ((Number) left).doubleValue();
                }
                return ((Number) right).intValue() == ((Number) left).intValue();
            }
            return Boolean.valueOf(!Objects.equals(right, left));
        }
    },
    EQ(ConstPriorities.EQ) {
        @Override
        public Object exe(Object o2, Object o1) {
            if (o1 == o2) {
                return true;
            }
            if (o1 instanceof Number && o2 instanceof Number) {
                if (o1 instanceof Double || o1 instanceof Float || o2 instanceof Double || o2 instanceof Float) {
                    return ((Number) o1).doubleValue() == ((Number) o2).doubleValue();
                }
                return ((Number) o1).intValue() == ((Number) o2).intValue();
            }
            return Boolean.valueOf(Objects.equals(o1, o2));
        }
    },
    GT(ConstPriorities.GT) {
        @Override
        public Object exe(Object o2, Object o1) {
            if (o1 == o2 || o1 == null) {
                return Boolean.FALSE;
            }
            if (o2 == null) {
                return Boolean.TRUE;
            }
            if (o1 instanceof Number && o2 instanceof Number) {
                if (o1 instanceof Double || o1 instanceof Float || o2 instanceof Double || o2 instanceof Float) {
                    return ((Number) o1).doubleValue() > ((Number) o2).doubleValue();
                }
                return ((Number) o1).intValue() > ((Number) o2).intValue();
            }
            return ((Comparable) o1).compareTo(o2) > 0;
        }
    },
    LT(ConstPriorities.LT) {
        @Override
        public Object exe(Object o2, Object o1) {
            if (o1 == o2 || o2 == null) {
                return Boolean.FALSE;
            }
            if (o1 == null) {
                return Boolean.TRUE;
            }
            if (o1 instanceof Number && o2 instanceof Number) {
                if (o1 instanceof Double || o1 instanceof Float || o2 instanceof Double || o2 instanceof Float) {
                    return ((Number) o1).doubleValue() < ((Number) o2).doubleValue();
                }
                return ((Number) o1).intValue() < ((Number) o2).intValue();
            }
            return ((Comparable) o1).compareTo(o2) < 0;
        }
    },
    GT_OR_EQ(ConstPriorities.GT_OR_EQ) {
        @Override
        public Object exe(Object o2, Object o1) {
            if (o1 == o2 || o2 == null) {
                return true;
            }
            if (o1 == null) {
                return false;
            }
            if (o1 instanceof Number && o2 instanceof Number) {
                if (o1 instanceof Double || o1 instanceof Float || o2 instanceof Double || o2 instanceof Float) {
                    return ((Number) o1).doubleValue() >= ((Number) o2).doubleValue();
                }
                return ((Number) o1).intValue() >= ((Number) o2).intValue();
            }
            return ((Comparable) o1).compareTo(o2) >= 0;
        }
    },
    LT_OR_EQ(ConstPriorities.LT_OR_EQ) {
        @Override
        public Object exe(Object o2, Object o1) {
            if (o1 == o2 || o1 == null) {
                return true;
            }
            if (o2 == null) {
                return false;
            }
            if (o1 instanceof Number && o2 instanceof Number) {
                if (o1 instanceof Double || o1 instanceof Float || o2 instanceof Double || o2 instanceof Float) {
                    return ((Number) o1).doubleValue() <= ((Number) o2).doubleValue();
                }
                return ((Number) o1).intValue() <= ((Number) o2).intValue();
            }
            return ((Comparable) o1).compareTo(o2) <= 0;
        }
    };

    private final int priority;

    Computes(int priority) { this.priority = priority; }

    @Override
    public int getPriority() { return priority; }}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy