FileDocCategorySizeDatePackage
JumboEnumSet.javaAPI DocJava SE 6 API10949Tue Jun 10 00:25:54 BST 2008java.util

JumboEnumSet

public class JumboEnumSet extends EnumSet
Private implementation class for EnumSet, for "jumbo" enum types (i.e., those with more than 64 elements).
author
Josh Bloch
since
1.5
serial
exclude

Fields Summary
private long[]
elements
Bit vector representation of this set. The ith bit of the jth element of this array represents the presence of universe[64*j +i] in this set.
private int
size
Constructors Summary
JumboEnumSet(Class elementType, Enum[] universe)


       
        super(elementType, universe);
        elements = new long[(universe.length + 63) >>> 6];
    
Methods Summary
public booleanadd(E e)
Adds the specified element to this set if it is not already present.

param
e element to be added to this set
return
true if the set changed as a result of the call
throws
NullPointerException if e is null

        typeCheck(e);

        int eOrdinal = e.ordinal();
        int eWordNum = eOrdinal >>> 6;

        long oldElements = elements[eWordNum];
        elements[eWordNum] |= (1L << eOrdinal);
        boolean result = (elements[eWordNum] != oldElements);
        if (result)
            size++;
        return result;
    
public booleanaddAll(java.util.Collection c)
Adds all of the elements in the specified collection to this set.

param
c collection whose elements are to be added to this set
return
true if this set changed as a result of the call
throws
NullPointerException if the specified collection or any of its elements are null

        if (!(c instanceof JumboEnumSet))
            return super.addAll(c);

        JumboEnumSet es = (JumboEnumSet)c;
        if (es.elementType != elementType) {
            if (es.isEmpty())
                return false;
            else
                throw new ClassCastException(
                    es.elementType + " != " + elementType);
        }

        for (int i = 0; i < elements.length; i++)
            elements[i] |= es.elements[i];
        return recalculateSize();
    
voidaddAll()

        for (int i = 0; i < elements.length; i++)
            elements[i] = -1;
        elements[elements.length - 1] >>>= -universe.length;
        size = universe.length;
    
voidaddRange(E from, E to)

        int fromIndex = from.ordinal() >>> 6;
        int toIndex = to.ordinal() >>> 6;

        if (fromIndex == toIndex) {
            elements[fromIndex] = (-1L >>>  (from.ordinal() - to.ordinal() - 1))
                            << from.ordinal();
        } else {
            elements[fromIndex] = (-1L << from.ordinal());
            for (int i = fromIndex + 1; i < toIndex; i++)
                elements[i] = -1;
            elements[toIndex] = -1L >>> (63 - to.ordinal());
        }
        size = to.ordinal() - from.ordinal() + 1;
    
public voidclear()
Removes all of the elements from this set.

        Arrays.fill(elements, 0);
        size = 0;
    
public java.util.EnumSetclone()

        JumboEnumSet<E> result = (JumboEnumSet<E>) super.clone();
        result.elements = (long[]) result.elements.clone();
        return result;
    
voidcomplement()

        for (int i = 0; i < elements.length; i++)
            elements[i] = ~elements[i];
        elements[elements.length - 1] &= (-1L >>> -universe.length);
        size = universe.length - size;
    
public booleancontains(java.lang.Object e)
Returns true if this set contains the specified element.

param
e element to be checked for containment in this collection
return
true if this set contains the specified element

        if (e == null)
            return false;
        Class eClass = e.getClass();
        if (eClass != elementType && eClass.getSuperclass() != elementType)
            return false;

        int eOrdinal = ((Enum)e).ordinal();
        return (elements[eOrdinal >>> 6] & (1L << eOrdinal)) != 0;
    
public booleancontainsAll(java.util.Collection c)
Returns true if this set contains all of the elements in the specified collection.

param
c collection to be checked for containment in this set
return
true if this set contains all of the elements in the specified collection
throws
NullPointerException if the specified collection is null

        if (!(c instanceof JumboEnumSet))
            return super.containsAll(c);

        JumboEnumSet es = (JumboEnumSet)c;
        if (es.elementType != elementType)
            return es.isEmpty();

        for (int i = 0; i < elements.length; i++)
            if ((es.elements[i] & ~elements[i]) != 0)
                return false;
        return true;
    
public booleanequals(java.lang.Object o)
Compares the specified object with this set for equality. Returns true if the given object is also a set, the two sets have the same size, and every member of the given set is contained in this set.

param
e object to be compared for equality with this set
return
true if the specified object is equal to this set

        if (!(o instanceof JumboEnumSet))
            return super.equals(o);

        JumboEnumSet es = (JumboEnumSet)o;
        if (es.elementType != elementType)
            return size == 0 && es.size == 0;

        return Arrays.equals(es.elements, elements);
    
public booleanisEmpty()
Returns true if this set contains no elements.

return
true if this set contains no elements

        return size == 0;
    
public java.util.Iteratoriterator()
Returns an iterator over the elements contained in this set. The iterator traverses the elements in their natural order (which is the order in which the enum constants are declared). The returned Iterator is a "weakly consistent" iterator that will never throw {@link ConcurrentModificationException}.

return
an iterator over the elements contained in this set

        return new EnumSetIterator<E>();
    
private booleanrecalculateSize()
Recalculates the size of the set. Returns true if it's changed.

        int oldSize = size;
        size = 0;
        for (long elt : elements)
            size += Long.bitCount(elt);

        return size != oldSize;
    
public booleanremove(java.lang.Object e)
Removes the specified element from this set if it is present.

param
e element to be removed from this set, if present
return
true if the set contained the specified element

        if (e == null)
            return false;
        Class eClass = e.getClass();
        if (eClass != elementType && eClass.getSuperclass() != elementType)
            return false;
        int eOrdinal = ((Enum)e).ordinal();
        int eWordNum = eOrdinal >>> 6;

        long oldElements = elements[eWordNum];
        elements[eWordNum] &= ~(1L << eOrdinal);
        boolean result = (elements[eWordNum] != oldElements);
        if (result)
            size--;
        return result;
    
public booleanremoveAll(java.util.Collection c)
Removes from this set all of its elements that are contained in the specified collection.

param
c elements to be removed from this set
return
true if this set changed as a result of the call
throws
NullPointerException if the specified collection is null

        if (!(c instanceof JumboEnumSet))
            return super.removeAll(c);

        JumboEnumSet es = (JumboEnumSet)c;
        if (es.elementType != elementType)
            return false;

        for (int i = 0; i < elements.length; i++)
            elements[i] &= ~es.elements[i];
        return recalculateSize();
    
public booleanretainAll(java.util.Collection c)
Retains only the elements in this set that are contained in the specified collection.

param
c elements to be retained in this set
return
true if this set changed as a result of the call
throws
NullPointerException if the specified collection is null

        if (!(c instanceof JumboEnumSet))
            return super.retainAll(c);

        JumboEnumSet<?> es = (JumboEnumSet<?>)c;
        if (es.elementType != elementType) {
	    boolean changed = (size != 0);
            clear();
            return changed;
        }

        for (int i = 0; i < elements.length; i++)
            elements[i] &= es.elements[i];
        return recalculateSize();
    
public intsize()
Returns the number of elements in this set.

return
the number of elements in this set

        return size;