< prev index next >

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

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2003, 2012, 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 --- 1,7 ---- /* ! * 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,65 **** 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; RegularEnumSet(Class<E>elementType, Enum<?>[] universe) { super(elementType, universe); } void addRange(E from, E to) { ! elements = (-1L >>> (from.ordinal() - to.ordinal() - 1)) << from.ordinal(); } void addAll() { if (universe.length != 0) ! elements = -1L >>> -universe.length; } void complement() { if (universe.length != 0) { ! elements = ~elements; ! elements &= -1L >>> -universe.length; // Mask unused bits } } /** * Returns an iterator over the elements contained in this set. The --- 37,90 ---- 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 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) { ! setBits((-1L >>> (from.ordinal() - to.ordinal() - 1)) << from.ordinal()); } void addAll() { if (universe.length != 0) ! setBits(-1L >>> -universe.length); } void complement() { if (universe.length != 0) { ! setBits(~elems() & (-1L >>> -universe.length)); } } /** * Returns an iterator over the elements contained in this set. The
*** 87,97 **** * but not removed, or zero if no such element exists. */ long lastReturned = 0; EnumSetIterator() { ! unseen = elements; } public boolean hasNext() { return unseen != 0; } --- 112,122 ---- * but not removed, or zero if no such element exists. */ long lastReturned = 0; EnumSetIterator() { ! unseen = elems(); } public boolean hasNext() { return unseen != 0; }
*** 106,136 **** } public void remove() { if (lastReturned == 0) throw new IllegalStateException(); ! elements &= ~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); } /** * Returns {@code true} if this set contains no elements. * * @return {@code true} if this set contains no elements */ public boolean isEmpty() { ! return elements == 0; } /** * Returns {@code true} if this set contains the specified element. * --- 131,161 ---- } public void remove() { if (lastReturned == 0) throw new IllegalStateException(); ! 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(elems()); } /** * Returns {@code true} if this set contains no elements. * * @return {@code true} if this set contains no elements */ public boolean isEmpty() { ! return elems() == 0; } /** * Returns {@code true} if this set contains the specified element. *
*** 142,152 **** return false; Class<?> eClass = e.getClass(); if (eClass != elementType && eClass.getSuperclass() != elementType) return false; ! return (elements & (1L << ((Enum<?>)e).ordinal())) != 0; } // Modification Operations /** --- 167,177 ---- return false; Class<?> eClass = e.getClass(); if (eClass != elementType && eClass.getSuperclass() != elementType) return false; ! return System.isBit(bits, ((Enum<?>)e).ordinal()); } // Modification Operations /**
*** 157,170 **** * * @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; } /** * Removes the specified element from this set if it is present. * --- 182,194 ---- * * @throws NullPointerException if {@code e} is null */ public boolean add(E e) { typeCheck(e); ! long oldElements = elems(); ! System.setBit(bits, ((Enum<?>)e).ordinal()); ! return elems() != oldElements; } /** * Removes the specified element from this set if it is present. *
*** 175,188 **** 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; } // Bulk Operations /** --- 199,211 ---- if (e == null) return false; Class<?> eClass = e.getClass(); if (eClass != elementType && eClass.getSuperclass() != elementType) return false; ! long oldElements = elems(); ! System.clrBit(bits, ((Enum<?>)e).ordinal()); ! return elems() != oldElements; } // Bulk Operations /**
*** 200,210 **** RegularEnumSet<?> es = (RegularEnumSet<?>)c; if (es.elementType != elementType) return es.isEmpty(); ! return (es.elements & ~elements) == 0; } /** * Adds all of the elements in the specified collection to this set. * --- 223,233 ---- RegularEnumSet<?> es = (RegularEnumSet<?>)c; if (es.elementType != elementType) return es.isEmpty(); ! return (es.elems() & ~elems()) == 0; } /** * Adds all of the elements in the specified collection to this set. *
*** 223,236 **** return false; else throw new ClassCastException( es.elementType + " != " + elementType); } ! ! long oldElements = elements; ! elements |= es.elements; ! return elements != oldElements; } /** * Removes from this set all of its elements that are contained in * the specified collection. --- 246,258 ---- return false; else throw new ClassCastException( es.elementType + " != " + elementType); } ! 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,257 **** return super.removeAll(c); RegularEnumSet<?> es = (RegularEnumSet<?>)c; if (es.elementType != elementType) return false; ! ! long oldElements = elements; ! elements &= ~es.elements; ! return elements != oldElements; } /** * Retains only the elements in this set that are contained in the * specified collection. --- 266,278 ---- return super.removeAll(c); RegularEnumSet<?> es = (RegularEnumSet<?>)c; if (es.elementType != elementType) return false; ! 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,288 **** if (!(c instanceof RegularEnumSet)) return super.retainAll(c); RegularEnumSet<?> es = (RegularEnumSet<?>)c; if (es.elementType != elementType) { ! boolean changed = (elements != 0); ! elements = 0; return changed; } ! ! long oldElements = elements; ! elements &= es.elements; ! return elements != oldElements; } /** * Removes all of the elements from this set. */ public void clear() { ! elements = 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 --- 285,308 ---- if (!(c instanceof RegularEnumSet)) return super.retainAll(c); RegularEnumSet<?> es = (RegularEnumSet<?>)c; if (es.elementType != elementType) { ! boolean changed = (elems() != 0); ! setBits(0); return changed; } ! long oldElements = elems(); ! setBits(elems() & es.elems()); ! return elems() != oldElements; } /** * Removes all of the elements from this set. */ public void clear() { ! 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,304 **** 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; } } --- 316,324 ---- if (!(o instanceof RegularEnumSet)) return super.equals(o); RegularEnumSet<?> es = (RegularEnumSet<?>)o; if (es.elementType != elementType) ! return elems() == 0 && es.elems() == 0; ! return es.elems() == elems(); } }
< prev index next >