Author: desruisseaux
Date: Thu Nov  1 12:54:19 2012
New Revision: 1404569

URL: http://svn.apache.org/viewvc?rev=1404569&view=rev
Log:
Added a check for the bijective function case.

Modified:
    
sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedMap.java
    
sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedSet.java

Modified: 
sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedMap.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedMap.java?rev=1404569&r1=1404568&r2=1404569&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedMap.java
 (original)
+++ 
sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedMap.java
 Thu Nov  1 12:54:19 2012
@@ -151,7 +151,7 @@ class DerivedMap<BK,BV,K,V> extends Abst
      */
     @Override
     public int size() {
-        return base.isEmpty() ? 0 : keySet().size();
+        return keySet().size();
     }
 
     /**

Modified: 
sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedSet.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedSet.java?rev=1404569&r1=1404568&r2=1404569&view=diff
==============================================================================
--- 
sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedSet.java
 (original)
+++ 
sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/collection/DerivedSet.java
 Thu Nov  1 12:54:19 2012
@@ -19,6 +19,7 @@ package org.apache.sis.util.collection;
 import java.util.Set;
 import java.util.Iterator;
 import java.util.AbstractSet;
+import java.util.EnumSet;
 import java.io.Serializable;
 import org.apache.sis.util.Decorator;
 import org.apache.sis.util.ObjectConverter;
@@ -87,6 +88,9 @@ class DerivedSet<B,E> extends AbstractSe
     static <B,E> Set<E> create(final Set<B> base, final ObjectConverter<B,E> 
converter) {
         final Set<FunctionProperty> properties = converter.properties();
         if (properties.contains(FunctionProperty.INVERTIBLE)) {
+            if (properties.containsAll(EnumSet.of(FunctionProperty.INJECTIVE, 
FunctionProperty.SURJECTIVE))) {
+                return new Bijective<>(base, converter);
+            }
             return new Invertible<>(base, converter);
         }
         return new DerivedSet<>(base, converter);
@@ -178,7 +182,7 @@ class DerivedSet<B,E> extends AbstractSe
      * @param <B> The type of elements in the backing set.
      * @param <E> The type of elements in this set.
      */
-    private static final class Invertible<B,E> extends DerivedSet<B,E> {
+    private static class Invertible<B,E> extends DerivedSet<B,E> {
         /**
          * For cross-version compatibility.
          */
@@ -204,7 +208,7 @@ class DerivedSet<B,E> extends AbstractSe
          * {@inheritDoc}
          */
         @Override
-        public boolean add(final E element) throws 
UnsupportedOperationException {
+        public final boolean add(final E element) throws 
UnsupportedOperationException {
             ArgumentChecks.ensureNonNull("element", element);
             return base.add(inverse.convert(element));
         }
@@ -222,7 +226,7 @@ class DerivedSet<B,E> extends AbstractSe
          * @return {@code true} if this set contains the specified element.
          */
         @Override
-        public boolean contains(final Object element) {
+        public final boolean contains(final Object element) {
             final Class<? extends E> type = getElementType();
             return type.isInstance(element) && 
base.contains(inverse.convert(type.cast(element)));
         }
@@ -242,9 +246,50 @@ class DerivedSet<B,E> extends AbstractSe
          *         supports the {@code remove} operation.
          */
         @Override
-        public boolean remove(final Object element) throws 
UnsupportedOperationException {
+        public final boolean remove(final Object element) throws 
UnsupportedOperationException {
             final Class<? extends E> type = getElementType();
             return type.isInstance(element) && 
base.remove(inverse.convert(type.cast(element)));
         }
     }
+
+    /**
+     * A {@link DerivedSet} for converters that are both invertible and 
bijective.
+     * The bijection allows us to query the {@linkplai #base} set size directly
+     * instead than iterating over all elements.
+     *
+     * @param <B> The type of elements in the backing set.
+     * @param <E> The type of elements in this set.
+     */
+    private static final class Bijective<B,E> extends Invertible<B,E> {
+        /**
+         * For cross-version compatibility.
+         */
+        private static final long serialVersionUID = -7601944988804380342L;
+
+        /**
+         * Creates a new derived set from the specified base set.
+         *
+         * @param base The base set.
+         * @param converter The type of elements in this derived set.
+         */
+        Bijective(final Set<B> base, final ObjectConverter<B,E> converter) {
+            super(base, converter);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public int size() {
+            return base.size();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isEmpty() {
+            return base.isEmpty();
+        }
+    }
 }


Reply via email to