1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* Licensed to the Apache Software Foundation (ASF) under one or more 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 7f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util; 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 2155392539fea537abfb6581b474918f9d611fba27Jesse Wilson * A concrete EnumSet for enums with 64 or fewer elements. 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project@SuppressWarnings("serial") 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectfinal class MiniEnumSet<E extends Enum<E>> extends EnumSet<E> { 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final int MAX_ELEMENTS = 64; 26f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int size; 28f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 29f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private final E[] enums; 30f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private long bits; 32f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs an instance. 35f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param elementType non-null; type of the elements 37fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes * @param enums non-null; pre-populated array of constants in ordinal 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * order 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MiniEnumSet(Class<E> elementType, E[] enums) { 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(elementType); 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.enums = enums; 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 44f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private class MiniEnumSetIterator implements Iterator<E> { 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 4755392539fea537abfb6581b474918f9d611fba27Jesse Wilson /** 4855392539fea537abfb6581b474918f9d611fba27Jesse Wilson * The bits yet to be returned for bits. As values from the current index are returned, 4955392539fea537abfb6581b474918f9d611fba27Jesse Wilson * their bits are zeroed out. 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 5155392539fea537abfb6581b474918f9d611fba27Jesse Wilson private long currentBits = bits; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 5355392539fea537abfb6581b474918f9d611fba27Jesse Wilson /** 5455392539fea537abfb6581b474918f9d611fba27Jesse Wilson * The single bit of the next value to return. 5555392539fea537abfb6581b474918f9d611fba27Jesse Wilson */ 5655392539fea537abfb6581b474918f9d611fba27Jesse Wilson private long mask = currentBits & -currentBits; // the lowest 1 bit in currentBits 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 5855392539fea537abfb6581b474918f9d611fba27Jesse Wilson /** 5955392539fea537abfb6581b474918f9d611fba27Jesse Wilson * The candidate for removal. If null, no value may be removed. 6055392539fea537abfb6581b474918f9d611fba27Jesse Wilson */ 6155392539fea537abfb6581b474918f9d611fba27Jesse Wilson private E last; 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasNext() { 6455392539fea537abfb6581b474918f9d611fba27Jesse Wilson return mask != 0; 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public E next() { 6855392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (mask == 0) { 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NoSuchElementException(); 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 7155392539fea537abfb6581b474918f9d611fba27Jesse Wilson 7255392539fea537abfb6581b474918f9d611fba27Jesse Wilson int ordinal = Long.numberOfTrailingZeros(mask); 7355392539fea537abfb6581b474918f9d611fba27Jesse Wilson last = enums[ordinal]; 7455392539fea537abfb6581b474918f9d611fba27Jesse Wilson 7555392539fea537abfb6581b474918f9d611fba27Jesse Wilson currentBits &= ~mask; 7655392539fea537abfb6581b474918f9d611fba27Jesse Wilson mask = currentBits & -currentBits; // the lowest 1 bit in currentBits 7755392539fea537abfb6581b474918f9d611fba27Jesse Wilson 7855392539fea537abfb6581b474918f9d611fba27Jesse Wilson return last; 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void remove() { 8255392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (last == null) { 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalStateException(); 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 8555392539fea537abfb6581b474918f9d611fba27Jesse Wilson 8655392539fea537abfb6581b474918f9d611fba27Jesse Wilson MiniEnumSet.this.remove(last); 8755392539fea537abfb6581b474918f9d611fba27Jesse Wilson last = null; 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Iterator<E> iterator() { 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new MiniEnumSetIterator(); 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int size() { 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return size; 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 100f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void clear() { 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bits = 0; 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project size = 0; 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean add(E element) { 109415c7497ec02890a73eb293f98f69c1f6983389bElliott Hughes elementClass.cast(element); // Called to throw ClassCastException. 11055392539fea537abfb6581b474918f9d611fba27Jesse Wilson long oldBits = bits; 11155392539fea537abfb6581b474918f9d611fba27Jesse Wilson long newBits = oldBits | (1L << element.ordinal()); 11255392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (oldBits != newBits) { 11355392539fea537abfb6581b474918f9d611fba27Jesse Wilson bits = newBits; 11455392539fea537abfb6581b474918f9d611fba27Jesse Wilson size++; 11555392539fea537abfb6581b474918f9d611fba27Jesse Wilson return true; 11655392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 11755392539fea537abfb6581b474918f9d611fba27Jesse Wilson return false; 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 119f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean addAll(Collection<? extends E> collection) { 12255392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (collection.isEmpty()) { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (collection instanceof EnumSet) { 12655392539fea537abfb6581b474918f9d611fba27Jesse Wilson EnumSet<?> set = (EnumSet) collection; // raw type due to javac bug 6548436 127415c7497ec02890a73eb293f98f69c1f6983389bElliott Hughes set.elementClass.asSubclass(elementClass); // Called to throw ClassCastException. 12855392539fea537abfb6581b474918f9d611fba27Jesse Wilson 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MiniEnumSet<?> miniSet = (MiniEnumSet<?>) set; 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long oldBits = bits; 13155392539fea537abfb6581b474918f9d611fba27Jesse Wilson long newBits = oldBits | miniSet.bits; 13255392539fea537abfb6581b474918f9d611fba27Jesse Wilson bits = newBits; 13355392539fea537abfb6581b474918f9d611fba27Jesse Wilson size = Long.bitCount(newBits); 13455392539fea537abfb6581b474918f9d611fba27Jesse Wilson return (oldBits != newBits); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return super.addAll(collection); 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 138f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean contains(Object object) { 14155392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (object == null || !isValidType(object.getClass())) { 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 14455392539fea537abfb6581b474918f9d611fba27Jesse Wilson 14555392539fea537abfb6581b474918f9d611fba27Jesse Wilson @SuppressWarnings("unchecked") // guarded by isValidType() 14655392539fea537abfb6581b474918f9d611fba27Jesse Wilson Enum<E> element = (Enum<E>) object; 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int ordinal = element.ordinal(); 14855392539fea537abfb6581b474918f9d611fba27Jesse Wilson return (bits & (1L << ordinal)) != 0; 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean containsAll(Collection<?> collection) { 15355392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (collection.isEmpty()) { 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (collection instanceof MiniEnumSet) { 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project MiniEnumSet<?> set = (MiniEnumSet<?>) collection; 15855392539fea537abfb6581b474918f9d611fba27Jesse Wilson long setBits = set.bits; 15955392539fea537abfb6581b474918f9d611fba27Jesse Wilson return isValidType(set.elementClass) && ((bits & setBits) == setBits); 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 161f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return !(collection instanceof EnumSet) && super.containsAll(collection); 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 163f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean removeAll(Collection<?> collection) { 16655392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (collection.isEmpty()) { 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (collection instanceof EnumSet) { 17055392539fea537abfb6581b474918f9d611fba27Jesse Wilson EnumSet<?> set = (EnumSet<?>) collection; 17155392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (!isValidType(set.elementClass)) { 17255392539fea537abfb6581b474918f9d611fba27Jesse Wilson return false; 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 17455392539fea537abfb6581b474918f9d611fba27Jesse Wilson 17555392539fea537abfb6581b474918f9d611fba27Jesse Wilson MiniEnumSet<E> miniSet = (MiniEnumSet<E>) set; 17655392539fea537abfb6581b474918f9d611fba27Jesse Wilson long oldBits = bits; 17755392539fea537abfb6581b474918f9d611fba27Jesse Wilson long newBits = oldBits & ~miniSet.bits; 17855392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (oldBits != newBits) { 17955392539fea537abfb6581b474918f9d611fba27Jesse Wilson bits = newBits; 18055392539fea537abfb6581b474918f9d611fba27Jesse Wilson size = Long.bitCount(newBits); 18155392539fea537abfb6581b474918f9d611fba27Jesse Wilson return true; 18255392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 18355392539fea537abfb6581b474918f9d611fba27Jesse Wilson return false; 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return super.removeAll(collection); 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean retainAll(Collection<?> collection) { 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (collection instanceof EnumSet) { 19155392539fea537abfb6581b474918f9d611fba27Jesse Wilson EnumSet<?> set = (EnumSet<?>) collection; 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isValidType(set.elementClass)) { 19355392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (size > 0) { 19455392539fea537abfb6581b474918f9d611fba27Jesse Wilson clear(); 19555392539fea537abfb6581b474918f9d611fba27Jesse Wilson return true; 19655392539fea537abfb6581b474918f9d611fba27Jesse Wilson } else { 19755392539fea537abfb6581b474918f9d611fba27Jesse Wilson return false; 19855392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 20055392539fea537abfb6581b474918f9d611fba27Jesse Wilson 20155392539fea537abfb6581b474918f9d611fba27Jesse Wilson MiniEnumSet<E> miniSet = (MiniEnumSet<E>) set; 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long oldBits = bits; 20355392539fea537abfb6581b474918f9d611fba27Jesse Wilson long newBits = oldBits & miniSet.bits; 20455392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (oldBits != newBits) { 20555392539fea537abfb6581b474918f9d611fba27Jesse Wilson bits = newBits; 20655392539fea537abfb6581b474918f9d611fba27Jesse Wilson size = Long.bitCount(newBits); 20755392539fea537abfb6581b474918f9d611fba27Jesse Wilson return true; 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 20955392539fea537abfb6581b474918f9d611fba27Jesse Wilson return false; 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return super.retainAll(collection); 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 213f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean remove(Object object) { 21655392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (object == null || !isValidType(object.getClass())) { 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 21955392539fea537abfb6581b474918f9d611fba27Jesse Wilson 220f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes @SuppressWarnings("unchecked") // guarded by isValidType() 22155392539fea537abfb6581b474918f9d611fba27Jesse Wilson Enum<E> element = (Enum<E>) object; 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int ordinal = element.ordinal(); 22355392539fea537abfb6581b474918f9d611fba27Jesse Wilson long oldBits = bits; 22455392539fea537abfb6581b474918f9d611fba27Jesse Wilson long newBits = oldBits & ~(1L << ordinal); 22555392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (oldBits != newBits) { 22655392539fea537abfb6581b474918f9d611fba27Jesse Wilson bits = newBits; 22755392539fea537abfb6581b474918f9d611fba27Jesse Wilson size--; 22855392539fea537abfb6581b474918f9d611fba27Jesse Wilson return true; 22955392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 23055392539fea537abfb6581b474918f9d611fba27Jesse Wilson return false; 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 232f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean equals(Object object) { 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(object instanceof EnumSet)) { 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return super.equals(object); 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 23855392539fea537abfb6581b474918f9d611fba27Jesse Wilson EnumSet<?> set =(EnumSet<?>) object; 23955392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (!isValidType(set.elementClass)) { 24055392539fea537abfb6581b474918f9d611fba27Jesse Wilson return size == 0 && set.isEmpty(); 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 24255392539fea537abfb6581b474918f9d611fba27Jesse Wilson return bits == ((MiniEnumSet<?>) set).bits; 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 244f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void complement() { 24755392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (enums.length != 0) { 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bits = ~bits; 24955392539fea537abfb6581b474918f9d611fba27Jesse Wilson bits &= (-1L >>> (MAX_ELEMENTS - enums.length)); 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project size = enums.length - size; 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 253f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void setRange(E start, E end) { 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int length = end.ordinal() - start.ordinal() + 1; 25755392539fea537abfb6581b474918f9d611fba27Jesse Wilson long range = (-1L >>> (MAX_ELEMENTS - length)) << start.ordinal(); 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bits |= range; 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project size = Long.bitCount(bits); 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 262