You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mb...@apache.org on 2008/06/10 18:34:42 UTC

svn commit: r666186 - in /commons/sandbox/functor/trunk/src: main/java/org/apache/commons/functor/adapter/ test/java/org/apache/commons/functor/adapter/

Author: mbenson
Date: Tue Jun 10 09:34:42 2008
New Revision: 666186

URL: http://svn.apache.org/viewvc?rev=666186&view=rev
Log:
unchecked warnings; move construction-only generic parameters to constructors; throw IllegalArgumentException when null constructor arguments are specified

Modified:
    commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundFunction.java
    commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundPredicate.java
    commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundProcedure.java
    commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundFunction.java
    commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundPredicate.java
    commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundProcedure.java

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundFunction.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundFunction.java?rev=666186&r1=666185&r2=666186&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundFunction.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundFunction.java Tue Jun 10 09:34:42 2008
@@ -38,34 +38,88 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class BoundFunction<A, T> implements Function<T>, Serializable {
-    /** The {@link UnaryFunction UnaryFunction} I'm wrapping. */
-    private UnaryFunction<? super A, ? extends T> function;
-    /** The parameter to pass to that function. */
-    private A param = null;
+public final class BoundFunction<T> implements Function<T>, Serializable {
+    private class Helper<A> implements Function<T>, Serializable {
+        /** The {@link UnaryFunction UnaryFunction} I'm wrapping. */
+        private UnaryFunction<? super A, ? extends T> function;
+
+        /** The parameter to pass to that function. */
+        private A arg = null;
+
+        private Helper(UnaryFunction<? super A, ? extends T> function, A arg) {
+            this.function = function;
+            this.arg = arg;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public T evaluate() {
+            return function.evaluate(arg);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean equals(Object obj) {
+            return obj == this || obj instanceof Helper && equals((Helper<?>) obj);
+        }
+
+        private boolean equals(Helper<?> that) {
+            if (that != null && that.function.equals(this.function)) {
+                return that.arg == this.arg || that.arg != null && that.arg.equals(this.arg);
+            }
+            return false;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public int hashCode() {
+            int result = "BoundFunction$Helper".hashCode();
+            result <<= 2;
+            result |= function.hashCode();
+            result <<= 2;
+            return arg == null ? result : result | arg.hashCode();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public String toString() {
+            return function.toString() + "(" + arg + ")";
+        }
+    }
+
+    private Helper<?> helper;
 
     /**
      * Create a new BoundFunction.
      * @param function the function to adapt
      * @param arg the constant argument to use
      */
-    public BoundFunction(UnaryFunction<? super A, ? extends T> function, A arg) {
-        this.function = function;
-        this.param = arg;
+    public <A> BoundFunction(UnaryFunction<? super A, ? extends T> function, A arg) {
+        if (function == null) {
+            throw new IllegalArgumentException("UnaryFunction argument was null");
+        }
+        this.helper = new Helper<A>(function, arg);
     }
 
     /**
      * {@inheritDoc}
      */
     public T evaluate() {
-        return function.evaluate(param);
+        return helper.evaluate();
     }
 
     /**
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof BoundFunction && equals((BoundFunction<?, ?>) that));
+        return that == this || (that instanceof BoundFunction && equals((BoundFunction<?>) that));
     }
 
     /**
@@ -73,34 +127,22 @@
      * @param that BoundFunction to test
      * @return boolean
      */
-    public boolean equals(BoundFunction<?, ?> that) {
-        return null != that
-                && (null == function ? null == that.function : function.equals(that.function))
-                && (null == param ? null == that.param : param.equals(that.param));
-
+    public boolean equals(BoundFunction<?> that) {
+        return null != that && that.helper.equals(this.helper);
     }
 
     /**
      * {@inheritDoc}
      */
     public int hashCode() {
-        int hash = "BoundFunction".hashCode();
-        if (null != function) {
-            hash <<= 2;
-            hash ^= function.hashCode();
-        }
-        if (null != param) {
-            hash <<= 2;
-            hash ^= param.hashCode();
-        }
-        return hash;
+        return "BoundFunction".hashCode() << 8 | helper.hashCode();
     }
 
     /**
      * {@inheritDoc}
      */
     public String toString() {
-        return "BoundFunction<" + function + "(" + param + ")>";
+        return "BoundFunction<" + helper + ">";
     }
 
     /**
@@ -111,7 +153,8 @@
      * argument.
      * When the given <code>UnaryFunction</code> is <code>null</code>,
      * returns <code>null</code>.
-     *
+     * @param <A>
+     * @param <T>
      * @param function the possibly-<code>null</code>
      *        {@link UnaryFunction UnaryFunction} to adapt
      * @param arg the object to bind as a constant argument
@@ -119,8 +162,8 @@
      *         {@link UnaryFunction UnaryFunction}, or <code>null</code>
      *         if the given <code>UnaryFunction</code> is <code>null</code>
      */
-    public static <A, T> BoundFunction<A, T> bind(UnaryFunction<? super A, ? extends T> function, A arg) {
-        return null == function ? null : new BoundFunction<A, T>(function, arg);
+    public static <A, T> BoundFunction<T> bind(UnaryFunction<? super A, ? extends T> function, A arg) {
+        return null == function ? null : new BoundFunction<T>(function, arg);
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundPredicate.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundPredicate.java?rev=666186&r1=666185&r2=666186&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundPredicate.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundPredicate.java Tue Jun 10 09:34:42 2008
@@ -38,19 +38,23 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class BoundPredicate<A> implements Predicate, Serializable {
+public final class BoundPredicate implements Predicate, Serializable {
     /** The {@link UnaryPredicate UnaryPredicate} I'm wrapping. */
-    private UnaryPredicate<? super A> predicate;
+    private UnaryPredicate<Object> predicate;
     /** The parameter to pass to that predicate. */
-    private A param;
+    private Object param;
 
     /**
      * Create a new BoundPredicate.
      * @param predicate the predicate to adapt
      * @param arg the constant argument to use
      */
-    public BoundPredicate(UnaryPredicate<? super A> predicate, A arg) {
-        this.predicate = predicate;
+    @SuppressWarnings("unchecked")
+    public <A> BoundPredicate(UnaryPredicate<? super A> predicate, A arg) {
+        if (predicate == null) {
+            throw new IllegalArgumentException("UnaryPredicate argument was null");
+        }
+        this.predicate = (UnaryPredicate<Object>) predicate;
         this.param = arg;
     }
 
@@ -65,7 +69,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof BoundPredicate && equals((BoundPredicate<?>) that));
+        return that == this || (that instanceof BoundPredicate && equals((BoundPredicate) that));
     }
 
     /**
@@ -73,7 +77,7 @@
      * @param that BoundPredicate to test
      * @return boolean
      */
-    public boolean equals(BoundPredicate<?> that) {
+    public boolean equals(BoundPredicate that) {
         return null != that
                 && (null == predicate ? null == that.predicate : predicate.equals(that.predicate))
                 && (null == param ? null == that.param : param.equals(that.param));
@@ -119,8 +123,8 @@
      *         {@link UnaryPredicate UnaryPredicate}, or <code>null</code>
      *         if the given <code>UnaryPredicate</code> is <code>null</code>
      */
-    public static <A> BoundPredicate<A> bind(UnaryPredicate<? super A> predicate, A arg) {
-        return null == predicate ? null : new BoundPredicate<A>(predicate, arg);
+    public static <A> BoundPredicate bind(UnaryPredicate<? super A> predicate, A arg) {
+        return null == predicate ? null : new BoundPredicate(predicate, arg);
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundProcedure.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundProcedure.java?rev=666186&r1=666185&r2=666186&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundProcedure.java (original)
+++ commons/sandbox/functor/trunk/src/main/java/org/apache/commons/functor/adapter/BoundProcedure.java Tue Jun 10 09:34:42 2008
@@ -38,19 +38,23 @@
  * @version $Revision$ $Date$
  * @author Rodney Waldhoff
  */
-public final class BoundProcedure<A> implements Procedure, Serializable {
+public final class BoundProcedure implements Procedure, Serializable {
     /** The {@link UnaryProcedure UnaryProcedure} I'm wrapping. */
-    private UnaryProcedure<? super A> procedure;
+    private UnaryProcedure<Object> procedure;
     /** The parameter to pass to that procedure. */
-    private A param;
+    private Object param;
 
     /**
      * Create a new BoundProcedure.
      * @param procedure the procedure to adapt
      * @param arg the constant argument to use
      */
-    public BoundProcedure(UnaryProcedure<? super A> procedure, A arg) {
-        this.procedure = procedure;
+    @SuppressWarnings("unchecked")
+    public <A> BoundProcedure(UnaryProcedure<? super A> procedure, A arg) {
+        if (procedure == null) {
+            throw new IllegalArgumentException("UnaryProcedure argument was null");
+        }
+        this.procedure = (UnaryProcedure<Object>) procedure;
         this.param = arg;
     }
 
@@ -65,7 +69,7 @@
      * {@inheritDoc}
      */
     public boolean equals(Object that) {
-        return that == this || (that instanceof BoundProcedure && equals((BoundProcedure<?>) that));
+        return that == this || (that instanceof BoundProcedure && equals((BoundProcedure) that));
     }
 
     /**
@@ -73,7 +77,7 @@
      * @param that the BoundProcedure to test
      * @return boolean
      */
-    public boolean equals(BoundProcedure<?> that) {
+    public boolean equals(BoundProcedure that) {
         return null != that
                 && (null == procedure ? null == that.procedure : procedure.equals(that.procedure))
                 && (null == param ? null == that.param : param.equals(that.param));
@@ -118,8 +122,8 @@
      *         {@link UnaryProcedure UnaryProcedure}, or <code>null</code>
      *         if the given <code>UnaryProcedure</code> is <code>null</code>
      */
-    public static <A> BoundProcedure<A> bind(UnaryProcedure<? super A> procedure, A arg) {
-        return null == procedure ? null : new BoundProcedure<A>(procedure, arg);
+    public static <A> BoundProcedure bind(UnaryProcedure<? super A> procedure, A arg) {
+        return null == procedure ? null : new BoundProcedure(procedure, arg);
     }
 
 }

Modified: commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundFunction.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundFunction.java?rev=666186&r1=666185&r2=666186&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundFunction.java (original)
+++ commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundFunction.java Tue Jun 10 09:34:42 2008
@@ -45,7 +45,7 @@
     // ------------------------------------------------------------------------
 
     protected Object makeFunctor() {
-        return new BoundFunction(new Identity(),"xyzzy");
+        return new BoundFunction<Object>(Identity.INSTANCE,"xyzzy");
     }
 
     // Lifecycle
@@ -63,20 +63,18 @@
     // ------------------------------------------------------------------------
 
     public void testEvaluate() throws Exception {
-        Function f = new BoundFunction(new Identity(),"xyzzy");
+        Function<Object> f = new BoundFunction<Object>(Identity.INSTANCE,"xyzzy");
         assertEquals("xyzzy",f.evaluate());
     }
 
     public void testEquals() throws Exception {
-        Function f = new BoundFunction(new Identity(),"xyzzy");
+        Function<Object> f = new BoundFunction<Object>(Identity.INSTANCE,"xyzzy");
         assertEquals(f,f);
-        assertObjectsAreEqual(f,new BoundFunction(new Identity(),"xyzzy"));
-        assertObjectsAreNotEqual(f,new Constant("xyzzy"));
-        assertObjectsAreNotEqual(f,new BoundFunction(new Identity(),"foo"));
-        assertObjectsAreNotEqual(f,new BoundFunction(new Constant("xyzzy"),"foo"));
-        assertObjectsAreNotEqual(f,new BoundFunction(null,"xyzzy"));
-        assertObjectsAreNotEqual(f,new BoundFunction(new Identity(),null));
-        assertObjectsAreEqual(new BoundFunction(null,null),new BoundFunction(null,null));
+        assertObjectsAreEqual(f,new BoundFunction<Object>(Identity.INSTANCE,"xyzzy"));
+        assertObjectsAreNotEqual(f,Constant.of("xyzzy"));
+        assertObjectsAreNotEqual(f,new BoundFunction<Object>(Identity.INSTANCE,"foo"));
+        assertObjectsAreNotEqual(f,new BoundFunction<Object>(Constant.of("xyzzy"),"foo"));
+        assertObjectsAreNotEqual(f,new BoundFunction<Object>(Identity.INSTANCE,null));
     }
 
     public void testAdaptNull() throws Exception {
@@ -84,7 +82,7 @@
     }
 
     public void testAdapt() throws Exception {
-        assertNotNull(BoundFunction.bind(new Identity(),"xyzzy"));
-        assertNotNull(BoundFunction.bind(new Identity(),null));
+        assertNotNull(BoundFunction.bind(Identity.INSTANCE,"xyzzy"));
+        assertNotNull(BoundFunction.bind(Identity.INSTANCE,null));
     }
 }

Modified: commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundPredicate.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundPredicate.java?rev=666186&r1=666185&r2=666186&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundPredicate.java (original)
+++ commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundPredicate.java Tue Jun 10 09:34:42 2008
@@ -45,7 +45,7 @@
     // ------------------------------------------------------------------------
 
     protected Object makeFunctor() {
-        return new BoundPredicate(new Constant(true),"xyzzy");
+        return new BoundPredicate(Constant.TRUE,"xyzzy");
     }
 
     // Lifecycle
@@ -64,25 +64,23 @@
 
     public void testTest() throws Exception {
         {
-            Predicate p = new BoundPredicate(new UnaryFunctionUnaryPredicate(new Identity()),Boolean.TRUE);
+            Predicate p = new BoundPredicate(new UnaryFunctionUnaryPredicate<Boolean>(Identity.<Boolean>instance()),Boolean.TRUE);
             assertEquals(true,p.test());
         }
         {
-            Predicate p = new BoundPredicate(new UnaryFunctionUnaryPredicate(new Identity()),Boolean.FALSE);
+            Predicate p = new BoundPredicate(new UnaryFunctionUnaryPredicate<Boolean>(Identity.<Boolean>instance()),Boolean.FALSE);
             assertEquals(false,p.test());
         }
     }
 
     public void testEquals() throws Exception {
-        Predicate f = new BoundPredicate(new Constant(true),"xyzzy");
+        Predicate f = new BoundPredicate(Constant.TRUE,"xyzzy");
         assertEquals(f,f);
-        assertObjectsAreEqual(f,new BoundPredicate(new Constant(true),"xyzzy"));
-        assertObjectsAreNotEqual(f,new Constant(true));
-        assertObjectsAreNotEqual(f,new BoundPredicate(new Constant(true),"foo"));
-        assertObjectsAreNotEqual(f,new BoundPredicate(new Constant(false),"xyzzy"));
-        assertObjectsAreNotEqual(f,new BoundPredicate(null,"xyzzy"));
-        assertObjectsAreNotEqual(f,new BoundPredicate(new Constant(true),null));
-        assertObjectsAreEqual(new BoundPredicate(null,null),new BoundPredicate(null,null));
+        assertObjectsAreEqual(f,new BoundPredicate(Constant.TRUE,"xyzzy"));
+        assertObjectsAreNotEqual(f,Constant.TRUE);
+        assertObjectsAreNotEqual(f,new BoundPredicate(Constant.TRUE,"foo"));
+        assertObjectsAreNotEqual(f,new BoundPredicate(Constant.FALSE,"xyzzy"));
+        assertObjectsAreNotEqual(f,new BoundPredicate(Constant.TRUE,null));
     }
 
     public void testAdaptNull() throws Exception {
@@ -90,7 +88,7 @@
     }
 
     public void testAdapt() throws Exception {
-        assertNotNull(BoundPredicate.bind(new Constant(true),"xyzzy"));
-        assertNotNull(BoundPredicate.bind(new Constant(true),null));
+        assertNotNull(BoundPredicate.bind(Constant.TRUE,"xyzzy"));
+        assertNotNull(BoundPredicate.bind(Constant.TRUE,null));
     }
 }

Modified: commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundProcedure.java
URL: http://svn.apache.org/viewvc/commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundProcedure.java?rev=666186&r1=666185&r2=666186&view=diff
==============================================================================
--- commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundProcedure.java (original)
+++ commons/sandbox/functor/trunk/src/test/java/org/apache/commons/functor/adapter/TestBoundProcedure.java Tue Jun 10 09:34:42 2008
@@ -45,7 +45,7 @@
     // ------------------------------------------------------------------------
 
     protected Object makeFunctor() {
-        return new BoundProcedure(new NoOp(),"xyzzy");
+        return new BoundProcedure(NoOp.INSTANCE,"xyzzy");
     }
 
     // Lifecycle
@@ -63,20 +63,18 @@
     // ------------------------------------------------------------------------
 
     public void testRun() throws Exception {
-        Procedure p = new BoundProcedure(new UnaryFunctionUnaryProcedure(new Identity()),Boolean.TRUE);
+        Procedure p = new BoundProcedure(new UnaryFunctionUnaryProcedure<Object>(Identity.INSTANCE),Boolean.TRUE);
         p.run();
     }
 
     public void testEquals() throws Exception {
-        Procedure f = new BoundProcedure(new NoOp(),"xyzzy");
+        Procedure f = new BoundProcedure(NoOp.INSTANCE,"xyzzy");
         assertEquals(f,f);
-        assertObjectsAreEqual(f,new BoundProcedure(new NoOp(),"xyzzy"));
-        assertObjectsAreNotEqual(f,new NoOp());
-        assertObjectsAreNotEqual(f,new BoundProcedure(new NoOp(),"foo"));
-        assertObjectsAreNotEqual(f,new BoundProcedure(new UnaryFunctionUnaryProcedure(new Identity()),"xyzzy"));
-        assertObjectsAreNotEqual(f,new BoundProcedure(null,"xyzzy"));
-        assertObjectsAreNotEqual(f,new BoundProcedure(new NoOp(),null));
-        assertObjectsAreEqual(new BoundProcedure(null,null),new BoundProcedure(null,null));
+        assertObjectsAreEqual(f,new BoundProcedure(NoOp.INSTANCE,"xyzzy"));
+        assertObjectsAreNotEqual(f,NoOp.INSTANCE);
+        assertObjectsAreNotEqual(f,new BoundProcedure(NoOp.INSTANCE,"foo"));
+        assertObjectsAreNotEqual(f,new BoundProcedure(new UnaryFunctionUnaryProcedure<Object>(Identity.INSTANCE),"xyzzy"));
+        assertObjectsAreNotEqual(f,new BoundProcedure(NoOp.INSTANCE,null));
     }
 
     public void testAdaptNull() throws Exception {