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<E>. 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<E>, 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