You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@velocity.apache.org by cb...@apache.org on 2011/07/11 14:32:14 UTC

svn commit: r1145145 - /velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/MathTool.java

Author: cbrisson
Date: Mon Jul 11 12:32:14 2011
New Revision: 1145145

URL: http://svn.apache.org/viewvc?rev=1145145&view=rev
Log:
MathTool: fixed result type calculations and added bitwise operations

Modified:
    velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/MathTool.java

Modified: velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/MathTool.java
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/MathTool.java?rev=1145145&r1=1145144&r2=1145145&view=diff
==============================================================================
--- velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/MathTool.java (original)
+++ velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/MathTool.java Mon Jul 11 12:32:14 2011
@@ -89,6 +89,21 @@ public class MathTool extends FormatConf
         return min(new Object[] { num1, num2 });
     }
 
+    public Number bitwiseOr(Object num1, Object num2)
+    {
+        return bitwiseOr(new Object[] { num1, num2 });
+    }
+
+    public Number bitwiseAnd(Object num1, Object num2)
+    {
+        return bitwiseAnd(new Object[] { num1, num2 });
+    }
+
+    public Number bitwiseXOr(Object num1, Object num2)
+    {
+        return bitwiseXOr(new Object[] { num1, num2 });
+    }
+
     /**
      * @param nums the numbers to be added
      * @return the sum of the numbers or
@@ -99,14 +114,15 @@ public class MathTool extends FormatConf
     {
         double value = 0;
         Number[] ns = new Number[nums.length];
-        for (Object num : nums)
+        for (int i=0; i<nums.length; i++)
         {
-            Number n = toNumber(num);
+            Number n = toNumber(nums[i]);
             if (n == null)
             {
                 return null;
             }
             value += n.doubleValue();
+            ns[i] = n;
         }
         return matchType(value, ns);
     }
@@ -137,6 +153,7 @@ public class MathTool extends FormatConf
             {
                 value -= n.doubleValue();
             }
+            ns[i] = n;
         }
         return matchType(value, ns);
     }
@@ -152,14 +169,15 @@ public class MathTool extends FormatConf
     {
         double value = 1;
         Number[] ns = new Number[nums.length];
-        for (Object num : nums)
+        for (int i=0; i<nums.length; i++)
         {
-            Number n = toNumber(num);
+            Number n = toNumber(nums[i]);
             if (n == null)
             {
                 return null;
             }
             value *= n.doubleValue();
+            ns[i] = n;
         }
         return matchType(value, ns);
     }
@@ -196,6 +214,7 @@ public class MathTool extends FormatConf
                 }
                 value /= denominator;
             }
+            ns[i] = n;
         }
         return matchType(value, ns);
     }
@@ -272,6 +291,79 @@ public class MathTool extends FormatConf
 
 
     /**
+     * Bitwise Or
+     * @param nums the numbers to be Or'ed
+     * @return the bitwise Or of the numbers or
+     *         <code>null</code> if they're invalid
+     * @see #toInteger
+     */
+    public Number bitwiseOr(Object... nums)
+    {
+        long value = 0;
+        Number[] ns = new Number[nums.length];
+        for (int i=0; i<nums.length; i++)
+        {
+            Long n = toLong(nums[i]);
+            if (n == null)
+            {
+                return null;
+            }
+            value |= n.longValue();
+            ns[i] = n;
+        }
+        return matchType(value, ns);
+    }
+
+    /**
+     * Bitwise And
+     * @param nums the numbers to be And'ed
+     * @return the bitwise And of the numbers or
+     *         <code>null</code> if they're invalid
+     * @see #toInteger
+     */
+    public Number bitwiseAnd(Object... nums)
+    {
+        long value = Long.MIN_VALUE;
+        Number[] ns = new Number[nums.length];
+        for (int i=0; i<nums.length; i++)
+        {
+            Long n = toLong(nums[i]);
+            if (n == null)
+            {
+                return null;
+            }
+            value &= n.longValue();
+            ns[i] = n;
+        }
+        return matchType(value, ns);
+    }
+
+    /**
+     * Bitwise XOr
+     * @param nums the numbers to be XOr'ed
+     * @return the bitwise XOr of the numbers or
+     *         <code>null</code> if they're invalid
+     * @see #toInteger
+     */
+    public Number bitwiseXOr(Object... nums)
+    {
+        long value = 0;
+        Number[] ns = new Number[nums.length];
+        for (int i=0; i<nums.length; i++)
+        {
+            Long n = toLong(nums[i]);
+            if (n == null)
+            {
+                return null;
+            }
+            value ^= n.longValue();
+            ns[i] = n;
+        }
+        return matchType(value, ns);
+    }
+
+
+    /**
      * @param nums the numbers to be searched
      * @return the largest of the numbers or
      *         <code>null</code> if they're invalid
@@ -281,14 +373,15 @@ public class MathTool extends FormatConf
     {
         double value = Double.MIN_VALUE;
         Number[] ns = new Number[nums.length];
-        for (Object num : nums)
+        for (int i=0; i<nums.length; i++)
         {
-            Number n = toNumber(num);
+            Number n = toNumber(nums[i]);
             if (n == null)
             {
                 return null;
             }
             value = Math.max(value, n.doubleValue());
+            ns[i] = n;
         }
         return matchType(value, ns);
     }
@@ -304,14 +397,15 @@ public class MathTool extends FormatConf
     {
         double value = Double.MAX_VALUE;
         Number[] ns = new Number[nums.length];
-        for (Object num : nums)
+        for (int i=0; i<nums.length; i++)
         {
-            Number n = toNumber(num);
+            Number n = toNumber(nums[i]);
             if (n == null)
             {
                 return null;
             }
             value = Math.min(value, n.doubleValue());
+            ns[i] = n;
         }
         return matchType(value, ns);
     }
@@ -493,6 +587,24 @@ public class MathTool extends FormatConf
         return Integer.valueOf(n.intValue());
     }
 
+    /**
+     * Converts an object with a numeric value into a Long integer
+     * Valid formats are {@link Number} or a {@link String}
+     * representation of a number
+     *
+     * @param num the number to be converted
+     * @return a {@link Long} integer representation of the number
+     *         or <code>null</code> if it's invalid
+     */
+    public Long toLong(Object num)
+    {
+        Number n = toNumber(num);
+        if (n == null)
+        {
+            return null;
+        }
+        return Long.valueOf(n.longValue());
+    }
 
     /**
      * Converts an object with a numeric value into a Double