17dd252788645e940eada959bdde927426e2531c9Paul Duffin/* 27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2008 The Guava Authors 37dd252788645e940eada959bdde927426e2531c9Paul Duffin * 47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License. 67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at 77dd252788645e940eada959bdde927426e2531c9Paul Duffin * 87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 97dd252788645e940eada959bdde927426e2531c9Paul Duffin * 107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software 117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and 147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License. 157dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 167dd252788645e940eada959bdde927426e2531c9Paul Duffin 177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.collect; 187dd252788645e940eada959bdde927426e2531c9Paul Duffin 190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.CollectPreconditions.checkEntryNotNull; 200888a09821a98ac0680fad765217302858e70fa4Paul Duffin 217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.GwtCompatible; 227dd252788645e940eada959bdde927426e2531c9Paul Duffin 237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport javax.annotation.Nullable; 247dd252788645e940eada959bdde927426e2531c9Paul Duffin 257dd252788645e940eada959bdde927426e2531c9Paul Duffin/** 267dd252788645e940eada959bdde927426e2531c9Paul Duffin * Implementation of {@link ImmutableMap} with exactly one entry. 277dd252788645e940eada959bdde927426e2531c9Paul Duffin * 287dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Jesse Wilson 297dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Kevin Bourrillion 307dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 317dd252788645e940eada959bdde927426e2531c9Paul Duffin@GwtCompatible(serializable = true, emulated = true) 320888a09821a98ac0680fad765217302858e70fa4Paul Duffin@SuppressWarnings("serial") // uses writeReplace(), not default serialization 337dd252788645e940eada959bdde927426e2531c9Paul Duffinfinal class SingletonImmutableBiMap<K, V> extends ImmutableBiMap<K, V> { 347dd252788645e940eada959bdde927426e2531c9Paul Duffin 357dd252788645e940eada959bdde927426e2531c9Paul Duffin final transient K singleKey; 367dd252788645e940eada959bdde927426e2531c9Paul Duffin final transient V singleValue; 377dd252788645e940eada959bdde927426e2531c9Paul Duffin 387dd252788645e940eada959bdde927426e2531c9Paul Duffin SingletonImmutableBiMap(K singleKey, V singleValue) { 390888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkEntryNotNull(singleKey, singleValue); 407dd252788645e940eada959bdde927426e2531c9Paul Duffin this.singleKey = singleKey; 417dd252788645e940eada959bdde927426e2531c9Paul Duffin this.singleValue = singleValue; 427dd252788645e940eada959bdde927426e2531c9Paul Duffin } 437dd252788645e940eada959bdde927426e2531c9Paul Duffin 440888a09821a98ac0680fad765217302858e70fa4Paul Duffin private SingletonImmutableBiMap(K singleKey, V singleValue, 450888a09821a98ac0680fad765217302858e70fa4Paul Duffin ImmutableBiMap<V, K> inverse) { 467dd252788645e940eada959bdde927426e2531c9Paul Duffin this.singleKey = singleKey; 477dd252788645e940eada959bdde927426e2531c9Paul Duffin this.singleValue = singleValue; 487dd252788645e940eada959bdde927426e2531c9Paul Duffin this.inverse = inverse; 497dd252788645e940eada959bdde927426e2531c9Paul Duffin } 507dd252788645e940eada959bdde927426e2531c9Paul Duffin 510888a09821a98ac0680fad765217302858e70fa4Paul Duffin SingletonImmutableBiMap(Entry<? extends K, ? extends V> entry) { 527dd252788645e940eada959bdde927426e2531c9Paul Duffin this(entry.getKey(), entry.getValue()); 537dd252788645e940eada959bdde927426e2531c9Paul Duffin } 547dd252788645e940eada959bdde927426e2531c9Paul Duffin 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public V get(@Nullable Object key) { 567dd252788645e940eada959bdde927426e2531c9Paul Duffin return singleKey.equals(key) ? singleValue : null; 577dd252788645e940eada959bdde927426e2531c9Paul Duffin } 587dd252788645e940eada959bdde927426e2531c9Paul Duffin 590888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 607dd252788645e940eada959bdde927426e2531c9Paul Duffin public int size() { 617dd252788645e940eada959bdde927426e2531c9Paul Duffin return 1; 627dd252788645e940eada959bdde927426e2531c9Paul Duffin } 637dd252788645e940eada959bdde927426e2531c9Paul Duffin 647dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override public boolean containsKey(@Nullable Object key) { 657dd252788645e940eada959bdde927426e2531c9Paul Duffin return singleKey.equals(key); 667dd252788645e940eada959bdde927426e2531c9Paul Duffin } 677dd252788645e940eada959bdde927426e2531c9Paul Duffin 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean containsValue(@Nullable Object value) { 697dd252788645e940eada959bdde927426e2531c9Paul Duffin return singleValue.equals(value); 707dd252788645e940eada959bdde927426e2531c9Paul Duffin } 717dd252788645e940eada959bdde927426e2531c9Paul Duffin 720888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override boolean isPartialView() { 737dd252788645e940eada959bdde927426e2531c9Paul Duffin return false; 747dd252788645e940eada959bdde927426e2531c9Paul Duffin } 757dd252788645e940eada959bdde927426e2531c9Paul Duffin 767dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 777dd252788645e940eada959bdde927426e2531c9Paul Duffin ImmutableSet<Entry<K, V>> createEntrySet() { 787dd252788645e940eada959bdde927426e2531c9Paul Duffin return ImmutableSet.of(Maps.immutableEntry(singleKey, singleValue)); 797dd252788645e940eada959bdde927426e2531c9Paul Duffin } 807dd252788645e940eada959bdde927426e2531c9Paul Duffin 817dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 827dd252788645e940eada959bdde927426e2531c9Paul Duffin ImmutableSet<K> createKeySet() { 837dd252788645e940eada959bdde927426e2531c9Paul Duffin return ImmutableSet.of(singleKey); 847dd252788645e940eada959bdde927426e2531c9Paul Duffin } 857dd252788645e940eada959bdde927426e2531c9Paul Duffin 867dd252788645e940eada959bdde927426e2531c9Paul Duffin transient ImmutableBiMap<V, K> inverse; 877dd252788645e940eada959bdde927426e2531c9Paul Duffin 887dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 897dd252788645e940eada959bdde927426e2531c9Paul Duffin public ImmutableBiMap<V, K> inverse() { 907dd252788645e940eada959bdde927426e2531c9Paul Duffin // racy single-check idiom 917dd252788645e940eada959bdde927426e2531c9Paul Duffin ImmutableBiMap<V, K> result = inverse; 927dd252788645e940eada959bdde927426e2531c9Paul Duffin if (result == null) { 930888a09821a98ac0680fad765217302858e70fa4Paul Duffin return inverse = new SingletonImmutableBiMap<V, K>( 940888a09821a98ac0680fad765217302858e70fa4Paul Duffin singleValue, singleKey, this); 957dd252788645e940eada959bdde927426e2531c9Paul Duffin } else { 967dd252788645e940eada959bdde927426e2531c9Paul Duffin return result; 977dd252788645e940eada959bdde927426e2531c9Paul Duffin } 987dd252788645e940eada959bdde927426e2531c9Paul Duffin } 997dd252788645e940eada959bdde927426e2531c9Paul Duffin} 100