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 Projectpackage java.util;
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * An EnumSet is a specialized Set to be used with enums as keys.
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        implements Cloneable, Serializable {
25f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson    private static final long serialVersionUID = 1009687484059888093L;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    final Class<E> elementClass;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    EnumSet(Class<E> cls) {
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        elementClass = cls;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an empty enum set. The permitted elements are of type
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Class&lt;E&gt;.
36f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param elementType
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the class object for the elements contained.
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an empty enum set, with permitted elements of type {@code
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         elementType}.
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassCastException
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified element type is not and enum type.
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!elementType.isEnum()) {
46415c7497ec02890a73eb293f98f69c1f6983389bElliott Hughes            throw new ClassCastException(elementType.getClass().getName() + " is not an Enum");
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
48482e8943b4b81534b545260e6da25bb35b93dc5aJesse Wilson        E[] enums = Enum.getSharedConstants(elementType);
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (enums.length <= 64) {
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new MiniEnumSet<E>(elementType, enums);
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new HugeEnumSet<E>(elementType, enums);
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an enum set filled with all the enum elements of the specified
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code elementType}.
58f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param elementType
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the class object for the elements contained.
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an enum set with elements solely from the specified element type.
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassCastException
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified element type is not and enum type.
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        EnumSet<E> set = noneOf(elementType);
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set.complement();
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return set;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an enum set. All the contained elements are of type
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Class&lt;E&gt;, and the contained elements are the same as those
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * contained in {@code s}.
75f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param s
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the enum set from which to copy.
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an enum set with all the elements from the specified enum set.
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassCastException
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified element type is not and enum type.
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <E extends Enum<E>> EnumSet<E> copyOf(EnumSet<E> s) {
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        EnumSet<E> set = EnumSet.noneOf(s.elementClass);
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set.addAll(s);
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return set;
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an enum set. The contained elements are the same as those
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * contained in collection {@code c}. If c is an enum set, invoking this
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method is the same as invoking {@link #copyOf(EnumSet)}.
92f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param c
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the collection from which to copy. if it is not an enum set,
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            it must not be empty.
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an enum set with all the elements from the specified collection.
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if c is not an enum set and contains no elements at all.
99f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws NullPointerException
100f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if {@code c} is {@code null}.
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c) {
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (c instanceof EnumSet) {
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return copyOf((EnumSet<E>) c);
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
10655392539fea537abfb6581b474918f9d611fba27Jesse Wilson        if (c.isEmpty()) {
107cff1616012dc0d56c2da9af2b9b1183e76c7e044Elliott Hughes            throw new IllegalArgumentException("empty collection");
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Iterator<E> iterator = c.iterator();
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        E element = iterator.next();
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        EnumSet<E> set = EnumSet.noneOf(element.getDeclaringClass());
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set.add(element);
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (iterator.hasNext()) {
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            set.add(iterator.next());
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return set;
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an enum set. All the contained elements complement those from the
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified enum set.
122f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param s
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specified enum set.
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an enum set with all the elements complementary to those from the
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         specified enum set.
127f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws NullPointerException
128f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if {@code s} is {@code null}.
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <E extends Enum<E>> EnumSet<E> complementOf(EnumSet<E> s) {
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        EnumSet<E> set = EnumSet.noneOf(s.elementClass);
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set.addAll(s);
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set.complement();
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return set;
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    abstract void complement();
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new enum set, containing only the specified element. There are
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * six overloadings of the method. They accept from one to five elements
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * respectively. The sixth one receives an arbitrary number of elements, and
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * runs slower than those that only receive a fixed number of elements.
144f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the element to be initially contained.
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an enum set containing the specified element.
148f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws NullPointerException
149f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if {@code e} is {@code null}.
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <E extends Enum<E>> EnumSet<E> of(E e) {
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        EnumSet<E> set = EnumSet.noneOf(e.getDeclaringClass());
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set.add(e);
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return set;
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
158f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Creates a new enum set, containing only the specified elements. There are
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * six overloadings of the method. They accept from one to five elements
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * respectively. The sixth one receives an arbitrary number of elements, and
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * runs slower than those that only receive a fixed number of elements.
162f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e1
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the initially contained element.
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e2
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            another initially contained element.
167f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @return an enum set containing the specified elements.
168f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws NullPointerException
169f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if any of the specified elements is {@code null}.
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2) {
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        EnumSet<E> set = of(e1);
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set.add(e2);
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return set;
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
178f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Creates a new enum set, containing only the specified elements. There are
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * six overloadings of the method. They accept from one to five elements
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * respectively. The sixth one receives an arbitrary number of elements, and
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * runs slower than those that only receive a fixed number of elements.
182f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e1
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the initially contained element.
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e2
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            another initially contained element.
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e3
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            another initially contained element.
189f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @return an enum set containing the specified elements.
190f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws NullPointerException
191f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if any of the specified elements is {@code null}.
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3) {
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        EnumSet<E> set = of(e1, e2);
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set.add(e3);
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return set;
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
200f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Creates a new enum set, containing only the specified elements. There are
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * six overloadings of the method. They accept from one to five elements
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * respectively. The sixth one receives an arbitrary number of elements, and
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * runs slower than those that only receive a fixed number of elements.
204f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e1
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the initially contained element.
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e2
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            another initially contained element.
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e3
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            another initially contained element.
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e4
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            another initially contained element.
213f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @return an enum set containing the specified elements.
214f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws NullPointerException
215f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if any of the specified elements is {@code null}.
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4) {
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        EnumSet<E> set = of(e1, e2, e3);
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set.add(e4);
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return set;
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
224f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Creates a new enum set, containing only the specified elements. There are
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * six overloadings of the method. They accept from one to five elements
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * respectively. The sixth one receives an arbitrary number of elements, and
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * runs slower than those that only receive a fixed number of elements.
228f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e1
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the initially contained element.
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e2
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            another initially contained element.
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e3
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            another initially contained element.
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e4
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            another initially contained element.
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param e5
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            another initially contained element.
239f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @return an enum set containing the specified elements.
240f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws NullPointerException
241f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if any of the specified elements is {@code null}.
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5) {
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        EnumSet<E> set = of(e1, e2, e3, e4);
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set.add(e5);
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return set;
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new enum set, containing only the specified elements. It can
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * receive an arbitrary number of elements, and runs slower than those only
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * receiving a fixed number of elements.
253f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the first initially contained element.
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param others
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the other initially contained elements.
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an enum set containing the specified elements.
259f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws NullPointerException
260f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if any of the specified elements is {@code null}.
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
262bce3d7cfe03fcb70bd374ad2e8b16ba64a45e993Elliott Hughes    @SafeVarargs
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <E extends Enum<E>> EnumSet<E> of(E start, E... others) {
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        EnumSet<E> set = of(start);
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (E e : others) {
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            set.add(e);
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return set;
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an enum set containing all the elements within the range defined
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * by {@code start} and {@code end} (inclusive). All the elements must be in
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * order.
275f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the element used to define the beginning of the range.
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param end
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the element used to define the end of the range.
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an enum set with elements in the range from start to end.
281f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @throws NullPointerException
282f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if any one of {@code start} or {@code end} is {@code null}.
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code start} is behind {@code end}.
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static <E extends Enum<E>> EnumSet<E> range(E start, E end) {
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (start.compareTo(end) > 0) {
288cff1616012dc0d56c2da9af2b9b1183e76c7e044Elliott Hughes            throw new IllegalArgumentException("start is behind end");
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        EnumSet<E> set = EnumSet.noneOf(start.getDeclaringClass());
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        set.setRange(start, end);
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return set;
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    abstract void setRange(E start, E end);
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new enum set with the same elements as those contained in this
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * enum set.
300f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new enum set with the same elements as those contained in this
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         enum set.
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public EnumSet<E> clone() {
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
30855392539fea537abfb6581b474918f9d611fba27Jesse Wilson            return (EnumSet<E>) super.clone();
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (CloneNotSupportedException e) {
31055392539fea537abfb6581b474918f9d611fba27Jesse Wilson            throw new AssertionError(e);
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
31455392539fea537abfb6581b474918f9d611fba27Jesse Wilson    boolean isValidType(Class<?> cls) {
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return cls == elementClass || cls.getSuperclass() == elementClass;
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static class SerializationProxy<E extends Enum<E>> implements
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Serializable {
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final long serialVersionUID = 362491234563181265L;
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private Class<E> elementType;
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private E[] elements;
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private Object readResolve() {
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            EnumSet<E> set = EnumSet.noneOf(elementType);
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (E e : elements) {
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                set.add(e);
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return set;
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    Object writeReplace() {
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SerializationProxy proxy = new SerializationProxy();
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        proxy.elements = toArray(new Enum[0]);
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        proxy.elementType = elementClass;
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return proxy;
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
344