< prev index next >

src/java.base/share/classes/java/util/RegularEnumSet.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -37,29 +37,54 @@
     private static final long serialVersionUID = 3411599620347842686L;
     /**
      * Bit vector representation of this set.  The 2^k bit indicates the
      * presence of universe[k] in this set.
      */
-    private long elements = 0L;
+    private byte[] bits = new byte[8];
+
+    private void setBits(long elems) {
+        for (int i=0; i<bits.length; i++)
+            bits[i] = (byte)(elems >> (i<<3));
+    }
+
+    private long elems() {
+        long elems = 0L;
+        for (int i=0; i<bits.length; i++)
+            elems |= (((long)bits[i]) & 0xFFL) << (i<<3);
+
+        return elems;
+    }
+
+    /**
+     * Returns a copy of this set.
+     *
+     * @return a copy of this set
+     */
+    @SuppressWarnings("unchecked")
+    public EnumSet<E> clone() {
+        RegularEnumSet<E> es = (RegularEnumSet<E>) super.clone();
+        es.bits = new byte[8];
+        es.setBits(elems());
+        return es;
+    }
 
     RegularEnumSet(Class<E>elementType, Enum<?>[] universe) {
         super(elementType, universe);
     }
 
     void addRange(E from, E to) {
-        elements = (-1L >>>  (from.ordinal() - to.ordinal() - 1)) << from.ordinal();
+        setBits((-1L >>>  (from.ordinal() - to.ordinal() - 1)) << from.ordinal());
     }
 
     void addAll() {
         if (universe.length != 0)
-            elements = -1L >>> -universe.length;
+            setBits(-1L >>> -universe.length);
     }
 
     void complement() {
         if (universe.length != 0) {
-            elements = ~elements;
-            elements &= -1L >>> -universe.length;  // Mask unused bits
+            setBits(~elems() & (-1L >>> -universe.length));
         }
     }
 
     /**
      * Returns an iterator over the elements contained in this set.  The

@@ -87,11 +112,11 @@
          * but not removed, or zero if no such element exists.
          */
         long lastReturned = 0;
 
         EnumSetIterator() {
-            unseen = elements;
+            unseen = elems();
         }
 
         public boolean hasNext() {
             return unseen != 0;
         }

@@ -106,31 +131,31 @@
         }
 
         public void remove() {
             if (lastReturned == 0)
                 throw new IllegalStateException();
-            elements &= ~lastReturned;
+            setBits(elems() & ~lastReturned);
             lastReturned = 0;
         }
     }
 
     /**
      * Returns the number of elements in this set.
      *
      * @return the number of elements in this set
      */
     public int size() {
-        return Long.bitCount(elements);
+        return Long.bitCount(elems());
     }
 
     /**
      * Returns {@code true} if this set contains no elements.
      *
      * @return {@code true} if this set contains no elements
      */
     public boolean isEmpty() {
-        return elements == 0;
+        return elems() == 0;
     }
 
     /**
      * Returns {@code true} if this set contains the specified element.
      *

@@ -142,11 +167,11 @@
             return false;
         Class<?> eClass = e.getClass();
         if (eClass != elementType && eClass.getSuperclass() != elementType)
             return false;
 
-        return (elements & (1L << ((Enum<?>)e).ordinal())) != 0;
+        return System.isBit(bits, ((Enum<?>)e).ordinal());
     }
 
     // Modification Operations
 
     /**

@@ -157,14 +182,13 @@
      *
      * @throws NullPointerException if {@code e} is null
      */
     public boolean add(E e) {
         typeCheck(e);
-
-        long oldElements = elements;
-        elements |= (1L << ((Enum<?>)e).ordinal());
-        return elements != oldElements;
+        long oldElements = elems();
+        System.setBit(bits, ((Enum<?>)e).ordinal());
+        return elems() != oldElements;
     }
 
     /**
      * Removes the specified element from this set if it is present.
      *

@@ -175,14 +199,13 @@
         if (e == null)
             return false;
         Class<?> eClass = e.getClass();
         if (eClass != elementType && eClass.getSuperclass() != elementType)
             return false;
-
-        long oldElements = elements;
-        elements &= ~(1L << ((Enum<?>)e).ordinal());
-        return elements != oldElements;
+        long oldElements = elems();
+        System.clrBit(bits, ((Enum<?>)e).ordinal());
+        return elems() != oldElements;
     }
 
     // Bulk Operations
 
     /**

@@ -200,11 +223,11 @@
 
         RegularEnumSet<?> es = (RegularEnumSet<?>)c;
         if (es.elementType != elementType)
             return es.isEmpty();
 
-        return (es.elements & ~elements) == 0;
+        return (es.elems() & ~elems()) == 0;
     }
 
     /**
      * Adds all of the elements in the specified collection to this set.
      *

@@ -223,14 +246,13 @@
                 return false;
             else
                 throw new ClassCastException(
                     es.elementType + " != " + elementType);
         }
-
-        long oldElements = elements;
-        elements |= es.elements;
-        return elements != oldElements;
+        long oldElements = elems();
+        setBits(elems() | es.elems());
+        return elems() != oldElements;
     }
 
     /**
      * Removes from this set all of its elements that are contained in
      * the specified collection.

@@ -244,14 +266,13 @@
             return super.removeAll(c);
 
         RegularEnumSet<?> es = (RegularEnumSet<?>)c;
         if (es.elementType != elementType)
             return false;
-
-        long oldElements = elements;
-        elements &= ~es.elements;
-        return elements != oldElements;
+        long oldElements = elems();
+        setBits(elems() & ~es.elems());
+        return elems() != oldElements;
     }
 
     /**
      * Retains only the elements in this set that are contained in the
      * specified collection.

@@ -264,25 +285,24 @@
         if (!(c instanceof RegularEnumSet))
             return super.retainAll(c);
 
         RegularEnumSet<?> es = (RegularEnumSet<?>)c;
         if (es.elementType != elementType) {
-            boolean changed = (elements != 0);
-            elements = 0;
+            boolean changed = (elems() != 0);
+            setBits(0);
             return changed;
         }
-
-        long oldElements = elements;
-        elements &= es.elements;
-        return elements != oldElements;
+        long oldElements = elems();
+        setBits(elems() & es.elems());
+        return elems() != oldElements;
     }
 
     /**
      * Removes all of the elements from this set.
      */
     public void clear() {
-        elements = 0;
+        setBits(0);
     }
 
     /**
      * Compares the specified object with this set for equality.  Returns
      * {@code true} if the given object is also a set, the two sets have

@@ -296,9 +316,9 @@
         if (!(o instanceof RegularEnumSet))
             return super.equals(o);
 
         RegularEnumSet<?> es = (RegularEnumSet<?>)o;
         if (es.elementType != elementType)
-            return elements == 0 && es.elements == 0;
-        return es.elements == elements;
+            return elems() == 0 && es.elems() == 0;
+        return es.elems() == elems();
     }
 }
< prev index next >