--- old/src/java.base/share/classes/java/util/RegularEnumSet.java 2018-10-31 14:22:40.657954290 +0100 +++ new/src/java.base/share/classes/java/util/RegularEnumSet.java 2018-10-31 14:22:40.530954391 +0100 @@ -1,5 +1,5 @@ /* - * 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 @@ -39,25 +39,50 @@ * 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> (i<<3)); + } + + private long elems() { + long elems = 0L; + for (int i=0; i clone() { + RegularEnumSet es = (RegularEnumSet) super.clone(); + es.bits = new byte[8]; + es.setBits(elems()); + return es; + } RegularEnumSet(ClasselementType, 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)); } } @@ -89,7 +114,7 @@ long lastReturned = 0; EnumSetIterator() { - unseen = elements; + unseen = elems(); } public boolean hasNext() { @@ -108,7 +133,7 @@ public void remove() { if (lastReturned == 0) throw new IllegalStateException(); - elements &= ~lastReturned; + setBits(elems() & ~lastReturned); lastReturned = 0; } } @@ -119,7 +144,7 @@ * @return the number of elements in this set */ public int size() { - return Long.bitCount(elements); + return Long.bitCount(elems()); } /** @@ -128,7 +153,7 @@ * @return {@code true} if this set contains no elements */ public boolean isEmpty() { - return elements == 0; + return elems() == 0; } /** @@ -144,7 +169,7 @@ if (eClass != elementType && eClass.getSuperclass() != elementType) return false; - return (elements & (1L << ((Enum)e).ordinal())) != 0; + return System.isBit(bits, ((Enum)e).ordinal()); } // Modification Operations @@ -159,10 +184,9 @@ */ 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; } /** @@ -177,10 +201,9 @@ 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 @@ -202,7 +225,7 @@ if (es.elementType != elementType) return es.isEmpty(); - return (es.elements & ~elements) == 0; + return (es.elems() & ~elems()) == 0; } /** @@ -225,10 +248,9 @@ 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; } /** @@ -246,10 +268,9 @@ 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; } /** @@ -266,21 +287,20 @@ 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); } /** @@ -298,7 +318,7 @@ 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(); } }