You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by py...@apache.org on 2006/08/24 11:59:00 UTC

svn commit: r434365 - in /incubator/harmony/enhanced/classlib/trunk/modules/luni/src: main/java/java/util/EnumSet.java main/java/java/util/MiniEnumSet.java test/java/tests/api/java/util/EnumSetTest.java

Author: pyang
Date: Thu Aug 24 02:58:58 2006
New Revision: 434365

URL: http://svn.apache.org/viewvc?rev=434365&view=rev
Log:
Patch applied for HARMONY-1267 ([classlib][luni] new methods ComplementOf(EnumSet), java.util.EnumSet.addAll(Collection), remove(Object), equals(Object))

Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/EnumSet.java
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/MiniEnumSet.java
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/EnumSetTest.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/EnumSet.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/EnumSet.java?rev=434365&r1=434364&r2=434365&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/EnumSet.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/EnumSet.java Thu Aug 24 02:58:58 2006
@@ -104,8 +104,13 @@
      *             if the specified enum set is null
      */
     public static <E extends Enum<E>> EnumSet<E> complementOf(EnumSet<E> s) {
-        throw new NotYetImplementedException();
+        EnumSet<E> set = EnumSet.noneOf(s.elementClass);
+        set.addAll(s);
+        set.complement();
+        return set;
     }
