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