Coverage Summary for Class: JdkBackedImmutableBiMap (com.google.common.collect)

Class Method, % Line, %
JdkBackedImmutableBiMap 0% (0/9) 0% (0/28)
JdkBackedImmutableBiMap$InverseEntries 0% (0/4) 0% (0/5)
Total 0% (0/13) 0% (0/33)


1 /* 2  * Copyright (C) 2018 The Guava Authors 3  * 4  * Licensed under the Apache License, Version 2.0 (the "License"); 5  * you may not use this file except in compliance with the License. 6  * You may obtain a copy of the License at 7  * 8  * http://www.apache.org/licenses/LICENSE-2.0 9  * 10  * Unless required by applicable law or agreed to in writing, software 11  * distributed under the License is distributed on an "AS IS" BASIS, 12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13  * See the License for the specific language governing permissions and 14  * limitations under the License. 15  */ 16 package com.google.common.collect; 17  18 import com.google.common.annotations.GwtCompatible; 19 import com.google.common.annotations.VisibleForTesting; 20 import com.google.errorprone.annotations.concurrent.LazyInit; 21 import com.google.j2objc.annotations.RetainedWith; 22 import com.google.j2objc.annotations.WeakOuter; 23 import java.util.Map; 24 import org.checkerframework.checker.nullness.qual.Nullable; 25  26 /** 27  * Implementation of ImmutableBiMap backed by a pair of JDK HashMaps, which have smartness 28  * protecting against hash flooding. 29  */ 30 @GwtCompatible(emulated = true) 31 final class JdkBackedImmutableBiMap<K, V> extends ImmutableBiMap<K, V> { 32  @VisibleForTesting 33  static <K, V> ImmutableBiMap<K, V> create(int n, Entry<K, V>[] entryArray) { 34  Map<K, V> forwardDelegate = Maps.newHashMapWithExpectedSize(n); 35  Map<V, K> backwardDelegate = Maps.newHashMapWithExpectedSize(n); 36  for (int i = 0; i < n; i++) { 37  Entry<K, V> e = RegularImmutableMap.makeImmutable(entryArray[i]); 38  entryArray[i] = e; 39  V oldValue = forwardDelegate.putIfAbsent(e.getKey(), e.getValue()); 40  if (oldValue != null) { 41  throw conflictException("key", e.getKey() + "=" + oldValue, entryArray[i]); 42  } 43  K oldKey = backwardDelegate.putIfAbsent(e.getValue(), e.getKey()); 44  if (oldKey != null) { 45  throw conflictException("value", oldKey + "=" + e.getValue(), entryArray[i]); 46  } 47  } 48  ImmutableList<Entry<K, V>> entryList = ImmutableList.asImmutableList(entryArray, n); 49  return new JdkBackedImmutableBiMap<>(entryList, forwardDelegate, backwardDelegate); 50  } 51  52  private final transient ImmutableList<Entry<K, V>> entries; 53  private final Map<K, V> forwardDelegate; 54  private final Map<V, K> backwardDelegate; 55  56  private JdkBackedImmutableBiMap( 57  ImmutableList<Entry<K, V>> entries, Map<K, V> forwardDelegate, Map<V, K> backwardDelegate) { 58  this.entries = entries; 59  this.forwardDelegate = forwardDelegate; 60  this.backwardDelegate = backwardDelegate; 61  } 62  63  @Override 64  public int size() { 65  return entries.size(); 66  } 67  68  @LazyInit @RetainedWith private transient JdkBackedImmutableBiMap<V, K> inverse; 69  70  @Override 71  public ImmutableBiMap<V, K> inverse() { 72  JdkBackedImmutableBiMap<V, K> result = inverse; 73  if (result == null) { 74  inverse = 75  result = 76  new JdkBackedImmutableBiMap<V, K>( 77  new InverseEntries(), backwardDelegate, forwardDelegate); 78  result.inverse = this; 79  } 80  return result; 81  } 82  83  @WeakOuter 84  private final class InverseEntries extends ImmutableList<Entry<V, K>> { 85  @Override 86  public Entry<V, K> get(int index) { 87  Entry<K, V> entry = entries.get(index); 88  return Maps.immutableEntry(entry.getValue(), entry.getKey()); 89  } 90  91  @Override 92  boolean isPartialView() { 93  return false; 94  } 95  96  @Override 97  public int size() { 98  return entries.size(); 99  } 100  } 101  102  @Override 103  public V get(@Nullable Object key) { 104  return forwardDelegate.get(key); 105  } 106  107  @Override 108  ImmutableSet<Entry<K, V>> createEntrySet() { 109  return new ImmutableMapEntrySet.RegularEntrySet<K, V>(this, entries); 110  } 111  112  @Override 113  ImmutableSet<K> createKeySet() { 114  return new ImmutableMapKeySet<K, V>(this); 115  } 116  117  @Override 118  boolean isPartialView() { 119  return false; 120  } 121 }