You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2021/09/19 13:13:00 UTC

[groovy] branch master updated: Trivial tweak for comparing

This is an automated email from the ASF dual-hosted git repository.

sunlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new 4eb595f  Trivial tweak for comparing
4eb595f is described below

commit 4eb595f93f814576bce1794d55b4fd9395496442
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sun Sep 19 19:17:57 2021 +0800

    Trivial tweak for comparing
---
 .../groovy/runtime/ScriptBytecodeAdapter.java      | 125 ++++++++++++++++-----
 1 file changed, 95 insertions(+), 30 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java b/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java
index 9c19475..b3dfce5 100644
--- a/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java
+++ b/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java
@@ -39,6 +39,8 @@ import org.codehaus.groovy.runtime.wrappers.GroovyObjectWrapper;
 import org.codehaus.groovy.runtime.wrappers.PojoWrapper;
 import org.codehaus.groovy.runtime.wrappers.Wrapper;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -725,18 +727,37 @@ public class ScriptBytecodeAdapter {
     }
 
     public static boolean compareEqual(Object left, Object right) {
-        if (left==right) return true;
-        Class<?> leftClass = left==null?null:left.getClass();
-        Class<?> rightClass = right==null?null:right.getClass();
-        if (leftClass ==Integer.class && rightClass==Integer.class) {
+        if (left == right) return true;
+
+        Class<?> leftClass = left == null ? null : left.getClass();
+        Class<?> rightClass = right == null ? null : right.getClass();
+
+        if (leftClass == Integer.class && rightClass == Integer.class) {
+            return left.equals(right);
+        }
+        if (leftClass == BigDecimal.class && rightClass == BigDecimal.class) {
+            return ((BigDecimal) left).compareTo((BigDecimal) right) == 0;
+        }
+        if (leftClass == BigInteger.class && rightClass == BigInteger.class) {
+            return ((BigInteger) left).compareTo((BigInteger) right) == 0;
+        }
+        if (leftClass == Long.class && rightClass == Long.class) {
+            return left.equals(right);
+        }
+        if (leftClass == Double.class && rightClass == Double.class) {
+            return left.equals(right);
+        }
+        if (leftClass == Float.class && rightClass == Float.class) {
             return left.equals(right);
         }
-        if (leftClass ==Double.class && rightClass==Double.class) {
+
+        if (leftClass == String.class && rightClass == String.class) {
             return left.equals(right);
         }
-        if (leftClass ==Long.class && rightClass==Long.class) {
+        if (leftClass == GStringImpl.class && rightClass == GStringImpl.class) {
             return left.equals(right);
         }
+
         return DefaultTypeTransformation.compareEqual(left, right);
     }
 
@@ -754,62 +775,106 @@ public class ScriptBytecodeAdapter {
     }
 
     public static boolean compareLessThan(Object left, Object right) {
-        Class<?> leftClass = left==null?null:left.getClass();
-        Class<?> rightClass = right==null?null:right.getClass();
-        if (leftClass ==Integer.class && rightClass==Integer.class) {
+        Class<?> leftClass = left == null ? null : left.getClass();
+        Class<?> rightClass = right == null ? null : right.getClass();
+
+        if (leftClass == Integer.class && rightClass == Integer.class) {
             return (Integer) left < (Integer) right;
         }
-        if (leftClass ==Double.class && rightClass==Double.class) {
-            return (Double) left < (Double) right;
+        if (leftClass == BigDecimal.class && rightClass == BigDecimal.class) {
+            return ((BigDecimal) left).compareTo((BigDecimal) right) < 0;
+        }
+        if (leftClass == BigInteger.class && rightClass == BigInteger.class) {
+            return ((BigInteger) left).compareTo((BigInteger) right) < 0;
         }
-        if (leftClass ==Long.class && rightClass==Long.class) {
+        if (leftClass == Long.class && rightClass == Long.class) {
             return (Long) left < (Long) right;
         }
+        if (leftClass == Double.class && rightClass == Double.class) {
+            return (Double) left < (Double) right;
+        }
+        if (leftClass == Float.class && rightClass == Float.class) {
+            return (Float) left < (Float) right;
+        }
+
         return compareTo(left, right) < 0;
     }
 
     public static boolean compareLessThanEqual(Object left, Object right) {
-        Class<?> leftClass = left==null?null:left.getClass();
-        Class<?> rightClass = right==null?null:right.getClass();
-        if (leftClass ==Integer.class && rightClass==Integer.class) {
+        Class<?> leftClass = left == null ? null : left.getClass();
+        Class<?> rightClass = right == null ? null : right.getClass();
+
+        if (leftClass == Integer.class && rightClass == Integer.class) {
             return (Integer) left <= (Integer) right;
         }
-        if (leftClass ==Double.class && rightClass==Double.class) {
-            return (Double) left <= (Double) right;
+        if (leftClass == BigDecimal.class && rightClass == BigDecimal.class) {
+            return ((BigDecimal) left).compareTo((BigDecimal) right) <= 0;
+        }
+        if (leftClass == BigInteger.class && rightClass == BigInteger.class) {
+            return ((BigInteger) left).compareTo((BigInteger) right) <= 0;
         }
-        if (leftClass ==Long.class && rightClass==Long.class) {
+        if (leftClass == Long.class && rightClass == Long.class) {
             return (Long) left <= (Long) right;
         }
+        if (leftClass == Double.class && rightClass == Double.class) {
+            return (Double) left <= (Double) right;
+        }
+        if (leftClass == Float.class && rightClass == Float.class) {
+            return (Float) left <= (Float) right;
+        }
+
         return compareTo(left, right) <= 0;
     }
 
     public static boolean compareGreaterThan(Object left, Object right) {
-        Class<?> leftClass = left==null?null:left.getClass();
-        Class<?> rightClass = right==null?null:right.getClass();
-        if (leftClass ==Integer.class && rightClass==Integer.class) {
+        Class<?> leftClass = left == null ? null : left.getClass();
+        Class<?> rightClass = right == null ? null : right.getClass();
+
+        if (leftClass == Integer.class && rightClass == Integer.class) {
             return (Integer) left > (Integer) right;
         }
-        if (leftClass ==Double.class && rightClass==Double.class) {
-            return (Double) left > (Double) right;
+        if (leftClass == BigDecimal.class && rightClass == BigDecimal.class) {
+            return ((BigDecimal) left).compareTo((BigDecimal) right) > 0;
         }
-        if (leftClass ==Long.class && rightClass==Long.class) {
+        if (leftClass == BigInteger.class && rightClass == BigInteger.class) {
+            return ((BigInteger) left).compareTo((BigInteger) right) > 0;
+        }
+        if (leftClass == Long.class && rightClass == Long.class) {
             return (Long) left > (Long) right;
         }
+        if (leftClass == Double.class && rightClass == Double.class) {
+            return (Double) left > (Double) right;
+        }
+        if (leftClass == Float.class && rightClass == Float.class) {
+            return (Float) left > (Float) right;
+        }
+
         return compareTo(left, right) > 0;
     }
 
     public static boolean compareGreaterThanEqual(Object left, Object right) {
-        Class<?> leftClass = left==null?null:left.getClass();
-        Class<?> rightClass = right==null?null:right.getClass();
-        if (leftClass ==Integer.class && rightClass==Integer.class) {
+        Class<?> leftClass = left == null ? null : left.getClass();
+        Class<?> rightClass = right == null ? null : right.getClass();
+
+        if (leftClass == Integer.class && rightClass == Integer.class) {
             return (Integer) left >= (Integer) right;
         }
-        if (leftClass ==Double.class && rightClass==Double.class) {
-            return (Double) left >= (Double) right;
+        if (leftClass == BigDecimal.class && rightClass == BigDecimal.class) {
+            return ((BigDecimal) left).compareTo((BigDecimal) right) >= 0;
         }
-        if (leftClass ==Long.class && rightClass==Long.class) {
+        if (leftClass == BigInteger.class && rightClass == BigInteger.class) {
+            return ((BigInteger) left).compareTo((BigInteger) right) >= 0;
+        }
+        if (leftClass == Long.class && rightClass == Long.class) {
             return (Long) left >= (Long) right;
         }
+        if (leftClass == Double.class && rightClass == Double.class) {
+            return (Double) left >= (Double) right;
+        }
+        if (leftClass == Float.class && rightClass == Float.class) {
+            return (Float) left >= (Float) right;
+        }
+
         return compareTo(left, right) >= 0;
     }