+    
+    abstract void complement();
 
     /**
      * Creates a new enum set, containing only the specified element. There are

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/MiniEnumSet.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/MiniEnumSet.java?rev=434365&r1=434364&r2=434365&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/MiniEnumSet.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/MiniEnumSet.java Thu Aug 24 02:58:58 2006
@@ -27,10 +27,15 @@
     
     private int size = 0;
     
+    final private E[] enums;
+
+    static final private int MAX_ELEMENTS = 64;
+    
     private long bits = 0;
     
     MiniEnumSet(Class<E> elementType) {
         super(elementType);
+        enums = elementType.getEnumConstants();
     }
 
     @Override
@@ -60,11 +65,30 @@
         }
         bits |= mask;
 
-        size = Long.bitCount(bits);
+        size++;
         return true;
     }
     
     @Override
+    public boolean addAll(Collection<? extends E> collection) {
+        if (0 == collection.size()) {
+            return false;
+        }
+        if (collection instanceof EnumSet) {
+            EnumSet<E> set = (EnumSet<E>) collection;
+            if (!isValidType(set.elementClass)) {
+                throw new ClassCastException();
+            }
+            MiniEnumSet<E> miniSet = (MiniEnumSet<E>) set;
+            long oldBits = bits;
+            bits |= miniSet.bits;
+            size = Long.bitCount(bits);
+            return (oldBits != bits);
+        }
+        return super.addAll(collection);
+    }
+    
+    @Override
     @SuppressWarnings("unchecked")
     public boolean contains(Object object) {
         if (null == object) {
@@ -88,5 +112,40 @@
             return isValidType(set.elementClass ) && ((bits & set.bits) == set.bits);
         }
         return !(collection instanceof EnumSet) && super.containsAll(collection);  
+    }
+    
+    @Override
+    @SuppressWarnings("unchecked")
+    public boolean remove(Object object) {
+        if (!contains(object)) {
+            return false;
+        }
+        E element = (E) object;
+        int ordinal = element.ordinal();
+        bits -= (1l << ordinal);
+        size--;
+        return true;
+    }
+    
+    @Override
+    @SuppressWarnings("unchecked")
+    public boolean equals(Object object) {
+        if (!(object instanceof EnumSet)) {
+            return super.equals(object);
+        }
+        EnumSet<E> set =(EnumSet<E>)object; 
+        if( !isValidType(set.elementClass) ) {
+            return size == 0 && set.size() == 0;
+        }
+        return bits == ((MiniEnumSet)set).bits;
+    }
+    
+    @Override
+    void complement() {
+        if (0 != enums.length) {
+            bits = ~bits;
+            bits &= (-1l >>> (MAX_ELEMENTS - enums.length));
+            size = enums.length - size;
+        }
     }
 }

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/EnumSetTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/EnumSetTest.java?rev=434365&r1=434364&r2=434365&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/EnumSetTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/EnumSetTest.java Thu Aug 24 02:58:58 2006
@@ -134,6 +134,161 @@
     }
     
     /**
+     * @tests java.util.EnumSet#addAll(Collection)
+     */
+    @SuppressWarnings( { "unchecked", "boxing" })
+    public void test_addAll_LCollection() {
+
+        Set<EnumFoo> set = EnumSet.noneOf(EnumFoo.class);
+        assertEquals("Size should be 0:", 0, set.size()); //$NON-NLS-1$
+
+        try {
+            set.addAll(null);
+            fail("Should throw NullPointerException"); //$NON-NLS-1$
+        } catch (NullPointerException e) {
+            // expected
+        }
+
+        Set emptySet = EnumSet.noneOf(EmptyEnum.class);
+        Enum[] elements = EmptyEnum.class.getEnumConstants();
+        for(int i = 0; i < elements.length; i++) {
+            emptySet.add(elements[i]);
+        }
+        boolean result = set.addAll(emptySet);
+        assertFalse(result);
+
+        Collection<EnumFoo> collection = new ArrayList<EnumFoo>();
+        collection.add(EnumFoo.a);
+        collection.add(EnumFoo.b);
+        result = set.addAll(collection);
+        assertTrue("addAll should be successful", result); //$NON-NLS-1$
+        assertEquals("Size should be 2:", 2, set.size()); //$NON-NLS-1$
+
+        set = EnumSet.noneOf(EnumFoo.class);
+
+        Collection rawCollection = new ArrayList<Integer>();
+        result = set.addAll(rawCollection);
+        assertFalse(result);
+        rawCollection.add(1);
+        try {
+            set.addAll(rawCollection);
+            fail("Should throw ClassCastException"); //$NON-NLS-1$
+        } catch (ClassCastException e) {
+            // expected
+        }
+
+        Set<EnumFoo> fullSet = EnumSet.noneOf(EnumFoo.class);
+        fullSet.add(EnumFoo.a);
+        fullSet.add(EnumFoo.b);
+        result = set.addAll(fullSet);
+        assertTrue("addAll should be successful", result); //$NON-NLS-1$
+        assertEquals("Size of set should be 2", 2, set.size()); //$NON-NLS-1$
+
+        try {
+            fullSet.addAll(null);
+            fail("Should throw NullPointerException"); //$NON-NLS-1$
+        } catch (NullPointerException e) {
+            // expected
+        }
+
+        Set fullSetWithSubclass = EnumSet.noneOf(EnumWithInnerClass.class);
+        elements = EnumWithInnerClass.class.getEnumConstants();
+        for(int i = 0; i < elements.length; i++) {
+            fullSetWithSubclass.add(elements[i]);
+        }
+        try {
+            set.addAll(fullSetWithSubclass);
+            fail("Should throw ClassCastException"); //$NON-NLS-1$
+        } catch (ClassCastException e) {
+            // expected
+        }
+        Set<EnumWithInnerClass> setWithSubclass = fullSetWithSubclass;
+        result = setWithSubclass.addAll(setWithSubclass);
+        assertFalse("Should return false", result); //$NON-NLS-1$
+
+        Set<EnumWithInnerClass> anotherSetWithSubclass = EnumSet
+                .noneOf(EnumWithInnerClass.class);
+        elements = EnumWithInnerClass.class.getEnumConstants();
+        for(int i = 0; i < elements.length; i++) {
+            anotherSetWithSubclass.add((EnumWithInnerClass) elements[i]);
+        }
+        result = setWithSubclass.addAll(anotherSetWithSubclass);
+        assertFalse("Should return false", result); //$NON-NLS-1$
+
+        anotherSetWithSubclass.remove(EnumWithInnerClass.a);
+        result = setWithSubclass.addAll(anotherSetWithSubclass);
+        assertFalse("Should return false", result); //$NON-NLS-1$
+
+    }
+    
+    /**
+     * @tests java.util.EnumSet#remove(Object)
+     */
+    public void test_remove_LOject() {
+        Set<EnumFoo> set = EnumSet.noneOf(EnumFoo.class);
+        Enum[] elements = EnumFoo.class.getEnumConstants();
+        for(int i = 0; i < elements.length; i++) {
+            set.add((EnumFoo) elements[i]);
+        }
+        
+        boolean result = set.remove(null);
+        assertFalse("'set' does not contain null", result); //$NON-NLS-1$
+
+        result = set.remove(EnumFoo.a);
+        assertTrue("Should return true", result); //$NON-NLS-1$
+        result = set.remove(EnumFoo.a);
+        assertFalse("Should return false", result); //$NON-NLS-1$
+
+        assertEquals("Size of set should be 63:", 63, set.size()); //$NON-NLS-1$
+
+        result = set.remove(EnumWithInnerClass.a);
+        assertFalse("Should return false", result); //$NON-NLS-1$
+        result = set.remove(EnumWithInnerClass.f);
+        assertFalse("Should return false", result); //$NON-NLS-1$
+    }
+    
+    /**
+     * @tests java.util.EnumSet#equals(Object)
+     */
+    public void test_equals_LObject() {
+        Set<EnumFoo> set = EnumSet.noneOf(EnumFoo.class);
+        Enum[] elements = EnumFoo.class.getEnumConstants();
+        for(int i = 0; i < elements.length; i++) {
+            set.add((EnumFoo) elements[i]);
+        }
+        
+        assertFalse("Should return false", set.equals(null)); //$NON-NLS-1$
+        assertFalse(
+                "Should return false", set.equals(new Object())); //$NON-NLS-1$
+
+        Set<EnumFoo> anotherSet = EnumSet.noneOf(EnumFoo.class);
+        elements = EnumFoo.class.getEnumConstants();
+        for(int i = 0; i < elements.length; i++) {
+            anotherSet.add((EnumFoo) elements[i]);
+        }
+        assertTrue("Should return true", set.equals(anotherSet)); //$NON-NLS-1$
+        
+        anotherSet.remove(EnumFoo.a);
+        assertFalse(
+                "Should return false", set.equals(anotherSet)); //$NON-NLS-1$
+
+        Set<EnumWithInnerClass> setWithInnerClass = EnumSet
+                .noneOf(EnumWithInnerClass.class);
+        elements = EnumWithInnerClass.class.getEnumConstants();
+        for(int i = 0; i < elements.length; i++) {
+            setWithInnerClass.add((EnumWithInnerClass) elements[i]);
+        }
+        
+        assertFalse(
+                "Should return false", set.equals(setWithInnerClass)); //$NON-NLS-1$
+
+        setWithInnerClass.clear();
+        set.clear();
+        assertTrue("Should be equal", set.equals(setWithInnerClass)); //$NON-NLS-1$
+        
+    }
+    
+    /**
      * @tests java.util.EnumSet#clear()
      */
     public void test_clear() {
@@ -155,6 +310,38 @@
         set.add(EnumFoo.a);
         set.add(EnumFoo.b);
         assertEquals("Size should be 2", 2, set.size()); //$NON-NLS-1$
+    }
+    
+    /**
+     * @tests java.util.EnumSet#complementOf(java.util.EnumSet)
+     */
+    public void test_ComplementOf_LEnumSet() {
+
+        try {
+            EnumSet.complementOf((EnumSet<EnumFoo>) null);
+            fail("Should throw NullPointerException"); //$NON-NLS-1$
+        } catch (NullPointerException npe) {
+            // expected
+        }
+
+        EnumSet<EnumWithInnerClass> set = EnumSet
+                .noneOf(EnumWithInnerClass.class);
+        set.add(EnumWithInnerClass.d);
+        set.add(EnumWithInnerClass.e);
+        set.add(EnumWithInnerClass.f);
+
+        assertEquals("Size should be 3:", 3, set.size()); //$NON-NLS-1$
+
+        EnumSet<EnumWithInnerClass> complementOfE = EnumSet.complementOf(set);
+        assertTrue(set.contains(EnumWithInnerClass.d));
+        assertEquals(
+                "complementOfE should have size 3", 3, complementOfE.size()); //$NON-NLS-1$
+        assertTrue("complementOfE should contain EnumWithSubclass.a:", //$NON-NLS-1$ 
+                complementOfE.contains(EnumWithInnerClass.a));
+        assertTrue("complementOfE should contain EnumWithSubclass.b:", //$NON-NLS-1$
+                complementOfE.contains(EnumWithInnerClass.b));
+        assertTrue("complementOfE should contain EnumWithSubclass.c:", //$NON-NLS-1$
+                complementOfE.contains(EnumWithInnerClass.c));
     }
     
     /**