10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/* 20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2009 The Guava Authors 30888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * you may not use this file except in compliance with the License. 60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * You may obtain a copy of the License at 70888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 90888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software 110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * See the License for the specific language governing permissions and 140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * limitations under the License. 150888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 170888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.collect; 180888a09821a98ac0680fad765217302858e70fa4Paul Duffin 190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Preconditions.checkNotNull; 200888a09821a98ac0680fad765217302858e70fa4Paul Duffin 210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collections; 220888a09821a98ac0680fad765217302858e70fa4Paul Duffin 230888a09821a98ac0680fad765217302858e70fa4Paul Duffin/** 240888a09821a98ac0680fad765217302858e70fa4Paul Duffin * GWT emulation of {@link SingletonImmutableBiMap}. 250888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 260888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Hayward Chan 270888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 280888a09821a98ac0680fad765217302858e70fa4Paul Duffinfinal class SingletonImmutableBiMap<K, V> extends ImmutableBiMap<K, V> { 290888a09821a98ac0680fad765217302858e70fa4Paul Duffin 300888a09821a98ac0680fad765217302858e70fa4Paul Duffin // These references are used both by the custom field serializer, and by the 310888a09821a98ac0680fad765217302858e70fa4Paul Duffin // GWT compiler to infer the keys and values of the map that needs to be 320888a09821a98ac0680fad765217302858e70fa4Paul Duffin // serialized. 330888a09821a98ac0680fad765217302858e70fa4Paul Duffin // 340888a09821a98ac0680fad765217302858e70fa4Paul Duffin // Although they are non-final, they are package private and the reference is 350888a09821a98ac0680fad765217302858e70fa4Paul Duffin // never modified after a map is constructed. 360888a09821a98ac0680fad765217302858e70fa4Paul Duffin K singleKey; 370888a09821a98ac0680fad765217302858e70fa4Paul Duffin V singleValue; 380888a09821a98ac0680fad765217302858e70fa4Paul Duffin 390888a09821a98ac0680fad765217302858e70fa4Paul Duffin transient SingletonImmutableBiMap<V, K> inverse; 400888a09821a98ac0680fad765217302858e70fa4Paul Duffin 410888a09821a98ac0680fad765217302858e70fa4Paul Duffin SingletonImmutableBiMap(K key, V value) { 420888a09821a98ac0680fad765217302858e70fa4Paul Duffin super(Collections.singletonMap(checkNotNull(key), checkNotNull(value))); 430888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.singleKey = key; 440888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.singleValue = value; 450888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 460888a09821a98ac0680fad765217302858e70fa4Paul Duffin 470888a09821a98ac0680fad765217302858e70fa4Paul Duffin private SingletonImmutableBiMap( 480888a09821a98ac0680fad765217302858e70fa4Paul Duffin K key, V value, SingletonImmutableBiMap<V, K> inverse) { 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin super(Collections.singletonMap(checkNotNull(key), checkNotNull(value))); 500888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.singleKey = key; 510888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.singleValue = value; 520888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.inverse = inverse; 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 540888a09821a98ac0680fad765217302858e70fa4Paul Duffin 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin public ImmutableBiMap<V, K> inverse() { 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin ImmutableBiMap<V, K> result = inverse; 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (result == null) { 590888a09821a98ac0680fad765217302858e70fa4Paul Duffin return inverse = new SingletonImmutableBiMap<V, K>(singleValue, singleKey, this); 600888a09821a98ac0680fad765217302858e70fa4Paul Duffin } else { 610888a09821a98ac0680fad765217302858e70fa4Paul Duffin return result; 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 630888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 640888a09821a98ac0680fad765217302858e70fa4Paul Duffin 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin public ImmutableSet<V> values() { 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin return ImmutableSet.of(singleValue); 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 690888a09821a98ac0680fad765217302858e70fa4Paul Duffin} 70