151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.util; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Private implementation class for EnumSet, for "regular sized" enum types 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (i.e., those with 64 or fewer enum constants). 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Josh Bloch 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.5 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @serial exclude 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass RegularEnumSet<E extends Enum<E>> extends EnumSet<E> { 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final long serialVersionUID = 3411599620347842686L; 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Bit vector representation of this set. The 2^k bit indicates the 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * presence of universe[k] in this set. 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private long elements = 0L; 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski RegularEnumSet(Class<E>elementType, Enum[] universe) { 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(elementType, universe); 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski void addRange(E from, E to) { 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements = (-1L >>> (from.ordinal() - to.ordinal() - 1)) << from.ordinal(); 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski void addAll() { 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (universe.length != 0) 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements = -1L >>> -universe.length; 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski void complement() { 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (universe.length != 0) { 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements = ~elements; 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements &= -1L >>> -universe.length; // Mask unused bits 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns an iterator over the elements contained in this set. The 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * iterator traverses the elements in their <i>natural order</i> (which is 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the order in which the enum constants are declared). The returned 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Iterator is a "snapshot" iterator that will never throw {@link 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ConcurrentModificationException}; the elements are traversed as they 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * existed when this call was invoked. 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return an iterator over the elements contained in this set 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Iterator<E> iterator() { 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new EnumSetIterator<>(); 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private class EnumSetIterator<E extends Enum<E>> implements Iterator<E> { 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A bit vector representing the elements in the set not yet 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * returned by this iterator. 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long unseen; 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The bit representing the last element returned by this iterator 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * but not removed, or zero if no such element exists. 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long lastReturned = 0; 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski EnumSetIterator() { 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski unseen = elements; 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean hasNext() { 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return unseen != 0; 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public E next() { 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (unseen == 0) 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NoSuchElementException(); 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lastReturned = unseen & -unseen; 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski unseen -= lastReturned; 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (E) universe[Long.numberOfTrailingZeros(lastReturned)]; 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void remove() { 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (lastReturned == 0) 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalStateException(); 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements &= ~lastReturned; 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lastReturned = 0; 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the number of elements in this set. 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the number of elements in this set 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int size() { 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return Long.bitCount(elements); 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns <tt>true</tt> if this set contains no elements. 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if this set contains no elements 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isEmpty() { 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return elements == 0; 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns <tt>true</tt> if this set contains the specified element. 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param e element to be checked for containment in this collection 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if this set contains the specified element 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean contains(Object e) { 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (e == null) 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Class eClass = e.getClass(); 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (eClass != elementType && eClass.getSuperclass() != elementType) 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (elements & (1L << ((Enum)e).ordinal())) != 0; 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Modification Operations 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Adds the specified element to this set if it is not already present. 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param e element to be added to this set 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if the set changed as a result of the call 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException if <tt>e</tt> is null 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean add(E e) { 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski typeCheck(e); 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long oldElements = elements; 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements |= (1L << ((Enum)e).ordinal()); 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return elements != oldElements; 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Removes the specified element from this set if it is present. 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param e element to be removed from this set, if present 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if the set contained the specified element 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean remove(Object e) { 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (e == null) 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Class eClass = e.getClass(); 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (eClass != elementType && eClass.getSuperclass() != elementType) 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long oldElements = elements; 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements &= ~(1L << ((Enum)e).ordinal()); 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return elements != oldElements; 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Bulk Operations 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns <tt>true</tt> if this set contains all of the elements 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in the specified collection. 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param c collection to be checked for containment in this set 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if this set contains all of the elements 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in the specified collection 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException if the specified collection is null 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean containsAll(Collection<?> c) { 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(c instanceof RegularEnumSet)) 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return super.containsAll(c); 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski RegularEnumSet es = (RegularEnumSet)c; 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (es.elementType != elementType) 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return es.isEmpty(); 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (es.elements & ~elements) == 0; 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Adds all of the elements in the specified collection to this set. 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param c collection whose elements are to be added to this set 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if this set changed as a result of the call 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException if the specified collection or any 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of its elements are null 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean addAll(Collection<? extends E> c) { 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(c instanceof RegularEnumSet)) 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return super.addAll(c); 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski RegularEnumSet es = (RegularEnumSet)c; 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (es.elementType != elementType) { 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (es.isEmpty()) 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new ClassCastException( 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski es.elementType + " != " + elementType); 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long oldElements = elements; 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements |= es.elements; 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return elements != oldElements; 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Removes from this set all of its elements that are contained in 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the specified collection. 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param c elements to be removed from this set 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if this set changed as a result of the call 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException if the specified collection is null 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean removeAll(Collection<?> c) { 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(c instanceof RegularEnumSet)) 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return super.removeAll(c); 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski RegularEnumSet es = (RegularEnumSet)c; 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (es.elementType != elementType) 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long oldElements = elements; 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements &= ~es.elements; 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return elements != oldElements; 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Retains only the elements in this set that are contained in the 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified collection. 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param c elements to be retained in this set 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if this set changed as a result of the call 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException if the specified collection is null 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean retainAll(Collection<?> c) { 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(c instanceof RegularEnumSet)) 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return super.retainAll(c); 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski RegularEnumSet<?> es = (RegularEnumSet<?>)c; 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (es.elementType != elementType) { 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean changed = (elements != 0); 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements = 0; 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return changed; 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski long oldElements = elements; 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements &= es.elements; 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return elements != oldElements; 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Removes all of the elements from this set. 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void clear() { 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski elements = 0; 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Compares the specified object with this set for equality. Returns 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>true</tt> if the given object is also a set, the two sets have 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the same size, and every member of the given set is contained in 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this set. 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param e object to be compared for equality with this set 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if the specified object is equal to this set 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean equals(Object o) { 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(o instanceof RegularEnumSet)) 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return super.equals(o); 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski RegularEnumSet es = (RegularEnumSet)o; 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (es.elementType != elementType) 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return elements == 0 && es.elements == 0; 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return es.elements == elements; 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 304