1090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors 3090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 4090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * you may not use this file except in compliance with the License. 6090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * You may obtain a copy of the License at 7090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 8090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 10090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * See the License for the specific language governing permissions and 14090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * limitations under the License. 15090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 16090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 17090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonpackage com.google.common.collect; 18090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 21090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.EnumMap; 22090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.Map; 23090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 24090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport javax.annotation.Nullable; 25090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 26090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson/** 27090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * A {@code BiMap} backed by an {@code EnumMap} instance for keys-to-values, and 28090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * a {@code HashMap} instance for values-to-keys. Null keys are not permitted, 29090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * but null values are. An {@code EnumHashBiMap} and its inverse are both 30090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * serializable. 31090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 32090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @author Mike Bostock 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 (imported from Google Collections Library) 34090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true) 36090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonpublic final class EnumHashBiMap<K extends Enum<K>, V> 37090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson extends AbstractBiMap<K, V> { 38090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private transient Class<K> keyType; 39090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 40090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 41090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a new, empty {@code EnumHashBiMap} using the specified key type. 42090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 43090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @param keyType the key type 44090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 45090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <K extends Enum<K>, V> EnumHashBiMap<K, V> 46090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson create(Class<K> keyType) { 47090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new EnumHashBiMap<K, V>(keyType); 48090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 49090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 50090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 51090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Constructs a new bimap with the same mappings as the specified map. If the 52090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * specified map is an {@code EnumHashBiMap} or an {@link EnumBiMap}, the new 53090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * bimap has the same key type as the input bimap. Otherwise, the specified 54090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * map must contain at least one mapping, in order to determine the key type. 55090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 56090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @param map the map whose mappings are to be placed in this map 57090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @throws IllegalArgumentException if map is not an {@code EnumBiMap} or an 58090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * {@code EnumHashBiMap} instance and contains no mappings 59090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 60090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <K extends Enum<K>, V> EnumHashBiMap<K, V> 61090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson create(Map<K, ? extends V> map) { 62090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson EnumHashBiMap<K, V> bimap = create(EnumBiMap.inferKeyType(map)); 63090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson bimap.putAll(map); 64090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return bimap; 65090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 66090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 67090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private EnumHashBiMap(Class<K> keyType) { 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(WellBehavedMap.wrap( 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new EnumMap<K, V>(keyType)), 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Maps.<V, K>newHashMapWithExpectedSize( 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyType.getEnumConstants().length)); 72090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson this.keyType = keyType; 73090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 74090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 75090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson // Overriding these two methods to show that values may be null (but not keys) 76090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 77090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public V put(K key, @Nullable V value) { 78090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return super.put(key, value); 79090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 80090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 81090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public V forcePut(K key, @Nullable V value) { 82090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return super.forcePut(key, value); 83090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 84090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 85090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** Returns the associated key type. */ 86090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public Class<K> keyType() { 87090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return keyType; 88090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 89090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson} 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 91