11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkArgument;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull;
210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Predicates.compose;
220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Predicates.equalTo;
230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Predicates.in;
240888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Predicates.not;
250888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.CollectPreconditions.checkNonnegative;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
300888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.base.Converter;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Equivalence;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Function;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Joiner.MapJoiner;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Objects;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Preconditions;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Predicate;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Predicates;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.MapDifference.ValueDifference;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.primitives.Ints;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.AbstractCollection;
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.AbstractMap;
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Comparator;
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.EnumMap;
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Enumeration;
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.HashMap;
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.IdentityHashMap;
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.LinkedHashMap;
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport java.util.NavigableMap;
563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport java.util.NavigableSet;
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Properties;
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.SortedMap;
607dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.SortedSet;
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.TreeMap;
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.ConcurrentMap;
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable;
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
677dd252788645e940eada959bdde927426e2531c9Paul Duffin * Static utility methods pertaining to {@link Map} instances (including instances of
687dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@link SortedMap}, {@link BiMap}, etc.). Also see this class's counterparts
697dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@link Lists}, {@link Sets} and {@link Queues}.
707dd252788645e940eada959bdde927426e2531c9Paul Duffin *
717dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>See the Guava User Guide article on <a href=
727dd252788645e940eada959bdde927426e2531c9Paul Duffin * "http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Maps">
737dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@code Maps}</a>.
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Mike Bostock
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Isaac Shum
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 (imported from Google Collections Library)
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic final class Maps {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Maps() {}
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
850888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private enum EntryFunction implements Function<Entry<?, ?>, Object> {
867dd252788645e940eada959bdde927426e2531c9Paul Duffin    KEY {
870888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
887dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Nullable
890888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public Object apply(Entry<?, ?> entry) {
907dd252788645e940eada959bdde927426e2531c9Paul Duffin        return entry.getKey();
917dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
927dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
937dd252788645e940eada959bdde927426e2531c9Paul Duffin    VALUE {
940888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
957dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Nullable
960888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public Object apply(Entry<?, ?> entry) {
977dd252788645e940eada959bdde927426e2531c9Paul Duffin        return entry.getValue();
987dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
997dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
1007dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1017dd252788645e940eada959bdde927426e2531c9Paul Duffin
1027dd252788645e940eada959bdde927426e2531c9Paul Duffin  @SuppressWarnings("unchecked")
1037dd252788645e940eada959bdde927426e2531c9Paul Duffin  static <K> Function<Entry<K, ?>, K> keyFunction() {
1047dd252788645e940eada959bdde927426e2531c9Paul Duffin    return (Function) EntryFunction.KEY;
1057dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1067dd252788645e940eada959bdde927426e2531c9Paul Duffin
1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @SuppressWarnings("unchecked")
1087dd252788645e940eada959bdde927426e2531c9Paul Duffin  static <V> Function<Entry<?, V>, V> valueFunction() {
1097dd252788645e940eada959bdde927426e2531c9Paul Duffin    return (Function) EntryFunction.VALUE;
1107dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1117dd252788645e940eada959bdde927426e2531c9Paul Duffin
1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V> Iterator<K> keyIterator(Iterator<Entry<K, V>> entryIterator) {
1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return Iterators.transform(entryIterator, Maps.<K>keyFunction());
1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V> Iterator<V> valueIterator(Iterator<Entry<K, V>> entryIterator) {
1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return Iterators.transform(entryIterator, Maps.<V>valueFunction());
1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V> UnmodifiableIterator<V> valueIterator(
1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin      final UnmodifiableIterator<Entry<K, V>> entryIterator) {
1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return new UnmodifiableIterator<V>() {
1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public boolean hasNext() {
1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return entryIterator.hasNext();
1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public V next() {
1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return entryIterator.next().getValue();
1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    };
1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1357dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
1367dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Returns an immutable map instance containing the given entries.
1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Internally, the returned map will be backed by an {@link EnumMap}.
1387dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1397dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>The iteration order of the returned map follows the enum's iteration
1407dd252788645e940eada959bdde927426e2531c9Paul Duffin   * order, not the order in which the elements appear in the given map.
1417dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1427dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @param map the map to make an immutable copy of
1437dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @return an immutable map containing those entries
1447dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
1457dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
1467dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtCompatible(serializable = true)
1477dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Beta
1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K extends Enum<K>, V> ImmutableMap<K, V> immutableEnumMap(
1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<K, ? extends V> map) {
1507dd252788645e940eada959bdde927426e2531c9Paul Duffin    if (map instanceof ImmutableEnumMap) {
1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @SuppressWarnings("unchecked") // safe covariant cast
1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin      ImmutableEnumMap<K, V> result = (ImmutableEnumMap<K, V>) map;
1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return result;
1547dd252788645e940eada959bdde927426e2531c9Paul Duffin    } else if (map.isEmpty()) {
1557dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableMap.of();
1567dd252788645e940eada959bdde927426e2531c9Paul Duffin    } else {
1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin      for (Map.Entry<K, ? extends V> entry : map.entrySet()) {
1587dd252788645e940eada959bdde927426e2531c9Paul Duffin        checkNotNull(entry.getKey());
1597dd252788645e940eada959bdde927426e2531c9Paul Duffin        checkNotNull(entry.getValue());
1607dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1617dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableEnumMap.asImmutable(new EnumMap<K, V>(map));
1627dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1637dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1647dd252788645e940eada959bdde927426e2531c9Paul Duffin
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Creates a <i>mutable</i>, empty {@code HashMap} instance.
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Note:</b> if mutability is not required, use {@link
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ImmutableMap#of()} instead.
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Note:</b> if {@code K} is an {@code enum} type, use {@link
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #newEnumMap} instead.
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return a new, empty {@code HashMap}
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <K, V> HashMap<K, V> newHashMap() {
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new HashMap<K, V>();
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Creates a {@code HashMap} instance, with a high enough "initial capacity"
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * that it <i>should</i> hold {@code expectedSize} elements without growth.
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * This behavior cannot be broadly guaranteed, but it is observed to be true
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * for OpenJDK 1.6. It also can't be guaranteed that the method isn't
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * inadvertently <i>oversizing</i> the returned map.
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param expectedSize the number of elements you expect to add to the
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *        returned map
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return a new, empty {@code HashMap} with enough capacity to hold {@code
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         expectedSize} elements without resizing
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws IllegalArgumentException if {@code expectedSize} is negative
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> HashMap<K, V> newHashMapWithExpectedSize(
1940888a09821a98ac0680fad765217302858e70fa4Paul Duffin      int expectedSize) {
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new HashMap<K, V>(capacity(expectedSize));
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a capacity that is sufficient to keep the map from being resized as
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * long as it grows no larger than expectedSize and the load factor is >= its
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * default (0.75).
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static int capacity(int expectedSize) {
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (expectedSize < 3) {
2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkNonnegative(expectedSize, "expectedSize");
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return expectedSize + 1;
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (expectedSize < Ints.MAX_POWER_OF_TWO) {
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return expectedSize + expectedSize / 3;
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Integer.MAX_VALUE; // any large value
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Creates a <i>mutable</i> {@code HashMap} instance with the same mappings as
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * the specified map.
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Note:</b> if mutability is not required, use {@link
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ImmutableMap#copyOf(Map)} instead.
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Note:</b> if {@code K} is an {@link Enum} type, use {@link
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #newEnumMap} instead.
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param map the mappings to be placed in the new map
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return a new {@code HashMap} initialized with the mappings from {@code
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         map}
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2280888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> HashMap<K, V> newHashMap(
2290888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<? extends K, ? extends V> map) {
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new HashMap<K, V>(map);
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Creates a <i>mutable</i>, empty, insertion-ordered {@code LinkedHashMap}
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * instance.
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Note:</b> if mutability is not required, use {@link
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ImmutableMap#of()} instead.
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return a new, empty {@code LinkedHashMap}
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <K, V> LinkedHashMap<K, V> newLinkedHashMap() {
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new LinkedHashMap<K, V>();
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Creates a <i>mutable</i>, insertion-ordered {@code LinkedHashMap} instance
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * with the same mappings as the specified map.
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Note:</b> if mutability is not required, use {@link
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ImmutableMap#copyOf(Map)} instead.
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param map the mappings to be placed in the new map
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return a new, {@code LinkedHashMap} initialized with the mappings from
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         {@code map}
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2570888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> LinkedHashMap<K, V> newLinkedHashMap(
2580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<? extends K, ? extends V> map) {
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new LinkedHashMap<K, V>(map);
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a general-purpose instance of {@code ConcurrentMap}, which supports
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * all optional operations of the ConcurrentMap interface. It does not permit
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * null keys or values. It is serializable.
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>This is currently accomplished by calling {@link MapMaker#makeMap()}.
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>It is preferable to use {@code MapMaker} directly (rather than through
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * this method), as it presents numerous useful configuration options,
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * such as the concurrency level, load factor, key/value reference types,
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * and value computation.
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return a new, empty {@code ConcurrentMap}
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 3.0
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <K, V> ConcurrentMap<K, V> newConcurrentMap() {
2780888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return new MapMaker().<K, V>makeMap();
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Creates a <i>mutable</i>, empty {@code TreeMap} instance using the natural
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ordering of its elements.
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Note:</b> if mutability is not required, use {@link
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ImmutableSortedMap#of()} instead.
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return a new, empty {@code TreeMap}
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <K extends Comparable, V> TreeMap<K, V> newTreeMap() {
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new TreeMap<K, V>();
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Creates a <i>mutable</i> {@code TreeMap} instance with the same mappings as
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * the specified map and using the same ordering as the specified map.
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Note:</b> if mutability is not required, use {@link
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ImmutableSortedMap#copyOfSorted(SortedMap)} instead.
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param map the sorted map whose mappings are to be placed in the new map
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *        and whose comparator is to be used to sort the new map
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return a new {@code TreeMap} initialized with the mappings from {@code
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         map} and using the comparator of {@code map}
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <K, V> TreeMap<K, V> newTreeMap(SortedMap<K, ? extends V> map) {
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new TreeMap<K, V>(map);
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Creates a <i>mutable</i>, empty {@code TreeMap} instance using the given
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * comparator.
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Note:</b> if mutability is not required, use {@code
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ImmutableSortedMap.orderedBy(comparator).build()} instead.
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param comparator the comparator to sort the keys with
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return a new, empty {@code TreeMap}
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
3200888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <C, K extends C, V> TreeMap<K, V> newTreeMap(
3210888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Nullable Comparator<C> comparator) {
3227dd252788645e940eada959bdde927426e2531c9Paul Duffin    // Ideally, the extra type parameter "C" shouldn't be necessary. It is a
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // work-around of a compiler type inference quirk that prevents the
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // following code from being compiled:
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Comparator<Class<?>> comparator = null;
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Map<Class<? extends Throwable>, String> map = newTreeMap(comparator);
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new TreeMap<K, V>(comparator);
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Creates an {@code EnumMap} instance.
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param type the key type for this map
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return a new, empty {@code EnumMap}
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <K extends Enum<K>, V> EnumMap<K, V> newEnumMap(Class<K> type) {
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new EnumMap<K, V>(checkNotNull(type));
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Creates an {@code EnumMap} with the same mappings as the specified map.
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param map the map from which to initialize this {@code EnumMap}
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return a new {@code EnumMap} initialized with the mappings from {@code
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         map}
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws IllegalArgumentException if {@code m} is not an {@code EnumMap}
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         instance and contains no mappings
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
3490888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K extends Enum<K>, V> EnumMap<K, V> newEnumMap(
3500888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<K, ? extends V> map) {
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new EnumMap<K, V>(map);
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Creates an {@code IdentityHashMap} instance.
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return a new, empty {@code IdentityHashMap}
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <K, V> IdentityHashMap<K, V> newIdentityHashMap() {
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new IdentityHashMap<K, V>();
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Computes the difference between two maps. This difference is an immutable
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * snapshot of the state of the maps at the time this method is called. It
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * will never change, even if the maps change at a later time.
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Since this method uses {@code HashMap} instances internally, the keys of
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * the supplied maps must be well-behaved with respect to
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link Object#equals} and {@link Object#hashCode}.
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Note:</b>If you only need to know whether two maps have the same
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * mappings, call {@code left.equals(right)} instead of this method.
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param left the map to treat as the "left" map for purposes of comparison
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param right the map to treat as the "right" map for purposes of comparison
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return the difference between the two maps
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3800888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> MapDifference<K, V> difference(
3810888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (left instanceof SortedMap) {
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      SortedMap<K, ? extends V> sortedLeft = (SortedMap<K, ? extends V>) left;
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      SortedMapDifference<K, V> result = difference(sortedLeft, right);
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return result;
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3877dd252788645e940eada959bdde927426e2531c9Paul Duffin    return difference(left, right, Equivalence.equals());
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Computes the difference between two maps. This difference is an immutable
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * snapshot of the state of the maps at the time this method is called. It
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * will never change, even if the maps change at a later time.
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Values are compared using a provided equivalence, in the case of
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * equality, the value on the 'left' is returned in the difference.
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Since this method uses {@code HashMap} instances internally, the keys of
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * the supplied maps must be well-behaved with respect to
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link Object#equals} and {@link Object#hashCode}.
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param left the map to treat as the "left" map for purposes of comparison
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param right the map to treat as the "right" map for purposes of comparison
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param valueEquivalence the equivalence relationship to use to compare
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *    values
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return the difference between the two maps
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 10.0
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta
4100888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> MapDifference<K, V> difference(
4110888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right,
4120888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Equivalence<? super V> valueEquivalence) {
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Preconditions.checkNotNull(valueEquivalence);
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<K, V> onlyOnLeft = newHashMap();
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<K, V> onlyOnRight = new HashMap<K, V>(right); // will whittle it down
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<K, V> onBoth = newHashMap();
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<K, MapDifference.ValueDifference<V>> differences = newHashMap();
4190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    doDifference(left, right, valueEquivalence, onlyOnLeft, onlyOnRight, onBoth, differences);
4200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return new MapDifferenceImpl<K, V>(onlyOnLeft, onlyOnRight, onBoth, differences);
4210888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4230888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static <K, V> void doDifference(
4240888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right,
4250888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Equivalence<? super V> valueEquivalence,
4260888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<K, V> onlyOnLeft, Map<K, V> onlyOnRight, Map<K, V> onBoth,
4270888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<K, MapDifference.ValueDifference<V>> differences) {
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Entry<? extends K, ? extends V> entry : left.entrySet()) {
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      K leftKey = entry.getKey();
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      V leftValue = entry.getValue();
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (right.containsKey(leftKey)) {
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        V rightValue = onlyOnRight.remove(leftKey);
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        if (valueEquivalence.equivalent(leftValue, rightValue)) {
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          onBoth.put(leftKey, leftValue);
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        } else {
4360888a09821a98ac0680fad765217302858e70fa4Paul Duffin          differences.put(
4370888a09821a98ac0680fad765217302858e70fa4Paul Duffin              leftKey, ValueDifferenceImpl.create(leftValue, rightValue));
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } else {
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        onlyOnLeft.put(leftKey, leftValue);
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4450888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static <K, V> Map<K, V> unmodifiableMap(Map<K, V> map) {
4460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    if (map instanceof SortedMap) {
4470888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return Collections.unmodifiableSortedMap((SortedMap<K, ? extends V>) map);
4480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } else {
4490888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return Collections.unmodifiableMap(map);
4500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static class MapDifferenceImpl<K, V> implements MapDifference<K, V> {
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Map<K, V> onlyOnLeft;
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Map<K, V> onlyOnRight;
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Map<K, V> onBoth;
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Map<K, ValueDifference<V>> differences;
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    MapDifferenceImpl(Map<K, V> onlyOnLeft,
4600888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Map<K, V> onlyOnRight, Map<K, V> onBoth,
4610888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Map<K, ValueDifference<V>> differences) {
4620888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.onlyOnLeft = unmodifiableMap(onlyOnLeft);
4630888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.onlyOnRight = unmodifiableMap(onlyOnRight);
4640888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.onBoth = unmodifiableMap(onBoth);
4650888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.differences = unmodifiableMap(differences);
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public boolean areEqual() {
4700888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return onlyOnLeft.isEmpty() && onlyOnRight.isEmpty() && differences.isEmpty();
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Map<K, V> entriesOnlyOnLeft() {
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return onlyOnLeft;
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4780888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Map<K, V> entriesOnlyOnRight() {
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return onlyOnRight;
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4830888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Map<K, V> entriesInCommon() {
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return onBoth;
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Map<K, ValueDifference<V>> entriesDiffering() {
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return differences;
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean equals(Object object) {
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (object == this) {
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return true;
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (object instanceof MapDifference) {
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MapDifference<?, ?> other = (MapDifference<?, ?>) object;
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return entriesOnlyOnLeft().equals(other.entriesOnlyOnLeft())
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            && entriesOnlyOnRight().equals(other.entriesOnlyOnRight())
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            && entriesInCommon().equals(other.entriesInCommon())
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            && entriesDiffering().equals(other.entriesDiffering());
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return false;
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5070888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int hashCode() {
5080888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return Objects.hashCode(entriesOnlyOnLeft(), entriesOnlyOnRight(),
5090888a09821a98ac0680fad765217302858e70fa4Paul Duffin          entriesInCommon(), entriesDiffering());
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5120888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public String toString() {
5130888a09821a98ac0680fad765217302858e70fa4Paul Duffin      if (areEqual()) {
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return "equal";
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      StringBuilder result = new StringBuilder("not equal");
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (!onlyOnLeft.isEmpty()) {
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        result.append(": only on left=").append(onlyOnLeft);
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (!onlyOnRight.isEmpty()) {
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        result.append(": only on right=").append(onlyOnRight);
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (!differences.isEmpty()) {
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        result.append(": value differences=").append(differences);
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return result.toString();
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5310888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static class ValueDifferenceImpl<V>
5320888a09821a98ac0680fad765217302858e70fa4Paul Duffin      implements MapDifference.ValueDifference<V> {
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final V left;
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final V right;
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    static <V> ValueDifference<V> create(@Nullable V left, @Nullable V right) {
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return new ValueDifferenceImpl<V>(left, right);
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private ValueDifferenceImpl(@Nullable V left, @Nullable V right) {
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.left = left;
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.right = right;
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public V leftValue() {
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return left;
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public V rightValue() {
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return right;
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean equals(@Nullable Object object) {
5567dd252788645e940eada959bdde927426e2531c9Paul Duffin      if (object instanceof MapDifference.ValueDifference) {
5570888a09821a98ac0680fad765217302858e70fa4Paul Duffin        MapDifference.ValueDifference<?> that =
5580888a09821a98ac0680fad765217302858e70fa4Paul Duffin            (MapDifference.ValueDifference<?>) object;
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Objects.equal(this.left, that.leftValue())
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            && Objects.equal(this.right, that.rightValue());
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return false;
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int hashCode() {
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Objects.hashCode(left, right);
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public String toString() {
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "(" + left + ", " + right + ")";
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Computes the difference between two sorted maps, using the comparator of
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * the left map, or {@code Ordering.natural()} if the left map uses the
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * natural ordering of its elements. This difference is an immutable snapshot
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * of the state of the maps at the time this method is called. It will never
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * change, even if the maps change at a later time.
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Since this method uses {@code TreeMap} instances internally, the keys of
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * the right map must all compare as distinct according to the comparator
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * of the left map.
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Note:</b>If you only need to know whether two sorted maps have the
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * same mappings, call {@code left.equals(right)} instead of this method.
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param left the map to treat as the "left" map for purposes of comparison
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param right the map to treat as the "right" map for purposes of comparison
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return the difference between the two maps
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 11.0
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
5930888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> SortedMapDifference<K, V> difference(
5940888a09821a98ac0680fad765217302858e70fa4Paul Duffin      SortedMap<K, ? extends V> left, Map<? extends K, ? extends V> right) {
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(left);
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(right);
5970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Comparator<? super K> comparator = orNaturalOrder(left.comparator());
5980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SortedMap<K, V> onlyOnLeft = Maps.newTreeMap(comparator);
5990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SortedMap<K, V> onlyOnRight = Maps.newTreeMap(comparator);
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    onlyOnRight.putAll(right); // will whittle it down
6010888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SortedMap<K, V> onBoth = Maps.newTreeMap(comparator);
6020888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SortedMap<K, MapDifference.ValueDifference<V>> differences =
6030888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Maps.newTreeMap(comparator);
6040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    doDifference(left, right, Equivalence.equals(), onlyOnLeft, onlyOnRight, onBoth, differences);
6050888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return new SortedMapDifferenceImpl<K, V>(onlyOnLeft, onlyOnRight, onBoth, differences);
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6080888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static class SortedMapDifferenceImpl<K, V> extends MapDifferenceImpl<K, V>
6090888a09821a98ac0680fad765217302858e70fa4Paul Duffin      implements SortedMapDifference<K, V> {
6100888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SortedMapDifferenceImpl(SortedMap<K, V> onlyOnLeft,
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        SortedMap<K, V> onlyOnRight, SortedMap<K, V> onBoth,
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        SortedMap<K, ValueDifference<V>> differences) {
6130888a09821a98ac0680fad765217302858e70fa4Paul Duffin      super(onlyOnLeft, onlyOnRight, onBoth, differences);
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public SortedMap<K, ValueDifference<V>> entriesDiffering() {
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (SortedMap<K, ValueDifference<V>>) super.entriesDiffering();
6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public SortedMap<K, V> entriesInCommon() {
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (SortedMap<K, V>) super.entriesInCommon();
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6240888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public SortedMap<K, V> entriesOnlyOnLeft() {
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (SortedMap<K, V>) super.entriesOnlyOnLeft();
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public SortedMap<K, V> entriesOnlyOnRight() {
6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (SortedMap<K, V>) super.entriesOnlyOnRight();
6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the specified comparator if not null; otherwise returns {@code
6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Ordering.natural()}. This method is an abomination of generics; the only
6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * purpose of this method is to contain the ugly type-casting in one place.
6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
6390888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <E> Comparator<? super E> orNaturalOrder(
6400888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Nullable Comparator<? super E> comparator) {
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (comparator != null) { // can't use ? : because of javac bug 5080917
6420888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return comparator;
6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return (Comparator<E>) Ordering.natural();
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6467dd252788645e940eada959bdde927426e2531c9Paul Duffin
6477dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
6480888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns a live {@link Map} view whose keys are the contents of {@code set}
6490888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * and whose values are computed on demand using {@code function}. To get an
6500888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * immutable <i>copy</i> instead, use {@link #toMap(Iterable, Function)}.
6517dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
6527dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>Specifically, for each {@code k} in the backing set, the returned map
6537dd252788645e940eada959bdde927426e2531c9Paul Duffin   * has an entry mapping {@code k} to {@code function.apply(k)}. The {@code
6547dd252788645e940eada959bdde927426e2531c9Paul Duffin   * keySet}, {@code values}, and {@code entrySet} views of the returned map
6557dd252788645e940eada959bdde927426e2531c9Paul Duffin   * iterate in the same order as the backing set.
6567dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
6577dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>Modifications to the backing set are read through to the returned map.
6587dd252788645e940eada959bdde927426e2531c9Paul Duffin   * The returned map supports removal operations if the backing set does.
6597dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Removal operations write through to the backing set.  The returned map
6607dd252788645e940eada959bdde927426e2531c9Paul Duffin   * does not support put operations.
6617dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
6623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p><b>Warning:</b> If the function rejects {@code null}, caution is
6637dd252788645e940eada959bdde927426e2531c9Paul Duffin   * required to make sure the set does not contain {@code null}, because the
6647dd252788645e940eada959bdde927426e2531c9Paul Duffin   * view cannot stop {@code null} from being added to the set.
6657dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
6667dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p><b>Warning:</b> This method assumes that for any instance {@code k} of
6677dd252788645e940eada959bdde927426e2531c9Paul Duffin   * key type {@code K}, {@code k.equals(k2)} implies that {@code k2} is also
6687dd252788645e940eada959bdde927426e2531c9Paul Duffin   * of type {@code K}. Using a key type for which this may not hold, such as
6697dd252788645e940eada959bdde927426e2531c9Paul Duffin   * {@code ArrayList}, may risk a {@code ClassCastException} when calling
6707dd252788645e940eada959bdde927426e2531c9Paul Duffin   * methods on the resulting map view.
6717dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
6727dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
6737dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
6747dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Beta
6750888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> Map<K, V> asMap(
6760888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Set<K> set, Function<? super K, V> function) {
6777dd252788645e940eada959bdde927426e2531c9Paul Duffin    if (set instanceof SortedSet) {
6787dd252788645e940eada959bdde927426e2531c9Paul Duffin      return asMap((SortedSet<K>) set, function);
6797dd252788645e940eada959bdde927426e2531c9Paul Duffin    } else {
6807dd252788645e940eada959bdde927426e2531c9Paul Duffin      return new AsMapView<K, V>(set, function);
6817dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
6827dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
6837dd252788645e940eada959bdde927426e2531c9Paul Duffin
6847dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
6857dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Returns a view of the sorted set as a map, mapping keys from the set
6867dd252788645e940eada959bdde927426e2531c9Paul Duffin   * according to the specified function.
6877dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
6887dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>Specifically, for each {@code k} in the backing set, the returned map
6897dd252788645e940eada959bdde927426e2531c9Paul Duffin   * has an entry mapping {@code k} to {@code function.apply(k)}. The {@code
6907dd252788645e940eada959bdde927426e2531c9Paul Duffin   * keySet}, {@code values}, and {@code entrySet} views of the returned map
6917dd252788645e940eada959bdde927426e2531c9Paul Duffin   * iterate in the same order as the backing set.
6927dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
6937dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>Modifications to the backing set are read through to the returned map.
6947dd252788645e940eada959bdde927426e2531c9Paul Duffin   * The returned map supports removal operations if the backing set does.
6957dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Removal operations write through to the backing set.  The returned map does
6967dd252788645e940eada959bdde927426e2531c9Paul Duffin   * not support put operations.
6977dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
6983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p><b>Warning:</b> If the function rejects {@code null}, caution is
6997dd252788645e940eada959bdde927426e2531c9Paul Duffin   * required to make sure the set does not contain {@code null}, because the
7007dd252788645e940eada959bdde927426e2531c9Paul Duffin   * view cannot stop {@code null} from being added to the set.
7017dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
7027dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p><b>Warning:</b> This method assumes that for any instance {@code k} of
7037dd252788645e940eada959bdde927426e2531c9Paul Duffin   * key type {@code K}, {@code k.equals(k2)} implies that {@code k2} is also of
7047dd252788645e940eada959bdde927426e2531c9Paul Duffin   * type {@code K}. Using a key type for which this may not hold, such as
7057dd252788645e940eada959bdde927426e2531c9Paul Duffin   * {@code ArrayList}, may risk a {@code ClassCastException} when calling
7067dd252788645e940eada959bdde927426e2531c9Paul Duffin   * methods on the resulting map view.
7077dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
7087dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
7097dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
7107dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Beta
7110888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> SortedMap<K, V> asMap(
7120888a09821a98ac0680fad765217302858e70fa4Paul Duffin      SortedSet<K> set, Function<? super K, V> function) {
7130888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return Platform.mapsAsMapSortedSet(set, function);
7140888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
7150888a09821a98ac0680fad765217302858e70fa4Paul Duffin
7160888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V> SortedMap<K, V> asMapSortedIgnoreNavigable(SortedSet<K> set,
7170888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Function<? super K, V> function) {
7187dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new SortedAsMapView<K, V>(set, function);
7197dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
7207dd252788645e940eada959bdde927426e2531c9Paul Duffin
7213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  /**
7223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Returns a view of the navigable set as a map, mapping keys from the set
7233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * according to the specified function.
7243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
7253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>Specifically, for each {@code k} in the backing set, the returned map
7263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * has an entry mapping {@code k} to {@code function.apply(k)}. The {@code
7273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * keySet}, {@code values}, and {@code entrySet} views of the returned map
7283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * iterate in the same order as the backing set.
7293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
7303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>Modifications to the backing set are read through to the returned map.
7313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * The returned map supports removal operations if the backing set does.
7323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Removal operations write through to the backing set.  The returned map
7333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * does not support put operations.
7343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
7353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p><b>Warning:</b> If the function rejects {@code null}, caution is
7363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * required to make sure the set does not contain {@code null}, because the
7373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * view cannot stop {@code null} from being added to the set.
7383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
7393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p><b>Warning:</b> This method assumes that for any instance {@code k} of
7403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * key type {@code K}, {@code k.equals(k2)} implies that {@code k2} is also
7413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * of type {@code K}. Using a key type for which this may not hold, such as
7423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * {@code ArrayList}, may risk a {@code ClassCastException} when calling
7433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * methods on the resulting map view.
7443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
7453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * @since 14.0
7463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   */
7473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Beta
7483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
7493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public static <K, V> NavigableMap<K, V> asMap(
7503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      NavigableSet<K> set, Function<? super K, V> function) {
7513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return new NavigableAsMapView<K, V>(set, function);
7523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
7533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
7547dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static class AsMapView<K, V> extends ImprovedAbstractMap<K, V> {
7557dd252788645e940eada959bdde927426e2531c9Paul Duffin
7567dd252788645e940eada959bdde927426e2531c9Paul Duffin    private final Set<K> set;
7577dd252788645e940eada959bdde927426e2531c9Paul Duffin    final Function<? super K, V> function;
7587dd252788645e940eada959bdde927426e2531c9Paul Duffin
7597dd252788645e940eada959bdde927426e2531c9Paul Duffin    Set<K> backingSet() {
7607dd252788645e940eada959bdde927426e2531c9Paul Duffin      return set;
7617dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7627dd252788645e940eada959bdde927426e2531c9Paul Duffin
7637dd252788645e940eada959bdde927426e2531c9Paul Duffin    AsMapView(Set<K> set, Function<? super K, V> function) {
7647dd252788645e940eada959bdde927426e2531c9Paul Duffin      this.set = checkNotNull(set);
7657dd252788645e940eada959bdde927426e2531c9Paul Duffin      this.function = checkNotNull(function);
7667dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7677dd252788645e940eada959bdde927426e2531c9Paul Duffin
7687dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
7690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public Set<K> createKeySet() {
7707dd252788645e940eada959bdde927426e2531c9Paul Duffin      return removeOnlySet(backingSet());
7717dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7727dd252788645e940eada959bdde927426e2531c9Paul Duffin
7737dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
7740888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Collection<V> createValues() {
7757dd252788645e940eada959bdde927426e2531c9Paul Duffin      return Collections2.transform(set, function);
7767dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7777dd252788645e940eada959bdde927426e2531c9Paul Duffin
7787dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
7797dd252788645e940eada959bdde927426e2531c9Paul Duffin    public int size() {
7807dd252788645e940eada959bdde927426e2531c9Paul Duffin      return backingSet().size();
7817dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7827dd252788645e940eada959bdde927426e2531c9Paul Duffin
7837dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
7847dd252788645e940eada959bdde927426e2531c9Paul Duffin    public boolean containsKey(@Nullable Object key) {
7857dd252788645e940eada959bdde927426e2531c9Paul Duffin      return backingSet().contains(key);
7867dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7877dd252788645e940eada959bdde927426e2531c9Paul Duffin
7887dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
7897dd252788645e940eada959bdde927426e2531c9Paul Duffin    public V get(@Nullable Object key) {
7900888a09821a98ac0680fad765217302858e70fa4Paul Duffin      if (Collections2.safeContains(backingSet(), key)) {
7910888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it
7927dd252788645e940eada959bdde927426e2531c9Paul Duffin        K k = (K) key;
7937dd252788645e940eada959bdde927426e2531c9Paul Duffin        return function.apply(k);
7947dd252788645e940eada959bdde927426e2531c9Paul Duffin      } else {
7957dd252788645e940eada959bdde927426e2531c9Paul Duffin        return null;
7967dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
7977dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7987dd252788645e940eada959bdde927426e2531c9Paul Duffin
7997dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
8007dd252788645e940eada959bdde927426e2531c9Paul Duffin    public V remove(@Nullable Object key) {
8017dd252788645e940eada959bdde927426e2531c9Paul Duffin      if (backingSet().remove(key)) {
8020888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it
8037dd252788645e940eada959bdde927426e2531c9Paul Duffin        K k = (K) key;
8047dd252788645e940eada959bdde927426e2531c9Paul Duffin        return function.apply(k);
8057dd252788645e940eada959bdde927426e2531c9Paul Duffin      } else {
8067dd252788645e940eada959bdde927426e2531c9Paul Duffin        return null;
8077dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
8087dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
8097dd252788645e940eada959bdde927426e2531c9Paul Duffin
8107dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
8117dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void clear() {
8127dd252788645e940eada959bdde927426e2531c9Paul Duffin      backingSet().clear();
8137dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
8147dd252788645e940eada959bdde927426e2531c9Paul Duffin
8157dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
8167dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected Set<Entry<K, V>> createEntrySet() {
8177dd252788645e940eada959bdde927426e2531c9Paul Duffin      return new EntrySet<K, V>() {
8187dd252788645e940eada959bdde927426e2531c9Paul Duffin        @Override
8197dd252788645e940eada959bdde927426e2531c9Paul Duffin        Map<K, V> map() {
8207dd252788645e940eada959bdde927426e2531c9Paul Duffin          return AsMapView.this;
8217dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
8227dd252788645e940eada959bdde927426e2531c9Paul Duffin
8237dd252788645e940eada959bdde927426e2531c9Paul Duffin        @Override
8247dd252788645e940eada959bdde927426e2531c9Paul Duffin        public Iterator<Entry<K, V>> iterator() {
8250888a09821a98ac0680fad765217302858e70fa4Paul Duffin          return asMapEntryIterator(backingSet(), function);
8267dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
8277dd252788645e940eada959bdde927426e2531c9Paul Duffin      };
8287dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
8297dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
8307dd252788645e940eada959bdde927426e2531c9Paul Duffin
8310888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V> Iterator<Entry<K, V>> asMapEntryIterator(
8327dd252788645e940eada959bdde927426e2531c9Paul Duffin      Set<K> set, final Function<? super K, V> function) {
8337dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new TransformedIterator<K, Entry<K,V>>(set.iterator()) {
8347dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
8350888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Entry<K, V> transform(final K key) {
8360888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return immutableEntry(key, function.apply(key));
8377dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
8387dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
8397dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
8407dd252788645e940eada959bdde927426e2531c9Paul Duffin
8410888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static class SortedAsMapView<K, V> extends AsMapView<K, V>
8420888a09821a98ac0680fad765217302858e70fa4Paul Duffin      implements SortedMap<K, V> {
8437dd252788645e940eada959bdde927426e2531c9Paul Duffin
8447dd252788645e940eada959bdde927426e2531c9Paul Duffin    SortedAsMapView(SortedSet<K> set, Function<? super K, V> function) {
8457dd252788645e940eada959bdde927426e2531c9Paul Duffin      super(set, function);
8467dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
8477dd252788645e940eada959bdde927426e2531c9Paul Duffin
8487dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
8497dd252788645e940eada959bdde927426e2531c9Paul Duffin    SortedSet<K> backingSet() {
8507dd252788645e940eada959bdde927426e2531c9Paul Duffin      return (SortedSet<K>) super.backingSet();
8517dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
8527dd252788645e940eada959bdde927426e2531c9Paul Duffin
8530888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
8547dd252788645e940eada959bdde927426e2531c9Paul Duffin    public Comparator<? super K> comparator() {
8557dd252788645e940eada959bdde927426e2531c9Paul Duffin      return backingSet().comparator();
8567dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
8577dd252788645e940eada959bdde927426e2531c9Paul Duffin
8587dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
8597dd252788645e940eada959bdde927426e2531c9Paul Duffin    public Set<K> keySet() {
8607dd252788645e940eada959bdde927426e2531c9Paul Duffin      return removeOnlySortedSet(backingSet());
8617dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
8627dd252788645e940eada959bdde927426e2531c9Paul Duffin
8630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
8647dd252788645e940eada959bdde927426e2531c9Paul Duffin    public SortedMap<K, V> subMap(K fromKey, K toKey) {
8657dd252788645e940eada959bdde927426e2531c9Paul Duffin      return asMap(backingSet().subSet(fromKey, toKey), function);
8667dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
8677dd252788645e940eada959bdde927426e2531c9Paul Duffin
8680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
8697dd252788645e940eada959bdde927426e2531c9Paul Duffin    public SortedMap<K, V> headMap(K toKey) {
8707dd252788645e940eada959bdde927426e2531c9Paul Duffin      return asMap(backingSet().headSet(toKey), function);
8717dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
8727dd252788645e940eada959bdde927426e2531c9Paul Duffin
8730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
8747dd252788645e940eada959bdde927426e2531c9Paul Duffin    public SortedMap<K, V> tailMap(K fromKey) {
8757dd252788645e940eada959bdde927426e2531c9Paul Duffin      return asMap(backingSet().tailSet(fromKey), function);
8767dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
8777dd252788645e940eada959bdde927426e2531c9Paul Duffin
8780888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
8797dd252788645e940eada959bdde927426e2531c9Paul Duffin    public K firstKey() {
8807dd252788645e940eada959bdde927426e2531c9Paul Duffin      return backingSet().first();
8817dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
8827dd252788645e940eada959bdde927426e2531c9Paul Duffin
8830888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
8847dd252788645e940eada959bdde927426e2531c9Paul Duffin    public K lastKey() {
8857dd252788645e940eada959bdde927426e2531c9Paul Duffin      return backingSet().last();
8867dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
8877dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
8887dd252788645e940eada959bdde927426e2531c9Paul Duffin
8893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
8903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private static final class NavigableAsMapView<K, V>
8913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      extends AbstractNavigableMap<K, V> {
8923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    /*
8933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin     * Using AbstractNavigableMap is simpler than extending SortedAsMapView and rewriting all the
8943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin     * NavigableMap methods.
8953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin     */
8963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
8973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    private final NavigableSet<K> set;
8983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    private final Function<? super K, V> function;
8993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
9003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    NavigableAsMapView(NavigableSet<K> ks, Function<? super K, V> vFunction) {
9013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      this.set = checkNotNull(ks);
9023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      this.function = checkNotNull(vFunction);
9033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
9043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
9053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
9063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> subMap(
9073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
9083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return asMap(set.subSet(fromKey, fromInclusive, toKey, toInclusive), function);
9093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
9103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
9113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
9123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
9133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return asMap(set.headSet(toKey, inclusive), function);
9143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
9153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
9163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
9173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
9183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return asMap(set.tailSet(fromKey, inclusive), function);
9193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
9203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
9213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
9223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Comparator<? super K> comparator() {
9233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return set.comparator();
9243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
9253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
9263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
9273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Nullable
9283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public V get(@Nullable Object key) {
9293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      if (Collections2.safeContains(set, key)) {
9303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it
9313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        K k = (K) key;
9323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        return function.apply(k);
9333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      } else {
9343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        return null;
9353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      }
9363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
9373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
9383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
9393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public void clear() {
9403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      set.clear();
9413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
9423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
9433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
9443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    Iterator<Entry<K, V>> entryIterator() {
9453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return asMapEntryIterator(set, function);
9463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
9473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
9483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
9493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    Iterator<Entry<K, V>> descendingEntryIterator() {
9503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return descendingMap().entrySet().iterator();
9513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
9523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
9533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
9543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableSet<K> navigableKeySet() {
9553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return removeOnlyNavigableSet(set);
9563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
9573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
9583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
9593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public int size() {
9603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return set.size();
9613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
9623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
9633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
9643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> descendingMap() {
9653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return asMap(set.descendingSet(), function);
9663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
9673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
9683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
9697dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static <E> Set<E> removeOnlySet(final Set<E> set) {
9707dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new ForwardingSet<E>() {
9717dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
9727dd252788645e940eada959bdde927426e2531c9Paul Duffin      protected Set<E> delegate() {
9737dd252788645e940eada959bdde927426e2531c9Paul Duffin        return set;
9747dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
9757dd252788645e940eada959bdde927426e2531c9Paul Duffin
9767dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
9777dd252788645e940eada959bdde927426e2531c9Paul Duffin      public boolean add(E element) {
9787dd252788645e940eada959bdde927426e2531c9Paul Duffin        throw new UnsupportedOperationException();
9797dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
9807dd252788645e940eada959bdde927426e2531c9Paul Duffin
9817dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
9827dd252788645e940eada959bdde927426e2531c9Paul Duffin      public boolean addAll(Collection<? extends E> es) {
9837dd252788645e940eada959bdde927426e2531c9Paul Duffin        throw new UnsupportedOperationException();
9847dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
9857dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
9867dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
9877dd252788645e940eada959bdde927426e2531c9Paul Duffin
9887dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static <E> SortedSet<E> removeOnlySortedSet(final SortedSet<E> set) {
9897dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new ForwardingSortedSet<E>() {
9907dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
9917dd252788645e940eada959bdde927426e2531c9Paul Duffin      protected SortedSet<E> delegate() {
9927dd252788645e940eada959bdde927426e2531c9Paul Duffin        return set;
9937dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
9947dd252788645e940eada959bdde927426e2531c9Paul Duffin
9957dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
9967dd252788645e940eada959bdde927426e2531c9Paul Duffin      public boolean add(E element) {
9977dd252788645e940eada959bdde927426e2531c9Paul Duffin        throw new UnsupportedOperationException();
9987dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
9997dd252788645e940eada959bdde927426e2531c9Paul Duffin
10007dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
10017dd252788645e940eada959bdde927426e2531c9Paul Duffin      public boolean addAll(Collection<? extends E> es) {
10027dd252788645e940eada959bdde927426e2531c9Paul Duffin        throw new UnsupportedOperationException();
10037dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
10047dd252788645e940eada959bdde927426e2531c9Paul Duffin
10057dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
10067dd252788645e940eada959bdde927426e2531c9Paul Duffin      public SortedSet<E> headSet(E toElement) {
10077dd252788645e940eada959bdde927426e2531c9Paul Duffin        return removeOnlySortedSet(super.headSet(toElement));
10087dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
10097dd252788645e940eada959bdde927426e2531c9Paul Duffin
10107dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
10117dd252788645e940eada959bdde927426e2531c9Paul Duffin      public SortedSet<E> subSet(E fromElement, E toElement) {
10127dd252788645e940eada959bdde927426e2531c9Paul Duffin        return removeOnlySortedSet(super.subSet(fromElement, toElement));
10137dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
10147dd252788645e940eada959bdde927426e2531c9Paul Duffin
10157dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
10167dd252788645e940eada959bdde927426e2531c9Paul Duffin      public SortedSet<E> tailSet(E fromElement) {
10177dd252788645e940eada959bdde927426e2531c9Paul Duffin        return removeOnlySortedSet(super.tailSet(fromElement));
10187dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
10197dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
10203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
10213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
10223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableSet")
10233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private static <E> NavigableSet<E> removeOnlyNavigableSet(final NavigableSet<E> set) {
10243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return new ForwardingNavigableSet<E>() {
10253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      @Override
10263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      protected NavigableSet<E> delegate() {
10273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        return set;
10283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      }
10293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
10303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      @Override
10313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      public boolean add(E element) {
10323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        throw new UnsupportedOperationException();
10333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      }
10343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
10353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      @Override
10363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      public boolean addAll(Collection<? extends E> es) {
10373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        throw new UnsupportedOperationException();
10383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      }
10393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
10403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      @Override
10413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      public SortedSet<E> headSet(E toElement) {
10423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        return removeOnlySortedSet(super.headSet(toElement));
10433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      }
10443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
10453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      @Override
10463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      public SortedSet<E> subSet(E fromElement, E toElement) {
10473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        return removeOnlySortedSet(
10483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin            super.subSet(fromElement, toElement));
10493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      }
10503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
10513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      @Override
10523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      public SortedSet<E> tailSet(E fromElement) {
10533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        return removeOnlySortedSet(super.tailSet(fromElement));
10543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      }
10553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
10563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      @Override
10573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      public NavigableSet<E> headSet(E toElement, boolean inclusive) {
10583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        return removeOnlyNavigableSet(super.headSet(toElement, inclusive));
10593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      }
10603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
10613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      @Override
10623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
10633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        return removeOnlyNavigableSet(super.tailSet(fromElement, inclusive));
10643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      }
10653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
10663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      @Override
10673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
10683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          E toElement, boolean toInclusive) {
10693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        return removeOnlyNavigableSet(super.subSet(
10703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin            fromElement, fromInclusive, toElement, toInclusive));
10713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      }
10723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
10733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      @Override
10743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      public NavigableSet<E> descendingSet() {
10753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        return removeOnlyNavigableSet(super.descendingSet());
10763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      }
10773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    };
10783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
10797dd252788645e940eada959bdde927426e2531c9Paul Duffin
10807dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
10810888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns an immutable map whose keys are the distinct elements of {@code
10820888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * keys} and whose value for each key was computed by {@code valueFunction}.
10830888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * The map's iteration order is the order of the first appearance of each key
10840888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * in {@code keys}.
10850888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
10860888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>If {@code keys} is a {@link Set}, a live view can be obtained instead of
10870888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * a copy using {@link Maps#asMap(Set, Function)}.
10887dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
10897dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @throws NullPointerException if any element of {@code keys} is
10907dd252788645e940eada959bdde927426e2531c9Paul Duffin   *     {@code null}, or if {@code valueFunction} produces {@code null}
10917dd252788645e940eada959bdde927426e2531c9Paul Duffin   *     for any key
10927dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
10937dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
10947dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Beta
10957dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static <K, V> ImmutableMap<K, V> toMap(Iterable<K> keys,
10967dd252788645e940eada959bdde927426e2531c9Paul Duffin      Function<? super K, V> valueFunction) {
10977dd252788645e940eada959bdde927426e2531c9Paul Duffin    return toMap(keys.iterator(), valueFunction);
10987dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
10997dd252788645e940eada959bdde927426e2531c9Paul Duffin
11007dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
11010888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns an immutable map whose keys are the distinct elements of {@code
11020888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * keys} and whose value for each key was computed by {@code valueFunction}.
11030888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * The map's iteration order is the order of the first appearance of each key
11040888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * in {@code keys}.
11057dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
11067dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @throws NullPointerException if any element of {@code keys} is
11077dd252788645e940eada959bdde927426e2531c9Paul Duffin   *     {@code null}, or if {@code valueFunction} produces {@code null}
11087dd252788645e940eada959bdde927426e2531c9Paul Duffin   *     for any key
11097dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
11107dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
11117dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Beta
11127dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static <K, V> ImmutableMap<K, V> toMap(Iterator<K> keys,
11137dd252788645e940eada959bdde927426e2531c9Paul Duffin      Function<? super K, V> valueFunction) {
11147dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(valueFunction);
11157dd252788645e940eada959bdde927426e2531c9Paul Duffin    // Using LHM instead of a builder so as not to fail on duplicate keys
11167dd252788645e940eada959bdde927426e2531c9Paul Duffin    Map<K, V> builder = newLinkedHashMap();
11177dd252788645e940eada959bdde927426e2531c9Paul Duffin    while (keys.hasNext()) {
11187dd252788645e940eada959bdde927426e2531c9Paul Duffin      K key = keys.next();
11197dd252788645e940eada959bdde927426e2531c9Paul Duffin      builder.put(key, valueFunction.apply(key));
11207dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
11217dd252788645e940eada959bdde927426e2531c9Paul Duffin    return ImmutableMap.copyOf(builder);
11227dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
11237dd252788645e940eada959bdde927426e2531c9Paul Duffin
11241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1125dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * Returns an immutable map for which the {@link Map#values} are the given
1126dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * elements in the given order, and each key is the product of invoking a
1127dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * supplied function on its corresponding value.
11283c77433663281544363151bf284b0240dfd22a42Paul Duffin   *
1129dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @param values the values to use when constructing the {@code Map}
1130dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @param keyFunction the function used to produce the key for each value
1131dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @return a map mapping the result of evaluating the function {@code
1132dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *         keyFunction} on each value in the input collection to that value
1133dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @throws IllegalArgumentException if {@code keyFunction} produces the same
1134dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *         key for more than one value in the input collection
1135dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @throws NullPointerException if any elements of {@code values} is null, or
1136dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *         if {@code keyFunction} produces {@code null} for any value
11371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
11380888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> ImmutableMap<K, V> uniqueIndex(
11390888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Iterable<V> values, Function<? super V, K> keyFunction) {
1140dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    return uniqueIndex(values.iterator(), keyFunction);
11411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1144dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * Returns an immutable map for which the {@link Map#values} are the given
1145dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * elements in the given order, and each key is the product of invoking a
1146dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * supplied function on its corresponding value.
11473c77433663281544363151bf284b0240dfd22a42Paul Duffin   *
1148dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @param values the values to use when constructing the {@code Map}
1149dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @param keyFunction the function used to produce the key for each value
1150dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @return a map mapping the result of evaluating the function {@code
1151dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *         keyFunction} on each value in the input collection to that value
1152dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @throws IllegalArgumentException if {@code keyFunction} produces the same
1153dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *         key for more than one value in the input collection
1154dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @throws NullPointerException if any elements of {@code values} is null, or
1155dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *         if {@code keyFunction} produces {@code null} for any value
1156dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @since 10.0
11571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
11580888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> ImmutableMap<K, V> uniqueIndex(
11590888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Iterator<V> values, Function<? super V, K> keyFunction) {
1160dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    checkNotNull(keyFunction);
1161dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    ImmutableMap.Builder<K, V> builder = ImmutableMap.builder();
1162dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    while (values.hasNext()) {
1163dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin      V value = values.next();
1164dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin      builder.put(keyFunction.apply(value), value);
11653c77433663281544363151bf284b0240dfd22a42Paul Duffin    }
1166dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    return builder.build();
1167dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin  }
11681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1169dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin  /**
1170dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * Creates an {@code ImmutableMap<String, String>} from a {@code Properties}
1171dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * instance. Properties normally derive from {@code Map<Object, Object>}, but
1172dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * they typically contain strings, which is awkward. This method lets you get
1173dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * a plain-old-{@code Map} out of a {@code Properties}.
1174dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *
1175dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @param properties a {@code Properties} object to be converted
1176dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @return an immutable map containing all the entries in {@code properties}
1177dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @throws ClassCastException if any key in {@code Properties} is not a {@code
1178dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *         String}
1179dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @throws NullPointerException if any key or value in {@code Properties} is
1180dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *         null
1181dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   */
1182dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin  @GwtIncompatible("java.util.Properties")
11830888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static ImmutableMap<String, String> fromProperties(
11840888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Properties properties) {
1185dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
11861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1187dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    for (Enumeration<?> e = properties.propertyNames(); e.hasMoreElements();) {
1188dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin      String key = (String) e.nextElement();
1189dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin      builder.put(key, properties.getProperty(key));
11901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1192dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    return builder.build();
1193dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin  }
11941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1195dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin  /**
1196dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * Returns an immutable map entry with the specified key and value. The {@link
1197dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * Entry#setValue} operation throws an {@link UnsupportedOperationException}.
1198dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *
1199dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * <p>The returned entry is serializable.
1200dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *
1201dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @param key the key to be associated with the returned entry
1202dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @param value the value to be associated with the returned entry
1203dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   */
1204dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin  @GwtCompatible(serializable = true)
12050888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> Entry<K, V> immutableEntry(
12060888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Nullable K key, @Nullable V value) {
1207dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    return new ImmutableEntry<K, V>(key, value);
1208dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin  }
12093c77433663281544363151bf284b0240dfd22a42Paul Duffin
1210dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin  /**
1211dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * Returns an unmodifiable view of the specified set of entries. The {@link
1212dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * Entry#setValue} operation throws an {@link UnsupportedOperationException},
1213dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * as do any operations that would modify the returned set.
1214dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *
1215dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @param entrySet the entries for which to return an unmodifiable view
1216dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @return an unmodifiable view of the entries
1217dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   */
12180888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V> Set<Entry<K, V>> unmodifiableEntrySet(
12190888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Set<Entry<K, V>> entrySet) {
12200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return new UnmodifiableEntrySet<K, V>(
12210888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Collections.unmodifiableSet(entrySet));
1222dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin  }
12233c77433663281544363151bf284b0240dfd22a42Paul Duffin
1224dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin  /**
1225dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * Returns an unmodifiable view of the specified map entry. The {@link
1226dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * Entry#setValue} operation throws an {@link UnsupportedOperationException}.
1227dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * This also has the side-effect of redefining {@code equals} to comply with
1228dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * the Entry contract, to avoid a possible nefarious implementation of equals.
1229dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *
1230dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @param entry the entry for which to return an unmodifiable view
1231dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @return an unmodifiable view of the entry
1232dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   */
12330888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V> Entry<K, V> unmodifiableEntry(final Entry<? extends K, ? extends V> entry) {
1234dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    checkNotNull(entry);
1235dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    return new AbstractMapEntry<K, V>() {
12360888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override public K getKey() {
1237dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin        return entry.getKey();
12383c77433663281544363151bf284b0240dfd22a42Paul Duffin      }
12393c77433663281544363151bf284b0240dfd22a42Paul Duffin
12400888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override public V getValue() {
1241dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin        return entry.getValue();
12423c77433663281544363151bf284b0240dfd22a42Paul Duffin      }
1243dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    };
1244dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin  }
1245dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin
1246dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin  /** @see Multimaps#unmodifiableEntries */
12470888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static class UnmodifiableEntries<K, V>
12480888a09821a98ac0680fad765217302858e70fa4Paul Duffin      extends ForwardingCollection<Entry<K, V>> {
1249dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    private final Collection<Entry<K, V>> entries;
1250dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin
1251dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    UnmodifiableEntries(Collection<Entry<K, V>> entries) {
1252dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin      this.entries = entries;
12533c77433663281544363151bf284b0240dfd22a42Paul Duffin    }
12543c77433663281544363151bf284b0240dfd22a42Paul Duffin
12550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected Collection<Entry<K, V>> delegate() {
1256dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin      return entries;
12573c77433663281544363151bf284b0240dfd22a42Paul Duffin    }
12583c77433663281544363151bf284b0240dfd22a42Paul Duffin
12590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Iterator<Entry<K, V>> iterator() {
1260dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin      final Iterator<Entry<K, V>> delegate = super.iterator();
12610888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new UnmodifiableIterator<Entry<K, V>>() {
12627dd252788645e940eada959bdde927426e2531c9Paul Duffin        @Override
12630888a09821a98ac0680fad765217302858e70fa4Paul Duffin        public boolean hasNext() {
12640888a09821a98ac0680fad765217302858e70fa4Paul Duffin          return delegate.hasNext();
12651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
12661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12670888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @Override public Entry<K, V> next() {
12680888a09821a98ac0680fad765217302858e70fa4Paul Duffin          return unmodifiableEntry(delegate.next());
12691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
12701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      };
12711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1273dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    // See java.util.Collections.UnmodifiableEntrySet for details on attacks.
12741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Object[] toArray() {
12760888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return standardToArray();
12771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12790888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public <T> T[] toArray(T[] array) {
12800888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return standardToArray(array);
12811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12820888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
12831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12840888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /** @see Maps#unmodifiableEntrySet(Set) */
12850888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static class UnmodifiableEntrySet<K, V>
12860888a09821a98ac0680fad765217302858e70fa4Paul Duffin      extends UnmodifiableEntries<K, V> implements Set<Entry<K, V>> {
12870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    UnmodifiableEntrySet(Set<Entry<K, V>> entries) {
12880888a09821a98ac0680fad765217302858e70fa4Paul Duffin      super(entries);
12891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12910888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // See java.util.Collections.UnmodifiableEntrySet for details on attacks.
12920888a09821a98ac0680fad765217302858e70fa4Paul Duffin
12930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean equals(@Nullable Object object) {
12940888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return Sets.equalsImpl(this, object);
12951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int hashCode() {
12980888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return Sets.hashCodeImpl(this);
12991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13000888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
13011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13020888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
13030888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns a {@link Converter} that converts values using {@link BiMap#get bimap.get()},
13040888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * and whose inverse view converts values using
13050888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@link BiMap#inverse bimap.inverse()}{@code .get()}.
13060888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
13070888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>To use a plain {@link Map} as a {@link Function}, see
13080888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@link com.google.common.base.Functions#forMap(Map)} or
13090888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * {@link com.google.common.base.Functions#forMap(Map, Object)}.
13100888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *
13110888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * @since 16.0
13120888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
13130888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Beta
13140888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <A, B> Converter<A, B> asConverter(final BiMap<A, B> bimap) {
13150888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return new BiMapConverter<A, B>(bimap);
13160888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
13170888a09821a98ac0680fad765217302858e70fa4Paul Duffin
13180888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static final class BiMapConverter<A, B> extends Converter<A, B> implements Serializable {
13190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private final BiMap<A, B> bimap;
13200888a09821a98ac0680fad765217302858e70fa4Paul Duffin
13210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    BiMapConverter(BiMap<A, B> bimap) {
13220888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.bimap = checkNotNull(bimap);
13231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13257dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
13260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    protected B doForward(A a) {
13270888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return convert(bimap, a);
13283c77433663281544363151bf284b0240dfd22a42Paul Duffin    }
13293c77433663281544363151bf284b0240dfd22a42Paul Duffin
13307dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
13310888a09821a98ac0680fad765217302858e70fa4Paul Duffin    protected A doBackward(B b) {
13320888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return convert(bimap.inverse(), b);
13331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13350888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private static <X, Y> Y convert(BiMap<X, Y> bimap, X input) {
13360888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Y output = bimap.get(input);
13370888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkArgument(output != null, "No non-null mapping present for input: %s", input);
13380888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return output;
13391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13417dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
13427dd252788645e940eada959bdde927426e2531c9Paul Duffin    public boolean equals(@Nullable Object object) {
13430888a09821a98ac0680fad765217302858e70fa4Paul Duffin      if (object instanceof BiMapConverter) {
13440888a09821a98ac0680fad765217302858e70fa4Paul Duffin        BiMapConverter<?, ?> that = (BiMapConverter<?, ?>) object;
13450888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return this.bimap.equals(that.bimap);
13460888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
13470888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return false;
13481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13507dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
13517dd252788645e940eada959bdde927426e2531c9Paul Duffin    public int hashCode() {
13520888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return bimap.hashCode();
13531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13540888a09821a98ac0680fad765217302858e70fa4Paul Duffin
13550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // There's really no good way to implement toString() without printing the entire BiMap, right?
13560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
13570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public String toString() {
13580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return "Maps.asConverter(" + bimap + ")";
13590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
13600888a09821a98ac0680fad765217302858e70fa4Paul Duffin
13610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private static final long serialVersionUID = 0L;
13621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
13657dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Returns a synchronized (thread-safe) bimap backed by the specified bimap.
13667dd252788645e940eada959bdde927426e2531c9Paul Duffin   * In order to guarantee serial access, it is critical that <b>all</b> access
13677dd252788645e940eada959bdde927426e2531c9Paul Duffin   * to the backing bimap is accomplished through the returned bimap.
13687dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
13697dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>It is imperative that the user manually synchronize on the returned map
13707dd252788645e940eada959bdde927426e2531c9Paul Duffin   * when accessing any of its collection views: <pre>   {@code
13717dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
13727dd252788645e940eada959bdde927426e2531c9Paul Duffin   *   BiMap<Long, String> map = Maps.synchronizedBiMap(
13737dd252788645e940eada959bdde927426e2531c9Paul Duffin   *       HashBiMap.<Long, String>create());
13747dd252788645e940eada959bdde927426e2531c9Paul Duffin   *   ...
13757dd252788645e940eada959bdde927426e2531c9Paul Duffin   *   Set<Long> set = map.keySet();  // Needn't be in synchronized block
13767dd252788645e940eada959bdde927426e2531c9Paul Duffin   *   ...
13777dd252788645e940eada959bdde927426e2531c9Paul Duffin   *   synchronized (map) {  // Synchronizing on map, not set!
13787dd252788645e940eada959bdde927426e2531c9Paul Duffin   *     Iterator<Long> it = set.iterator(); // Must be in synchronized block
13797dd252788645e940eada959bdde927426e2531c9Paul Duffin   *     while (it.hasNext()) {
13807dd252788645e940eada959bdde927426e2531c9Paul Duffin   *       foo(it.next());
13817dd252788645e940eada959bdde927426e2531c9Paul Duffin   *     }
13827dd252788645e940eada959bdde927426e2531c9Paul Duffin   *   }}</pre>
13837dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
13840888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>Failure to follow this advice may result in non-deterministic behavior.
13857dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
13867dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>The returned bimap will be serializable if the specified bimap is
13877dd252788645e940eada959bdde927426e2531c9Paul Duffin   * serializable.
13887dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
13897dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @param bimap the bimap to be wrapped in a synchronized view
13907dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @return a sychronized view of the specified bimap
13917dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
13927dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static <K, V> BiMap<K, V> synchronizedBiMap(BiMap<K, V> bimap) {
13937dd252788645e940eada959bdde927426e2531c9Paul Duffin    return Synchronized.biMap(bimap, null);
13947dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
13957dd252788645e940eada959bdde927426e2531c9Paul Duffin
13967dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
13971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an unmodifiable view of the specified bimap. This method allows
13981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * modules to provide users with "read-only" access to internal bimaps. Query
13991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * operations on the returned bimap "read through" to the specified bimap, and
14001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * attempts to modify the returned map, whether direct or via its collection
14011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * views, result in an {@code UnsupportedOperationException}.
14021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
14031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The returned bimap will be serializable if the specified bimap is
14041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * serializable.
14051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
14061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param bimap the bimap for which an unmodifiable view is to be returned
14071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return an unmodifiable view of the specified bimap
14081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
14090888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> BiMap<K, V> unmodifiableBiMap(
14100888a09821a98ac0680fad765217302858e70fa4Paul Duffin      BiMap<? extends K, ? extends V> bimap) {
14111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new UnmodifiableBiMap<K, V>(bimap, null);
14121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
14131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /** @see Maps#unmodifiableBiMap(BiMap) */
14150888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static class UnmodifiableBiMap<K, V>
14160888a09821a98ac0680fad765217302858e70fa4Paul Duffin      extends ForwardingMap<K, V> implements BiMap<K, V>, Serializable {
14171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Map<K, V> unmodifiableMap;
14181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final BiMap<? extends K, ? extends V> delegate;
14197dd252788645e940eada959bdde927426e2531c9Paul Duffin    BiMap<V, K> inverse;
14201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    transient Set<V> values;
14211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    UnmodifiableBiMap(BiMap<? extends K, ? extends V> delegate,
14230888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @Nullable BiMap<V, K> inverse) {
14241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      unmodifiableMap = Collections.unmodifiableMap(delegate);
14251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.delegate = delegate;
14261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.inverse = inverse;
14271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
14281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14290888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected Map<K, V> delegate() {
14301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return unmodifiableMap;
14311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
14321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
14341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public V forcePut(K key, V value) {
14351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
14361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
14371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14380888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
14391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public BiMap<V, K> inverse() {
14401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      BiMap<V, K> result = inverse;
14410888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return (result == null)
14420888a09821a98ac0680fad765217302858e70fa4Paul Duffin          ? inverse = new UnmodifiableBiMap<V, K>(delegate.inverse(), this)
14431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          : result;
14441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
14451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Set<V> values() {
14471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<V> result = values;
14480888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return (result == null)
14490888a09821a98ac0680fad765217302858e70fa4Paul Duffin          ? values = Collections.unmodifiableSet(delegate.values())
14500888a09821a98ac0680fad765217302858e70fa4Paul Duffin          : result;
14511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
14521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static final long serialVersionUID = 0;
14541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
14551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
14571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a view of a map where each value is transformed by a function. All
14581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * other properties of the map, such as iteration order, are left intact. For
14591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * example, the code: <pre>   {@code
14601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
14611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *   Map<String, Integer> map = ImmutableMap.of("a", 4, "b", 9);
14621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *   Function<Integer, Double> sqrt =
14631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *       new Function<Integer, Double>() {
14641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         public Double apply(Integer in) {
14651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *           return Math.sqrt((int) in);
14661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         }
14671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *       };
14681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *   Map<String, Double> transformed = Maps.transformValues(map, sqrt);
14691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *   System.out.println(transformed);}</pre>
14701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
14711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ... prints {@code {a=2.0, b=3.0}}.
14721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
14731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Changes in the underlying map are reflected in this view. Conversely,
14741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * this view supports removal operations, and these are reflected in the
14751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * underlying map.
14761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
14771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>It's acceptable for the underlying map to contain null keys, and even
14781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * null values provided that the function is capable of accepting null input.
14791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * The transformed map might contain null values, if the function sometimes
14801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * gives a null result.
14811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
14821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The returned map is not thread-safe or serializable, even if the
14831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * underlying map is.
14841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
14851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The function is applied lazily, invoked when needed. This is necessary
14861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * for the returned map to be a view, but it means that the function will be
14871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * applied many times for bulk operations like {@link Map#containsValue} and
14881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code Map.toString()}. For this to perform well, {@code function} should
14891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * be fast. To avoid lazy evaluation when the returned map doesn't need to be
14901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * a view, copy the returned map into a new map of your choosing.
14911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
14920888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V1, V2> Map<K, V2> transformValues(
14930888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<K, V1> fromMap, Function<? super V1, V2> function) {
14947dd252788645e940eada959bdde927426e2531c9Paul Duffin    return transformEntries(fromMap, asEntryTransformer(function));
14951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
14961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
14981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a view of a sorted map where each value is transformed by a
14991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * function. All other properties of the map, such as iteration order, are
15001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * left intact. For example, the code: <pre>   {@code
15011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
15021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *   SortedMap<String, Integer> map = ImmutableSortedMap.of("a", 4, "b", 9);
15031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *   Function<Integer, Double> sqrt =
15041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *       new Function<Integer, Double>() {
15051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         public Double apply(Integer in) {
15061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *           return Math.sqrt((int) in);
15071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         }
15081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *       };
15091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *   SortedMap<String, Double> transformed =
15100888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *        Maps.transformValues(map, sqrt);
15111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *   System.out.println(transformed);}</pre>
15121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
15131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ... prints {@code {a=2.0, b=3.0}}.
15141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
15151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Changes in the underlying map are reflected in this view. Conversely,
15161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * this view supports removal operations, and these are reflected in the
15171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * underlying map.
15181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
15191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>It's acceptable for the underlying map to contain null keys, and even
15201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * null values provided that the function is capable of accepting null input.
15211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * The transformed map might contain null values, if the function sometimes
15221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * gives a null result.
15231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
15241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The returned map is not thread-safe or serializable, even if the
15251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * underlying map is.
15261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
15271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The function is applied lazily, invoked when needed. This is necessary
15281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * for the returned map to be a view, but it means that the function will be
15291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * applied many times for bulk operations like {@link Map#containsValue} and
15301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code Map.toString()}. For this to perform well, {@code function} should
15311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * be fast. To avoid lazy evaluation when the returned map doesn't need to be
15321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * a view, copy the returned map into a new map of your choosing.
15331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
15341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 11.0
15351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
15360888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V1, V2> SortedMap<K, V2> transformValues(
15370888a09821a98ac0680fad765217302858e70fa4Paul Duffin      SortedMap<K, V1> fromMap, Function<? super V1, V2> function) {
15387dd252788645e940eada959bdde927426e2531c9Paul Duffin    return transformEntries(fromMap, asEntryTransformer(function));
15397dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
15407dd252788645e940eada959bdde927426e2531c9Paul Duffin
1541dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin  /**
15423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Returns a view of a navigable map where each value is transformed by a
15433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * function. All other properties of the map, such as iteration order, are
15443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * left intact.  For example, the code: <pre>   {@code
15453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
15463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   NavigableMap<String, Integer> map = Maps.newTreeMap();
15473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   map.put("a", 4);
15483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   map.put("b", 9);
15493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   Function<Integer, Double> sqrt =
15503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *       new Function<Integer, Double>() {
15513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *         public Double apply(Integer in) {
15523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *           return Math.sqrt((int) in);
15533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *         }
15543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *       };
15553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   NavigableMap<String, Double> transformed =
15563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *        Maps.transformNavigableValues(map, sqrt);
15573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   System.out.println(transformed);}</pre>
15583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
15593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * ... prints {@code {a=2.0, b=3.0}}.
15603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
15613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Changes in the underlying map are reflected in this view.
15623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Conversely, this view supports removal operations, and these are reflected
15633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * in the underlying map.
15643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
15653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>It's acceptable for the underlying map to contain null keys, and even
15663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * null values provided that the function is capable of accepting null input.
15673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * The transformed map might contain null values, if the function sometimes
15683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * gives a null result.
15693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
15703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>The returned map is not thread-safe or serializable, even if the
15713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * underlying map is.
15723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
15733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>The function is applied lazily, invoked when needed. This is necessary
15743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * for the returned map to be a view, but it means that the function will be
15753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * applied many times for bulk operations like {@link Map#containsValue} and
15763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * {@code Map.toString()}. For this to perform well, {@code function} should
15773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * be fast. To avoid lazy evaluation when the returned map doesn't need to be
15783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * a view, copy the returned map into a new map of your choosing.
15793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
15803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * @since 13.0
15813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   */
15823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
15833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public static <K, V1, V2> NavigableMap<K, V2> transformValues(
15843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      NavigableMap<K, V1> fromMap, Function<? super V1, V2> function) {
15853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return transformEntries(fromMap, asEntryTransformer(function));
15863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
15873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
15883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  /**
1589dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * Returns a view of a map whose values are derived from the original map's
1590dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * entries. In contrast to {@link #transformValues}, this method's
1591dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * entry-transformation logic may depend on the key as well as the value.
15921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
15931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>All other properties of the transformed map, such as iteration order,
15941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * are left intact. For example, the code: <pre>   {@code
15951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
15961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *   Map<String, Boolean> options =
1597dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *       ImmutableMap.of("verbose", true, "sort", false);
15981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *   EntryTransformer<String, Boolean, String> flagPrefixer =
15991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *       new EntryTransformer<String, Boolean, String>() {
16001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         public String transformEntry(String key, Boolean value) {
1601dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *           return value ? key : "no" + key;
16021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         }
16031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *       };
1604dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *   Map<String, String> transformed =
1605dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *       Maps.transformEntries(options, flagPrefixer);
16061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *   System.out.println(transformed);}</pre>
16071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1608dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * ... prints {@code {verbose=verbose, sort=nosort}}.
16091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
16101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Changes in the underlying map are reflected in this view. Conversely,
16111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * this view supports removal operations, and these are reflected in the
16121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * underlying map.
16131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
16141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>It's acceptable for the underlying map to contain null keys and null
16151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * values provided that the transformer is capable of accepting null inputs.
16161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * The transformed map might contain null values if the transformer sometimes
16171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * gives a null result.
16181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
16191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The returned map is not thread-safe or serializable, even if the
16201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * underlying map is.
16211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
16221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The transformer is applied lazily, invoked when needed. This is
16231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * necessary for the returned map to be a view, but it means that the
16241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * transformer will be applied many times for bulk operations like {@link
16251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Map#containsValue} and {@link Object#toString}. For this to perform well,
16261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code transformer} should be fast. To avoid lazy evaluation when the
16271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * returned map doesn't need to be a view, copy the returned map into a new
16281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * map of your choosing.
16291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
16301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Warning:</b> This method assumes that for any instance {@code k} of
16311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code EntryTransformer} key type {@code K}, {@code k.equals(k2)} implies
16321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * that {@code k2} is also of type {@code K}. Using an {@code
16331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * EntryTransformer} key type for which this may not hold, such as {@code
16341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ArrayList}, may risk a {@code ClassCastException} when calling methods on
16351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * the transformed map.
16361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1637dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @since 7.0
16381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
16390888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V1, V2> Map<K, V2> transformEntries(
16400888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<K, V1> fromMap,
16413c77433663281544363151bf284b0240dfd22a42Paul Duffin      EntryTransformer<? super K, ? super V1, V2> transformer) {
1642dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    if (fromMap instanceof SortedMap) {
1643dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin      return transformEntries((SortedMap<K, V1>) fromMap, transformer);
1644dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    }
1645dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    return new TransformedEntriesMap<K, V1, V2>(fromMap, transformer);
16463c77433663281544363151bf284b0240dfd22a42Paul Duffin  }
16473c77433663281544363151bf284b0240dfd22a42Paul Duffin
16483c77433663281544363151bf284b0240dfd22a42Paul Duffin  /**
1649dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * Returns a view of a sorted map whose values are derived from the original
1650dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * sorted map's entries. In contrast to {@link #transformValues}, this
1651dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * method's entry-transformation logic may depend on the key as well as the
1652dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * value.
16533c77433663281544363151bf284b0240dfd22a42Paul Duffin   *
16543c77433663281544363151bf284b0240dfd22a42Paul Duffin   * <p>All other properties of the transformed map, such as iteration order,
16553c77433663281544363151bf284b0240dfd22a42Paul Duffin   * are left intact. For example, the code: <pre>   {@code
16563c77433663281544363151bf284b0240dfd22a42Paul Duffin   *
1657dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *   Map<String, Boolean> options =
1658dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *       ImmutableSortedMap.of("verbose", true, "sort", false);
16593c77433663281544363151bf284b0240dfd22a42Paul Duffin   *   EntryTransformer<String, Boolean, String> flagPrefixer =
16603c77433663281544363151bf284b0240dfd22a42Paul Duffin   *       new EntryTransformer<String, Boolean, String>() {
16613c77433663281544363151bf284b0240dfd22a42Paul Duffin   *         public String transformEntry(String key, Boolean value) {
1662dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *           return value ? key : "yes" + key;
16633c77433663281544363151bf284b0240dfd22a42Paul Duffin   *         }
16643c77433663281544363151bf284b0240dfd22a42Paul Duffin   *       };
1665dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   *   SortedMap<String, String> transformed =
16660888a09821a98ac0680fad765217302858e70fa4Paul Duffin   *       Maps.transformEntries(options, flagPrefixer);
16673c77433663281544363151bf284b0240dfd22a42Paul Duffin   *   System.out.println(transformed);}</pre>
16683c77433663281544363151bf284b0240dfd22a42Paul Duffin   *
16693c77433663281544363151bf284b0240dfd22a42Paul Duffin   * ... prints {@code {sort=yessort, verbose=verbose}}.
16703c77433663281544363151bf284b0240dfd22a42Paul Duffin   *
1671dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * <p>Changes in the underlying map are reflected in this view. Conversely,
1672dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * this view supports removal operations, and these are reflected in the
1673dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * underlying map.
16743c77433663281544363151bf284b0240dfd22a42Paul Duffin   *
16753c77433663281544363151bf284b0240dfd22a42Paul Duffin   * <p>It's acceptable for the underlying map to contain null keys and null
16763c77433663281544363151bf284b0240dfd22a42Paul Duffin   * values provided that the transformer is capable of accepting null inputs.
16773c77433663281544363151bf284b0240dfd22a42Paul Duffin   * The transformed map might contain null values if the transformer sometimes
16783c77433663281544363151bf284b0240dfd22a42Paul Duffin   * gives a null result.
16793c77433663281544363151bf284b0240dfd22a42Paul Duffin   *
16803c77433663281544363151bf284b0240dfd22a42Paul Duffin   * <p>The returned map is not thread-safe or serializable, even if the
16813c77433663281544363151bf284b0240dfd22a42Paul Duffin   * underlying map is.
16823c77433663281544363151bf284b0240dfd22a42Paul Duffin   *
16833c77433663281544363151bf284b0240dfd22a42Paul Duffin   * <p>The transformer is applied lazily, invoked when needed. This is
16843c77433663281544363151bf284b0240dfd22a42Paul Duffin   * necessary for the returned map to be a view, but it means that the
16853c77433663281544363151bf284b0240dfd22a42Paul Duffin   * transformer will be applied many times for bulk operations like {@link
16863c77433663281544363151bf284b0240dfd22a42Paul Duffin   * Map#containsValue} and {@link Object#toString}. For this to perform well,
16873c77433663281544363151bf284b0240dfd22a42Paul Duffin   * {@code transformer} should be fast. To avoid lazy evaluation when the
16883c77433663281544363151bf284b0240dfd22a42Paul Duffin   * returned map doesn't need to be a view, copy the returned map into a new
16893c77433663281544363151bf284b0240dfd22a42Paul Duffin   * map of your choosing.
16903c77433663281544363151bf284b0240dfd22a42Paul Duffin   *
16913c77433663281544363151bf284b0240dfd22a42Paul Duffin   * <p><b>Warning:</b> This method assumes that for any instance {@code k} of
16923c77433663281544363151bf284b0240dfd22a42Paul Duffin   * {@code EntryTransformer} key type {@code K}, {@code k.equals(k2)} implies
16933c77433663281544363151bf284b0240dfd22a42Paul Duffin   * that {@code k2} is also of type {@code K}. Using an {@code
16943c77433663281544363151bf284b0240dfd22a42Paul Duffin   * EntryTransformer} key type for which this may not hold, such as {@code
16953c77433663281544363151bf284b0240dfd22a42Paul Duffin   * ArrayList}, may risk a {@code ClassCastException} when calling methods on
16963c77433663281544363151bf284b0240dfd22a42Paul Duffin   * the transformed map.
16973c77433663281544363151bf284b0240dfd22a42Paul Duffin   *
1698dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @since 11.0
16993c77433663281544363151bf284b0240dfd22a42Paul Duffin   */
17000888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V1, V2> SortedMap<K, V2> transformEntries(
17010888a09821a98ac0680fad765217302858e70fa4Paul Duffin      SortedMap<K, V1> fromMap,
17020888a09821a98ac0680fad765217302858e70fa4Paul Duffin      EntryTransformer<? super K, ? super V1, V2> transformer) {
17030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return Platform.mapsTransformEntriesSortedMap(fromMap, transformer);
17040888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
17050888a09821a98ac0680fad765217302858e70fa4Paul Duffin
17063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  /**
17073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Returns a view of a navigable map whose values are derived from the
17083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * original navigable map's entries. In contrast to {@link
17093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * #transformValues}, this method's entry-transformation logic may
17103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * depend on the key as well as the value.
17113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
17123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>All other properties of the transformed map, such as iteration order,
17133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * are left intact. For example, the code: <pre>   {@code
17143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
17153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   NavigableMap<String, Boolean> options = Maps.newTreeMap();
17163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   options.put("verbose", false);
17173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   options.put("sort", true);
17183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   EntryTransformer<String, Boolean, String> flagPrefixer =
17193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *       new EntryTransformer<String, Boolean, String>() {
17203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *         public String transformEntry(String key, Boolean value) {
17213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *           return value ? key : ("yes" + key);
17223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *         }
17233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *       };
17243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   NavigableMap<String, String> transformed =
17253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *       LabsMaps.transformNavigableEntries(options, flagPrefixer);
17263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   System.out.println(transformed);}</pre>
17273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
17283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * ... prints {@code {sort=yessort, verbose=verbose}}.
17293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
17303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>Changes in the underlying map are reflected in this view.
17313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Conversely, this view supports removal operations, and these are reflected
17323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * in the underlying map.
17333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
17343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>It's acceptable for the underlying map to contain null keys and null
17353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * values provided that the transformer is capable of accepting null inputs.
17363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * The transformed map might contain null values if the transformer sometimes
17373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * gives a null result.
17383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
17393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>The returned map is not thread-safe or serializable, even if the
17403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * underlying map is.
17413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
17423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>The transformer is applied lazily, invoked when needed. This is
17433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * necessary for the returned map to be a view, but it means that the
17443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * transformer will be applied many times for bulk operations like {@link
17453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Map#containsValue} and {@link Object#toString}. For this to perform well,
17463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * {@code transformer} should be fast. To avoid lazy evaluation when the
17473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * returned map doesn't need to be a view, copy the returned map into a new
17483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * map of your choosing.
17493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
17503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p><b>Warning:</b> This method assumes that for any instance {@code k} of
17513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * {@code EntryTransformer} key type {@code K}, {@code k.equals(k2)} implies
17523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * that {@code k2} is also of type {@code K}. Using an {@code
17533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * EntryTransformer} key type for which this may not hold, such as {@code
17543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * ArrayList}, may risk a {@code ClassCastException} when calling methods on
17553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * the transformed map.
17563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
17573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * @since 13.0
17583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   */
17593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
17603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public static <K, V1, V2> NavigableMap<K, V2> transformEntries(
17613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      final NavigableMap<K, V1> fromMap,
17623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      EntryTransformer<? super K, ? super V1, V2> transformer) {
17633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return new TransformedEntriesNavigableMap<K, V1, V2>(fromMap, transformer);
17643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
17653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
17660888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V1, V2> SortedMap<K, V2> transformEntriesIgnoreNavigable(
17670888a09821a98ac0680fad765217302858e70fa4Paul Duffin      SortedMap<K, V1> fromMap,
17681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      EntryTransformer<? super K, ? super V1, V2> transformer) {
17691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new TransformedEntriesSortedMap<K, V1, V2>(fromMap, transformer);
17701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
17711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
17721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
17731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A transformation of the value of a key-value pair, using both key and value
17741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * as inputs. To apply the transformation to a map, use
17751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link Maps#transformEntries(Map, EntryTransformer)}.
17761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
17771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param <K> the key type of the input and output entries
17781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param  the value type of the input entry
17791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param  the value type of the output entry
17801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
17811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
17821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public interface EntryTransformer<K, V1, V2> {
17831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
17841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Determines an output value based on a key-value pair. This method is
17851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * <i>generally expected</i>, but not absolutely required, to have the
17861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * following properties:
17871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *
17881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * <ul>
17891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * <li>Its execution does not cause any observable side effects.
17901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * <li>The computation is <i>consistent with equals</i>; that is,
17911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *     {@link Objects#equal Objects.equal}{@code (k1, k2) &&}
17921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *     {@link Objects#equal}{@code (v1, v2)} implies that {@code
17931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *     Objects.equal(transformer.transform(k1, v1),
17941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *     transformer.transform(k2, v2))}.
17951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * </ul>
17961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *
17971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @throws NullPointerException if the key or value is null and this
17981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     *     transformer does not accept null arguments
17991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
18001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    V2 transformEntry(@Nullable K key, @Nullable V1 value);
18011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
18021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
18030888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
18040888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Views a function as an entry transformer that ignores the entry key.
18050888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
18060888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V1, V2> EntryTransformer<K, V1, V2>
18070888a09821a98ac0680fad765217302858e70fa4Paul Duffin      asEntryTransformer(final Function<? super V1, V2> function) {
18080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkNotNull(function);
18090888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return new EntryTransformer<K, V1, V2>() {
18100888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
18110888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public V2 transformEntry(K key, V1 value) {
18120888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return function.apply(value);
18130888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
18140888a09821a98ac0680fad765217302858e70fa4Paul Duffin    };
18150888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
18160888a09821a98ac0680fad765217302858e70fa4Paul Duffin
18170888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V1, V2> Function<V1, V2> asValueToValueFunction(
18180888a09821a98ac0680fad765217302858e70fa4Paul Duffin      final EntryTransformer<? super K, V1, V2> transformer, final K key) {
18190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkNotNull(transformer);
18200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return new Function<V1, V2>() {
18210888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
18220888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public V2 apply(@Nullable V1 v1) {
18230888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return transformer.transformEntry(key, v1);
18240888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
18250888a09821a98ac0680fad765217302858e70fa4Paul Duffin    };
18260888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
18270888a09821a98ac0680fad765217302858e70fa4Paul Duffin
18280888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
18290888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Views an entry transformer as a function from {@code Entry} to values.
18300888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
18310888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V1, V2> Function<Entry<K, V1>, V2> asEntryToValueFunction(
18320888a09821a98ac0680fad765217302858e70fa4Paul Duffin      final EntryTransformer<? super K, ? super V1, V2> transformer) {
18330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkNotNull(transformer);
18340888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return new Function<Entry<K, V1>, V2>() {
18350888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
18360888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public V2 apply(Entry<K, V1> entry) {
18370888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return transformer.transformEntry(entry.getKey(), entry.getValue());
18380888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
18390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    };
18400888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
18410888a09821a98ac0680fad765217302858e70fa4Paul Duffin
18420888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
18430888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Returns a view of an entry transformed by the specified transformer.
18440888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
18450888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <V2, K, V1> Entry<K, V2> transformEntry(
18460888a09821a98ac0680fad765217302858e70fa4Paul Duffin      final EntryTransformer<? super K, ? super V1, V2> transformer, final Entry<K, V1> entry) {
18470888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkNotNull(transformer);
18480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkNotNull(entry);
18490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return new AbstractMapEntry<K, V2>() {
18500888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
18510888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public K getKey() {
18520888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return entry.getKey();
18530888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
18540888a09821a98ac0680fad765217302858e70fa4Paul Duffin
18550888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
18560888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public V2 getValue() {
18570888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return transformer.transformEntry(entry.getKey(), entry.getValue());
18580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
18590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    };
18600888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
18610888a09821a98ac0680fad765217302858e70fa4Paul Duffin
18620888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
18630888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Views an entry transformer as a function from entries to entries.
18640888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
18650888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V1, V2> Function<Entry<K, V1>, Entry<K, V2>> asEntryToEntryFunction(
18660888a09821a98ac0680fad765217302858e70fa4Paul Duffin      final EntryTransformer<? super K, ? super V1, V2> transformer) {
18670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkNotNull(transformer);
18680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return new Function<Entry<K, V1>, Entry<K, V2>>() {
18690888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
18700888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public Entry<K, V2> apply(final Entry<K, V1> entry) {
18710888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return transformEntry(transformer, entry);
18720888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
18730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    };
18740888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
18750888a09821a98ac0680fad765217302858e70fa4Paul Duffin
18760888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static class TransformedEntriesMap<K, V1, V2>
18770888a09821a98ac0680fad765217302858e70fa4Paul Duffin      extends ImprovedAbstractMap<K, V2> {
18781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Map<K, V1> fromMap;
18791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final EntryTransformer<? super K, ? super V1, V2> transformer;
18801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
18810888a09821a98ac0680fad765217302858e70fa4Paul Duffin    TransformedEntriesMap(
18820888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Map<K, V1> fromMap,
18831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EntryTransformer<? super K, ? super V1, V2> transformer) {
18841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.fromMap = checkNotNull(fromMap);
18851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.transformer = checkNotNull(transformer);
18861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
18871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
18880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int size() {
18891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return fromMap.size();
18901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
18911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
18920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean containsKey(Object key) {
18931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return fromMap.containsKey(key);
18941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
18951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
18961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // safe as long as the user followed the <b>Warning</b> in the javadoc
18971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unchecked")
18980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public V2 get(Object key) {
18991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      V1 value = fromMap.get(key);
19000888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return (value != null || fromMap.containsKey(key))
19010888a09821a98ac0680fad765217302858e70fa4Paul Duffin          ? transformer.transformEntry((K) key, value)
19020888a09821a98ac0680fad765217302858e70fa4Paul Duffin          : null;
19031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
19041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // safe as long as the user followed the <b>Warning</b> in the javadoc
19061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unchecked")
19070888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public V2 remove(Object key) {
19080888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return fromMap.containsKey(key)
19090888a09821a98ac0680fad765217302858e70fa4Paul Duffin          ? transformer.transformEntry((K) key, fromMap.remove(key))
19101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          : null;
19111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
19121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19130888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public void clear() {
19141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fromMap.clear();
19151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
19161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19170888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Set<K> keySet() {
19181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return fromMap.keySet();
19191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
19201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19217dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
19220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    protected Set<Entry<K, V2>> createEntrySet() {
19230888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new EntrySet<K, V2>() {
19240888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @Override Map<K, V2> map() {
19250888a09821a98ac0680fad765217302858e70fa4Paul Duffin          return TransformedEntriesMap.this;
19260888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
19271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19280888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @Override public Iterator<Entry<K, V2>> iterator() {
19290888a09821a98ac0680fad765217302858e70fa4Paul Duffin          return Iterators.transform(fromMap.entrySet().iterator(),
19300888a09821a98ac0680fad765217302858e70fa4Paul Duffin              Maps.<K, V1, V2>asEntryToEntryFunction(transformer));
19310888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
19320888a09821a98ac0680fad765217302858e70fa4Paul Duffin      };
19331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
19341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
19351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19360888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static class TransformedEntriesSortedMap<K, V1, V2>
19370888a09821a98ac0680fad765217302858e70fa4Paul Duffin      extends TransformedEntriesMap<K, V1, V2> implements SortedMap<K, V2> {
19381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected SortedMap<K, V1> fromMap() {
19401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (SortedMap<K, V1>) fromMap;
19411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
19421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TransformedEntriesSortedMap(SortedMap<K, V1> fromMap,
19441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EntryTransformer<? super K, ? super V1, V2> transformer) {
19451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(fromMap, transformer);
19461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
19471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Comparator<? super K> comparator() {
19491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return fromMap().comparator();
19501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
19511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19520888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public K firstKey() {
19531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return fromMap().firstKey();
19541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
19551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public SortedMap<K, V2> headMap(K toKey) {
19571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return transformEntries(fromMap().headMap(toKey), transformer);
19581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
19591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public K lastKey() {
19611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return fromMap().lastKey();
19621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
19631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public SortedMap<K, V2> subMap(K fromKey, K toKey) {
19650888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return transformEntries(
19660888a09821a98ac0680fad765217302858e70fa4Paul Duffin          fromMap().subMap(fromKey, toKey), transformer);
19671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
19681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
19690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public SortedMap<K, V2> tailMap(K fromKey) {
19701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return transformEntries(fromMap().tailMap(fromKey), transformer);
19711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
19727dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
19737dd252788645e940eada959bdde927426e2531c9Paul Duffin
19743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
19753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private static class TransformedEntriesNavigableMap<K, V1, V2>
19763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      extends TransformedEntriesSortedMap<K, V1, V2>
19773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      implements NavigableMap<K, V2> {
19783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
19793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    TransformedEntriesNavigableMap(NavigableMap<K, V1> fromMap,
19803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        EntryTransformer<? super K, ? super V1, V2> transformer) {
19813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      super(fromMap, transformer);
19823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
19833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
19843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public Entry<K, V2> ceilingEntry(K key) {
19853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return transformEntry(fromMap().ceilingEntry(key));
19863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
19873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
19883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public K ceilingKey(K key) {
19893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return fromMap().ceilingKey(key);
19903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
19913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
19923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public NavigableSet<K> descendingKeySet() {
19933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return fromMap().descendingKeySet();
19943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
19953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
19963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public NavigableMap<K, V2> descendingMap() {
19973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return transformEntries(fromMap().descendingMap(), transformer);
19983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
19993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public Entry<K, V2> firstEntry() {
20013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return transformEntry(fromMap().firstEntry());
20023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public Entry<K, V2> floorEntry(K key) {
20043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return transformEntry(fromMap().floorEntry(key));
20053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public K floorKey(K key) {
20083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return fromMap().floorKey(key);
20093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public NavigableMap<K, V2> headMap(K toKey) {
20123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return headMap(toKey, false);
20133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public NavigableMap<K, V2> headMap(K toKey, boolean inclusive) {
20163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return transformEntries(
20173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          fromMap().headMap(toKey, inclusive), transformer);
20183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public Entry<K, V2> higherEntry(K key) {
20213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return transformEntry(fromMap().higherEntry(key));
20223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public K higherKey(K key) {
20253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return fromMap().higherKey(key);
20263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public Entry<K, V2> lastEntry() {
20293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return transformEntry(fromMap().lastEntry());
20303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public Entry<K, V2> lowerEntry(K key) {
20333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return transformEntry(fromMap().lowerEntry(key));
20343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public K lowerKey(K key) {
20373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return fromMap().lowerKey(key);
20383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public NavigableSet<K> navigableKeySet() {
20413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return fromMap().navigableKeySet();
20423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public Entry<K, V2> pollFirstEntry() {
20453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return transformEntry(fromMap().pollFirstEntry());
20463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public Entry<K, V2> pollLastEntry() {
20493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return transformEntry(fromMap().pollLastEntry());
20503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public NavigableMap<K, V2> subMap(
20533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
20543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return transformEntries(
20553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          fromMap().subMap(fromKey, fromInclusive, toKey, toInclusive),
20563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          transformer);
20573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public NavigableMap<K, V2> subMap(K fromKey, K toKey) {
20603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return subMap(fromKey, true, toKey, false);
20613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public NavigableMap<K, V2> tailMap(K fromKey) {
20643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return tailMap(fromKey, true);
20653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override public NavigableMap<K, V2> tailMap(K fromKey, boolean inclusive) {
20683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return transformEntries(
20693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          fromMap().tailMap(fromKey, inclusive), transformer);
20703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Nullable
20733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    private Entry<K, V2> transformEntry(@Nullable Entry<K, V1> entry) {
20743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return (entry == null) ? null : Maps.transformEntry(transformer, entry);
20753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override protected NavigableMap<K, V1> fromMap() {
20783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return (NavigableMap<K, V1>) super.fromMap();
20793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
20803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
20813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
20820888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K> Predicate<Entry<K, ?>> keyPredicateOnEntries(Predicate<? super K> keyPredicate) {
20830888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return compose(keyPredicate, Maps.<K>keyFunction());
20847dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
20857dd252788645e940eada959bdde927426e2531c9Paul Duffin
20860888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <V> Predicate<Entry<?, V>> valuePredicateOnEntries(Predicate<? super V> valuePredicate) {
20870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return compose(valuePredicate, Maps.<V>valueFunction());
20881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
20891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
20901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
20911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a map containing the mappings in {@code unfiltered} whose keys
20921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * satisfy a predicate. The returned map is a live view of {@code unfiltered};
20931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * changes to one affect the other.
20941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
20951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
20961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * values()} views have iterators that don't support {@code remove()}, but all
20971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * other methods are supported by the map and its views. When given a key that
20981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * doesn't satisfy the predicate, the map's {@code put()} and {@code putAll()}
20991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * methods throw an {@link IllegalArgumentException}.
21001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
21011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>When methods such as {@code removeAll()} and {@code clear()} are called
21021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * on the filtered map or its views, only mappings whose keys satisfy the
21031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * filter will be removed from the underlying map.
21041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
21051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The returned map isn't threadsafe or serializable, even if {@code
21061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * unfiltered} is.
21071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
21081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Many of the filtered map's methods, such as {@code size()},
21091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * iterate across every key/value mapping in the underlying map and determine
21101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * which satisfy the filter. When a live view is <i>not</i> needed, it may be
21111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * faster to copy the filtered map and use the copy.
21121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
21131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Warning:</b> {@code keyPredicate} must be <i>consistent with
21141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * equals</i>, as documented at {@link Predicate#apply}. Do not provide a
21151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is
21161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * inconsistent with equals.
21171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
21180888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> Map<K, V> filterKeys(
21190888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
21201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (unfiltered instanceof SortedMap) {
21211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return filterKeys((SortedMap<K, V>) unfiltered, keyPredicate);
21227dd252788645e940eada959bdde927426e2531c9Paul Duffin    } else if (unfiltered instanceof BiMap) {
21237dd252788645e940eada959bdde927426e2531c9Paul Duffin      return filterKeys((BiMap<K, V>) unfiltered, keyPredicate);
21241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
21251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(keyPredicate);
21260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Predicate<Entry<K, ?>> entryPredicate = keyPredicateOnEntries(keyPredicate);
21270888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return (unfiltered instanceof AbstractFilteredMap)
21280888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ? filterFiltered((AbstractFilteredMap<K, V>) unfiltered, entryPredicate)
21290888a09821a98ac0680fad765217302858e70fa4Paul Duffin        : new FilteredKeyMap<K, V>(
21300888a09821a98ac0680fad765217302858e70fa4Paul Duffin            checkNotNull(unfiltered), keyPredicate, entryPredicate);
21311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
21321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
21331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
21341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a sorted map containing the mappings in {@code unfiltered} whose
21351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * keys satisfy a predicate. The returned map is a live view of {@code
21361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * unfiltered}; changes to one affect the other.
21371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
21381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
21391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * values()} views have iterators that don't support {@code remove()}, but all
21401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * other methods are supported by the map and its views. When given a key that
21411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * doesn't satisfy the predicate, the map's {@code put()} and {@code putAll()}
21421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * methods throw an {@link IllegalArgumentException}.
21431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
21441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>When methods such as {@code removeAll()} and {@code clear()} are called
21451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * on the filtered map or its views, only mappings whose keys satisfy the
21461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * filter will be removed from the underlying map.
21471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
21481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The returned map isn't threadsafe or serializable, even if {@code
21491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * unfiltered} is.
21501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
21511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Many of the filtered map's methods, such as {@code size()},
21521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * iterate across every key/value mapping in the underlying map and determine
21531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * which satisfy the filter. When a live view is <i>not</i> needed, it may be
21541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * faster to copy the filtered map and use the copy.
21551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
21561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Warning:</b> {@code keyPredicate} must be <i>consistent with
21571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * equals</i>, as documented at {@link Predicate#apply}. Do not provide a
21581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is
21591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * inconsistent with equals.
21601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
21611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 11.0
21621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
21630888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> SortedMap<K, V> filterKeys(
21640888a09821a98ac0680fad765217302858e70fa4Paul Duffin      SortedMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
21657dd252788645e940eada959bdde927426e2531c9Paul Duffin    // TODO(user): Return a subclass of Maps.FilteredKeyMap for slightly better
21661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // performance.
21670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return filterEntries(unfiltered, Maps.<K>keyPredicateOnEntries(keyPredicate));
21687dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
21697dd252788645e940eada959bdde927426e2531c9Paul Duffin
21707dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
21713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Returns a navigable map containing the mappings in {@code unfiltered} whose
21723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * keys satisfy a predicate. The returned map is a live view of {@code
21733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * unfiltered}; changes to one affect the other.
21747dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
21753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
21763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * values()} views have iterators that don't support {@code remove()}, but all
21773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * other methods are supported by the map and its views. When given a key that
21783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * doesn't satisfy the predicate, the map's {@code put()} and {@code putAll()}
21793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * methods throw an {@link IllegalArgumentException}.
21803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
21813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>When methods such as {@code removeAll()} and {@code clear()} are called
21823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * on the filtered map or its views, only mappings whose keys satisfy the
21833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * filter will be removed from the underlying map.
21843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
21853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>The returned map isn't threadsafe or serializable, even if {@code
21863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * unfiltered} is.
21873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
21883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>Many of the filtered map's methods, such as {@code size()},
21893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * iterate across every key/value mapping in the underlying map and determine
21903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * which satisfy the filter. When a live view is <i>not</i> needed, it may be
21913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * faster to copy the filtered map and use the copy.
21923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
21933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p><b>Warning:</b> {@code keyPredicate} must be <i>consistent with
21943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * equals</i>, as documented at {@link Predicate#apply}. Do not provide a
21953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is
21963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * inconsistent with equals.
21973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
21983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * @since 14.0
21993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   */
22003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
22013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public static <K, V> NavigableMap<K, V> filterKeys(
22023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      NavigableMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
22033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    // TODO(user): Return a subclass of Maps.FilteredKeyMap for slightly better
22043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    // performance.
22053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return filterEntries(unfiltered, Maps.<K>keyPredicateOnEntries(keyPredicate));
22063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
22073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
22083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  /**
22093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Returns a bimap containing the mappings in {@code unfiltered} whose keys satisfy a predicate.
22103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * The returned bimap is a live view of {@code unfiltered}; changes to one affect the other.
22113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
22123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>The resulting bimap's {@code keySet()}, {@code entrySet()}, and {@code values()} views have
22133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * iterators that don't support {@code remove()}, but all other methods are supported by the
22143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * bimap and its views. When given a key that doesn't satisfy the predicate, the bimap's {@code
22153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * put()}, {@code forcePut()} and {@code putAll()} methods throw an {@link
22167dd252788645e940eada959bdde927426e2531c9Paul Duffin   * IllegalArgumentException}.
22177dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
22187dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>When methods such as {@code removeAll()} and {@code clear()} are called on the filtered
22197dd252788645e940eada959bdde927426e2531c9Paul Duffin   * bimap or its views, only mappings that satisfy the filter will be removed from the underlying
22207dd252788645e940eada959bdde927426e2531c9Paul Duffin   * bimap.
22217dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
22227dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>The returned bimap isn't threadsafe or serializable, even if {@code unfiltered} is.
22237dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
22247dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>Many of the filtered bimap's methods, such as {@code size()}, iterate across every key in
22257dd252788645e940eada959bdde927426e2531c9Paul Duffin   * the underlying bimap and determine which satisfy the filter. When a live view is <i>not</i>
22267dd252788645e940eada959bdde927426e2531c9Paul Duffin   * needed, it may be faster to copy the filtered bimap and use the copy.
22277dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
22287dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with equals </i>, as
22297dd252788645e940eada959bdde927426e2531c9Paul Duffin   * documented at {@link Predicate#apply}.
22307dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
22317dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
22327dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
22330888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> BiMap<K, V> filterKeys(
22340888a09821a98ac0680fad765217302858e70fa4Paul Duffin      BiMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
22351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(keyPredicate);
22360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return filterEntries(unfiltered, Maps.<K>keyPredicateOnEntries(keyPredicate));
22371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
22381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
22391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
22401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a map containing the mappings in {@code unfiltered} whose values
22411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * satisfy a predicate. The returned map is a live view of {@code unfiltered};
22421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * changes to one affect the other.
22431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
22441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
22451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * values()} views have iterators that don't support {@code remove()}, but all
22461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * other methods are supported by the map and its views. When given a value
22471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * that doesn't satisfy the predicate, the map's {@code put()}, {@code
22481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * putAll()}, and {@link Entry#setValue} methods throw an {@link
22491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * IllegalArgumentException}.
22501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
22511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>When methods such as {@code removeAll()} and {@code clear()} are called
22521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * on the filtered map or its views, only mappings whose values satisfy the
22531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * filter will be removed from the underlying map.
22541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
22551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The returned map isn't threadsafe or serializable, even if {@code
22561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * unfiltered} is.
22571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
22581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Many of the filtered map's methods, such as {@code size()},
22591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * iterate across every key/value mapping in the underlying map and determine
22601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * which satisfy the filter. When a live view is <i>not</i> needed, it may be
22611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * faster to copy the filtered map and use the copy.
22621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
22631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Warning:</b> {@code valuePredicate} must be <i>consistent with
22641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * equals</i>, as documented at {@link Predicate#apply}. Do not provide a
22651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is
22661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * inconsistent with equals.
22671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
22680888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> Map<K, V> filterValues(
22690888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
22701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (unfiltered instanceof SortedMap) {
22711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return filterValues((SortedMap<K, V>) unfiltered, valuePredicate);
22727dd252788645e940eada959bdde927426e2531c9Paul Duffin    } else if (unfiltered instanceof BiMap) {
22737dd252788645e940eada959bdde927426e2531c9Paul Duffin      return filterValues((BiMap<K, V>) unfiltered, valuePredicate);
22741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
22750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
22761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
22771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
22781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
22791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a sorted map containing the mappings in {@code unfiltered} whose
22801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * values satisfy a predicate. The returned map is a live view of {@code
22811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * unfiltered}; changes to one affect the other.
22821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
22831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
22841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * values()} views have iterators that don't support {@code remove()}, but all
22851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * other methods are supported by the map and its views. When given a value
22861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * that doesn't satisfy the predicate, the map's {@code put()}, {@code
22871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * putAll()}, and {@link Entry#setValue} methods throw an {@link
22881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * IllegalArgumentException}.
22891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
22901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>When methods such as {@code removeAll()} and {@code clear()} are called
22911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * on the filtered map or its views, only mappings whose values satisfy the
22921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * filter will be removed from the underlying map.
22931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
22941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The returned map isn't threadsafe or serializable, even if {@code
22951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * unfiltered} is.
22961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
22971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Many of the filtered map's methods, such as {@code size()},
22981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * iterate across every key/value mapping in the underlying map and determine
22991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * which satisfy the filter. When a live view is <i>not</i> needed, it may be
23001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * faster to copy the filtered map and use the copy.
23011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
23021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Warning:</b> {@code valuePredicate} must be <i>consistent with
23031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * equals</i>, as documented at {@link Predicate#apply}. Do not provide a
23041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is
23051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * inconsistent with equals.
23061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
23071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 11.0
23081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
23090888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> SortedMap<K, V> filterValues(
23100888a09821a98ac0680fad765217302858e70fa4Paul Duffin      SortedMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
23110888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
23127dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
23137dd252788645e940eada959bdde927426e2531c9Paul Duffin
23147dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
23153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Returns a navigable map containing the mappings in {@code unfiltered} whose
23163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * values satisfy a predicate. The returned map is a live view of {@code
23173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * unfiltered}; changes to one affect the other.
23183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
23193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
23203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * values()} views have iterators that don't support {@code remove()}, but all
23213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * other methods are supported by the map and its views. When given a value
23223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * that doesn't satisfy the predicate, the map's {@code put()}, {@code
23233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * putAll()}, and {@link Entry#setValue} methods throw an {@link
23243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * IllegalArgumentException}.
23253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
23263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>When methods such as {@code removeAll()} and {@code clear()} are called
23273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * on the filtered map or its views, only mappings whose values satisfy the
23283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * filter will be removed from the underlying map.
23293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
23303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>The returned map isn't threadsafe or serializable, even if {@code
23313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * unfiltered} is.
23323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
23333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>Many of the filtered map's methods, such as {@code size()},
23343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * iterate across every key/value mapping in the underlying map and determine
23353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * which satisfy the filter. When a live view is <i>not</i> needed, it may be
23363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * faster to copy the filtered map and use the copy.
23373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
23383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p><b>Warning:</b> {@code valuePredicate} must be <i>consistent with
23393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * equals</i>, as documented at {@link Predicate#apply}. Do not provide a
23403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is
23413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * inconsistent with equals.
23423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
23433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * @since 14.0
23443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   */
23453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
23463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public static <K, V> NavigableMap<K, V> filterValues(
23473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      NavigableMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
23483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
23493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
23503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
23513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  /**
23527dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Returns a bimap containing the mappings in {@code unfiltered} whose values satisfy a
23537dd252788645e940eada959bdde927426e2531c9Paul Duffin   * predicate. The returned bimap is a live view of {@code unfiltered}; changes to one affect the
23547dd252788645e940eada959bdde927426e2531c9Paul Duffin   * other.
23557dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
23567dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>The resulting bimap's {@code keySet()}, {@code entrySet()}, and {@code values()} views have
23577dd252788645e940eada959bdde927426e2531c9Paul Duffin   * iterators that don't support {@code remove()}, but all other methods are supported by the
23587dd252788645e940eada959bdde927426e2531c9Paul Duffin   * bimap and its views. When given a value that doesn't satisfy the predicate, the bimap's
23597dd252788645e940eada959bdde927426e2531c9Paul Duffin   * {@code put()}, {@code forcePut()} and {@code putAll()} methods throw an {@link
23607dd252788645e940eada959bdde927426e2531c9Paul Duffin   * IllegalArgumentException}. Similarly, the map's entries have a {@link Entry#setValue} method
23617dd252788645e940eada959bdde927426e2531c9Paul Duffin   * that throws an {@link IllegalArgumentException} when the provided value doesn't satisfy the
23627dd252788645e940eada959bdde927426e2531c9Paul Duffin   * predicate.
23637dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
23647dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>When methods such as {@code removeAll()} and {@code clear()} are called on the filtered
23657dd252788645e940eada959bdde927426e2531c9Paul Duffin   * bimap or its views, only mappings that satisfy the filter will be removed from the underlying
23667dd252788645e940eada959bdde927426e2531c9Paul Duffin   * bimap.
23677dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
23687dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>The returned bimap isn't threadsafe or serializable, even if {@code unfiltered} is.
23697dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
23707dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>Many of the filtered bimap's methods, such as {@code size()}, iterate across every value in
23717dd252788645e940eada959bdde927426e2531c9Paul Duffin   * the underlying bimap and determine which satisfy the filter. When a live view is <i>not</i>
23727dd252788645e940eada959bdde927426e2531c9Paul Duffin   * needed, it may be faster to copy the filtered bimap and use the copy.
23737dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
23747dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with equals </i>, as
23757dd252788645e940eada959bdde927426e2531c9Paul Duffin   * documented at {@link Predicate#apply}.
23767dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
23777dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
23787dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
23790888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> BiMap<K, V> filterValues(
23800888a09821a98ac0680fad765217302858e70fa4Paul Duffin      BiMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
23810888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
23821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
23831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
23841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
23851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a map containing the mappings in {@code unfiltered} that satisfy a
23861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * predicate. The returned map is a live view of {@code unfiltered}; changes
23871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * to one affect the other.
23881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
23891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
23901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * values()} views have iterators that don't support {@code remove()}, but all
23911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * other methods are supported by the map and its views. When given a
23921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * key/value pair that doesn't satisfy the predicate, the map's {@code put()}
23931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * and {@code putAll()} methods throw an {@link IllegalArgumentException}.
23941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Similarly, the map's entries have a {@link Entry#setValue} method that
23951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * throws an {@link IllegalArgumentException} when the existing key and the
23961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * provided value don't satisfy the predicate.
23971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
23981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>When methods such as {@code removeAll()} and {@code clear()} are called
23991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * on the filtered map or its views, only mappings that satisfy the filter
24001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * will be removed from the underlying map.
24011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
24021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The returned map isn't threadsafe or serializable, even if {@code
24031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * unfiltered} is.
24041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
24051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Many of the filtered map's methods, such as {@code size()},
24061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * iterate across every key/value mapping in the underlying map and determine
24071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * which satisfy the filter. When a live view is <i>not</i> needed, it may be
24081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * faster to copy the filtered map and use the copy.
24091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
24101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with
24111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * equals</i>, as documented at {@link Predicate#apply}.
24121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
24130888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> Map<K, V> filterEntries(
24140888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
24151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (unfiltered instanceof SortedMap) {
2416dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin      return filterEntries((SortedMap<K, V>) unfiltered, entryPredicate);
24177dd252788645e940eada959bdde927426e2531c9Paul Duffin    } else if (unfiltered instanceof BiMap) {
24187dd252788645e940eada959bdde927426e2531c9Paul Duffin      return filterEntries((BiMap<K, V>) unfiltered, entryPredicate);
2419dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin    }
24203c77433663281544363151bf284b0240dfd22a42Paul Duffin    checkNotNull(entryPredicate);
24210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return (unfiltered instanceof AbstractFilteredMap)
24220888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ? filterFiltered((AbstractFilteredMap<K, V>) unfiltered, entryPredicate)
24230888a09821a98ac0680fad765217302858e70fa4Paul Duffin        : new FilteredEntryMap<K, V>(checkNotNull(unfiltered), entryPredicate);
24241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
24251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
24261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
24271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a sorted map containing the mappings in {@code unfiltered} that
24281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * satisfy a predicate. The returned map is a live view of {@code unfiltered};
24291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * changes to one affect the other.
24301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
24311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
24321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * values()} views have iterators that don't support {@code remove()}, but all
24331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * other methods are supported by the map and its views. When given a
24341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * key/value pair that doesn't satisfy the predicate, the map's {@code put()}
24351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * and {@code putAll()} methods throw an {@link IllegalArgumentException}.
24361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Similarly, the map's entries have a {@link Entry#setValue} method that
24371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * throws an {@link IllegalArgumentException} when the existing key and the
24381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * provided value don't satisfy the predicate.
24391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
24401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>When methods such as {@code removeAll()} and {@code clear()} are called
24411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * on the filtered map or its views, only mappings that satisfy the filter
24421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * will be removed from the underlying map.
24431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
24441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>The returned map isn't threadsafe or serializable, even if {@code
24451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * unfiltered} is.
24461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
24471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Many of the filtered map's methods, such as {@code size()},
24481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * iterate across every key/value mapping in the underlying map and determine
24491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * which satisfy the filter. When a live view is <i>not</i> needed, it may be
24501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * faster to copy the filtered map and use the copy.
24511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
24521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with
24531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * equals</i>, as documented at {@link Predicate#apply}.
24541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2455dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin   * @since 11.0
24561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
24570888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> SortedMap<K, V> filterEntries(
24580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      SortedMap<K, V> unfiltered,
24590888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Predicate<? super Entry<K, V>> entryPredicate) {
24600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return Platform.mapsFilterSortedMap(unfiltered, entryPredicate);
24610888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
24620888a09821a98ac0680fad765217302858e70fa4Paul Duffin
24630888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V> SortedMap<K, V> filterSortedIgnoreNavigable(
24640888a09821a98ac0680fad765217302858e70fa4Paul Duffin      SortedMap<K, V> unfiltered,
24651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Predicate<? super Entry<K, V>> entryPredicate) {
24661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(entryPredicate);
24670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return (unfiltered instanceof FilteredEntrySortedMap)
24680888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ? filterFiltered((FilteredEntrySortedMap<K, V>) unfiltered, entryPredicate)
2469dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin        : new FilteredEntrySortedMap<K, V>(checkNotNull(unfiltered), entryPredicate);
24701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
24711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
24721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
24733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Returns a sorted map containing the mappings in {@code unfiltered} that
24743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * satisfy a predicate. The returned map is a live view of {@code unfiltered};
24753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * changes to one affect the other.
24763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
24773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
24783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * values()} views have iterators that don't support {@code remove()}, but all
24793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * other methods are supported by the map and its views. When given a
24803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * key/value pair that doesn't satisfy the predicate, the map's {@code put()}
24813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * and {@code putAll()} methods throw an {@link IllegalArgumentException}.
24823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Similarly, the map's entries have a {@link Entry#setValue} method that
24833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * throws an {@link IllegalArgumentException} when the existing key and the
24843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * provided value don't satisfy the predicate.
24853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
24863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>When methods such as {@code removeAll()} and {@code clear()} are called
24873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * on the filtered map or its views, only mappings that satisfy the filter
24883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * will be removed from the underlying map.
24893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
24903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>The returned map isn't threadsafe or serializable, even if {@code
24913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * unfiltered} is.
24923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
24933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>Many of the filtered map's methods, such as {@code size()},
24943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * iterate across every key/value mapping in the underlying map and determine
24953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * which satisfy the filter. When a live view is <i>not</i> needed, it may be
24963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * faster to copy the filtered map and use the copy.
24973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
24983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with
24993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * equals</i>, as documented at {@link Predicate#apply}.
25003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
25013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * @since 14.0
25023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   */
25033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
25043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public static <K, V> NavigableMap<K, V> filterEntries(
25053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      NavigableMap<K, V> unfiltered,
25063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      Predicate<? super Entry<K, V>> entryPredicate) {
25073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    checkNotNull(entryPredicate);
25083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return (unfiltered instanceof FilteredEntryNavigableMap)
25093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        ? filterFiltered((FilteredEntryNavigableMap<K, V>) unfiltered, entryPredicate)
25103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        : new FilteredEntryNavigableMap<K, V>(checkNotNull(unfiltered), entryPredicate);
25113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
25123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
25133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  /**
25147dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Returns a bimap containing the mappings in {@code unfiltered} that satisfy a predicate. The
25157dd252788645e940eada959bdde927426e2531c9Paul Duffin   * returned bimap is a live view of {@code unfiltered}; changes to one affect the other.
25167dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
25177dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>The resulting bimap's {@code keySet()}, {@code entrySet()}, and {@code values()} views have
25187dd252788645e940eada959bdde927426e2531c9Paul Duffin   * iterators that don't support {@code remove()}, but all other methods are supported by the bimap
25197dd252788645e940eada959bdde927426e2531c9Paul Duffin   * and its views. When given a key/value pair that doesn't satisfy the predicate, the bimap's
25207dd252788645e940eada959bdde927426e2531c9Paul Duffin   * {@code put()}, {@code forcePut()} and {@code putAll()} methods throw an
25217dd252788645e940eada959bdde927426e2531c9Paul Duffin   * {@link IllegalArgumentException}. Similarly, the map's entries have an {@link Entry#setValue}
25227dd252788645e940eada959bdde927426e2531c9Paul Duffin   * method that throws an {@link IllegalArgumentException} when the existing key and the provided
25237dd252788645e940eada959bdde927426e2531c9Paul Duffin   * value don't satisfy the predicate.
25247dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
25257dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>When methods such as {@code removeAll()} and {@code clear()} are called on the filtered
25267dd252788645e940eada959bdde927426e2531c9Paul Duffin   * bimap or its views, only mappings that satisfy the filter will be removed from the underlying
25277dd252788645e940eada959bdde927426e2531c9Paul Duffin   * bimap.
25287dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
25297dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>The returned bimap isn't threadsafe or serializable, even if {@code unfiltered} is.
25307dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
25317dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>Many of the filtered bimap's methods, such as {@code size()}, iterate across every
25327dd252788645e940eada959bdde927426e2531c9Paul Duffin   * key/value mapping in the underlying bimap and determine which satisfy the filter. When a live
25337dd252788645e940eada959bdde927426e2531c9Paul Duffin   * view is <i>not</i> needed, it may be faster to copy the filtered bimap and use the copy.
25347dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
25357dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with equals </i>, as
25367dd252788645e940eada959bdde927426e2531c9Paul Duffin   * documented at {@link Predicate#apply}.
25377dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
25387dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
25397dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
25400888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <K, V> BiMap<K, V> filterEntries(
25410888a09821a98ac0680fad765217302858e70fa4Paul Duffin      BiMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
25427dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(unfiltered);
25437dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(entryPredicate);
25440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return (unfiltered instanceof FilteredEntryBiMap)
25450888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ? filterFiltered((FilteredEntryBiMap<K, V>) unfiltered, entryPredicate)
25460888a09821a98ac0680fad765217302858e70fa4Paul Duffin        : new FilteredEntryBiMap<K, V>(unfiltered, entryPredicate);
25477dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
25487dd252788645e940eada959bdde927426e2531c9Paul Duffin
25497dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
25501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when
25511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * filtering a filtered map.
25521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
25531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static <K, V> Map<K, V> filterFiltered(AbstractFilteredMap<K, V> map,
25541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Predicate<? super Entry<K, V>> entryPredicate) {
25550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return new FilteredEntryMap<K, V>(map.unfiltered,
25560888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Predicates.<Entry<K, V>>and(map.predicate, entryPredicate));
25571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
25581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
25590888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private abstract static class AbstractFilteredMap<K, V>
25600888a09821a98ac0680fad765217302858e70fa4Paul Duffin      extends ImprovedAbstractMap<K, V> {
25611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Map<K, V> unfiltered;
25621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Predicate<? super Entry<K, V>> predicate;
25631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
25640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    AbstractFilteredMap(
25650888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Map<K, V> unfiltered, Predicate<? super Entry<K, V>> predicate) {
25661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.unfiltered = unfiltered;
25671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.predicate = predicate;
25681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
25691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
25700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    boolean apply(@Nullable Object key, @Nullable V value) {
25711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // This method is called only when the key is in the map, implying that
25721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // key is a K.
25731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @SuppressWarnings("unchecked")
25741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      K k = (K) key;
25751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return predicate.apply(Maps.immutableEntry(k, value));
25761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
25771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
25780888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public V put(K key, V value) {
25791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      checkArgument(apply(key, value));
25801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return unfiltered.put(key, value);
25811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
25821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
25830888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public void putAll(Map<? extends K, ? extends V> map) {
25841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (Entry<? extends K, ? extends V> entry : map.entrySet()) {
25851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        checkArgument(apply(entry.getKey(), entry.getValue()));
25861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
25871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      unfiltered.putAll(map);
25881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
25891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
25900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean containsKey(Object key) {
25911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return unfiltered.containsKey(key) && apply(key, unfiltered.get(key));
25921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
25931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
25940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public V get(Object key) {
25951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      V value = unfiltered.get(key);
25961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ((value != null) && apply(key, value)) ? value : null;
25971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
25981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
25990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean isEmpty() {
26001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return entrySet().isEmpty();
26011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
26021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
26030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public V remove(Object key) {
26041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return containsKey(key) ? unfiltered.remove(key) : null;
26051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
26061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
26070888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
26080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Collection<V> createValues() {
26090888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new FilteredMapValues<K, V>(this, unfiltered, predicate);
26100888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
26110888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
26120888a09821a98ac0680fad765217302858e70fa4Paul Duffin
26130888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static final class FilteredMapValues<K, V> extends Maps.Values<K, V> {
26140888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Map<K, V> unfiltered;
26150888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Predicate<? super Entry<K, V>> predicate;
26160888a09821a98ac0680fad765217302858e70fa4Paul Duffin
26170888a09821a98ac0680fad765217302858e70fa4Paul Duffin    FilteredMapValues(Map<K, V> filteredMap, Map<K, V> unfiltered,
26180888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Predicate<? super Entry<K, V>> predicate) {
26190888a09821a98ac0680fad765217302858e70fa4Paul Duffin      super(filteredMap);
26200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.unfiltered = unfiltered;
26210888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.predicate = predicate;
26220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
26230888a09821a98ac0680fad765217302858e70fa4Paul Duffin
26240888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean remove(Object o) {
26250888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return Iterables.removeFirstMatching(unfiltered.entrySet(),
26260888a09821a98ac0680fad765217302858e70fa4Paul Duffin          Predicates.<Entry<K, V>>and(predicate, Maps.<V>valuePredicateOnEntries(equalTo(o))))
26270888a09821a98ac0680fad765217302858e70fa4Paul Duffin          != null;
26280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
26290888a09821a98ac0680fad765217302858e70fa4Paul Duffin
26300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private boolean removeIf(Predicate<? super V> valuePredicate) {
26310888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return Iterables.removeIf(unfiltered.entrySet(), Predicates.<Entry<K, V>>and(
26320888a09821a98ac0680fad765217302858e70fa4Paul Duffin          predicate, Maps.<V>valuePredicateOnEntries(valuePredicate)));
26330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
26340888a09821a98ac0680fad765217302858e70fa4Paul Duffin
26350888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean removeAll(Collection<?> collection) {
26360888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return removeIf(in(collection));
26370888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
26380888a09821a98ac0680fad765217302858e70fa4Paul Duffin
26390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean retainAll(Collection<?> collection) {
26400888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return removeIf(not(in(collection)));
26410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
26420888a09821a98ac0680fad765217302858e70fa4Paul Duffin
26430888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Object[] toArray() {
26440888a09821a98ac0680fad765217302858e70fa4Paul Duffin      // creating an ArrayList so filtering happens once
26450888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return Lists.newArrayList(iterator()).toArray();
26460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
26470888a09821a98ac0680fad765217302858e70fa4Paul Duffin
26480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public <T> T[] toArray(T[] array) {
26490888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return Lists.newArrayList(iterator()).toArray(array);
26500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
26510888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
26520888a09821a98ac0680fad765217302858e70fa4Paul Duffin
26530888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static class FilteredKeyMap<K, V> extends AbstractFilteredMap<K, V> {
26540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Predicate<? super K> keyPredicate;
26550888a09821a98ac0680fad765217302858e70fa4Paul Duffin
26560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    FilteredKeyMap(Map<K, V> unfiltered, Predicate<? super K> keyPredicate,
26570888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Predicate<? super Entry<K, V>> entryPredicate) {
26580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      super(unfiltered, entryPredicate);
26590888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.keyPredicate = keyPredicate;
26600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
26611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
26627dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
26630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    protected Set<Entry<K, V>> createEntrySet() {
26640888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return Sets.filter(unfiltered.entrySet(), predicate);
26651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
26661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
26670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
26680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Set<K> createKeySet() {
26690888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return Sets.filter(unfiltered.keySet(), keyPredicate);
26700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
26717dd252788645e940eada959bdde927426e2531c9Paul Duffin
26720888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // The cast is called only when the key is in the unfiltered map, implying
26730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // that key is a K.
26740888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
26750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @SuppressWarnings("unchecked")
26760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public boolean containsKey(Object key) {
26770888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return unfiltered.containsKey(key) && keyPredicate.apply((K) key);
26780888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
26790888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
26801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
26810888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static class FilteredEntryMap<K, V> extends AbstractFilteredMap<K, V> {
26820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    /**
26830888a09821a98ac0680fad765217302858e70fa4Paul Duffin     * Entries in this set satisfy the predicate, but they don't validate the
26840888a09821a98ac0680fad765217302858e70fa4Paul Duffin     * input to {@code Entry.setValue()}.
26850888a09821a98ac0680fad765217302858e70fa4Paul Duffin     */
26860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    final Set<Entry<K, V>> filteredEntrySet;
26871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
26880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    FilteredEntryMap(
26890888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Map<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
26900888a09821a98ac0680fad765217302858e70fa4Paul Duffin      super(unfiltered, entryPredicate);
26910888a09821a98ac0680fad765217302858e70fa4Paul Duffin      filteredEntrySet = Sets.filter(unfiltered.entrySet(), predicate);
26920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
26930888a09821a98ac0680fad765217302858e70fa4Paul Duffin
26940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
26950888a09821a98ac0680fad765217302858e70fa4Paul Duffin    protected Set<Entry<K, V>> createEntrySet() {
26960888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new EntrySet();
26970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
26980888a09821a98ac0680fad765217302858e70fa4Paul Duffin
26990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private class EntrySet extends ForwardingSet<Entry<K, V>> {
27000888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override protected Set<Entry<K, V>> delegate() {
27010888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return filteredEntrySet;
27021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
27031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
27040888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override public Iterator<Entry<K, V>> iterator() {
27050888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return new TransformedIterator<Entry<K, V>, Entry<K, V>>(filteredEntrySet.iterator()) {
27060888a09821a98ac0680fad765217302858e70fa4Paul Duffin          @Override
27070888a09821a98ac0680fad765217302858e70fa4Paul Duffin          Entry<K, V> transform(final Entry<K, V> entry) {
27080888a09821a98ac0680fad765217302858e70fa4Paul Duffin            return new ForwardingMapEntry<K, V>() {
27090888a09821a98ac0680fad765217302858e70fa4Paul Duffin              @Override
27100888a09821a98ac0680fad765217302858e70fa4Paul Duffin              protected Entry<K, V> delegate() {
27110888a09821a98ac0680fad765217302858e70fa4Paul Duffin                return entry;
27120888a09821a98ac0680fad765217302858e70fa4Paul Duffin              }
27130888a09821a98ac0680fad765217302858e70fa4Paul Duffin
27140888a09821a98ac0680fad765217302858e70fa4Paul Duffin              @Override
27150888a09821a98ac0680fad765217302858e70fa4Paul Duffin              public V setValue(V newValue) {
27160888a09821a98ac0680fad765217302858e70fa4Paul Duffin                checkArgument(apply(getKey(), newValue));
27170888a09821a98ac0680fad765217302858e70fa4Paul Duffin                return super.setValue(newValue);
27180888a09821a98ac0680fad765217302858e70fa4Paul Duffin              }
27190888a09821a98ac0680fad765217302858e70fa4Paul Duffin            };
27200888a09821a98ac0680fad765217302858e70fa4Paul Duffin          }
27210888a09821a98ac0680fad765217302858e70fa4Paul Duffin        };
27221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
27230888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
27241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
27250888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
27260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Set<K> createKeySet() {
27270888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new KeySet();
27280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
27290888a09821a98ac0680fad765217302858e70fa4Paul Duffin
27300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    class KeySet extends Maps.KeySet<K, V> {
27310888a09821a98ac0680fad765217302858e70fa4Paul Duffin      KeySet() {
27320888a09821a98ac0680fad765217302858e70fa4Paul Duffin        super(FilteredEntryMap.this);
27331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
27341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
27350888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override public boolean remove(Object o) {
27360888a09821a98ac0680fad765217302858e70fa4Paul Duffin        if (containsKey(o)) {
27370888a09821a98ac0680fad765217302858e70fa4Paul Duffin          unfiltered.remove(o);
27380888a09821a98ac0680fad765217302858e70fa4Paul Duffin          return true;
27391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
27401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return false;
27411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
27421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
27430888a09821a98ac0680fad765217302858e70fa4Paul Duffin      private boolean removeIf(Predicate<? super K> keyPredicate) {
27440888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return Iterables.removeIf(unfiltered.entrySet(), Predicates.<Entry<K, V>>and(
27450888a09821a98ac0680fad765217302858e70fa4Paul Duffin            predicate, Maps.<K>keyPredicateOnEntries(keyPredicate)));
27461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
27471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
27487dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
27490888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public boolean removeAll(Collection<?> c) {
27500888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return removeIf(in(c));
27511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
27521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
27537dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
27540888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public boolean retainAll(Collection<?> c) {
27550888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return removeIf(not(in(c)));
27560888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
27570888a09821a98ac0680fad765217302858e70fa4Paul Duffin
27580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override public Object[] toArray() {
27591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // creating an ArrayList so filtering happens once
27601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Lists.newArrayList(iterator()).toArray();
27611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
27621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
27630888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override public <T> T[] toArray(T[] array) {
27641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Lists.newArrayList(iterator()).toArray(array);
27651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
27661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
27671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
27687dd252788645e940eada959bdde927426e2531c9Paul Duffin
27691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
27701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when
27711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * filtering a filtered sorted map.
27721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
27730888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static <K, V> SortedMap<K, V> filterFiltered(
27740888a09821a98ac0680fad765217302858e70fa4Paul Duffin      FilteredEntrySortedMap<K, V> map,
27751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Predicate<? super Entry<K, V>> entryPredicate) {
27760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Predicate<Entry<K, V>> predicate
27770888a09821a98ac0680fad765217302858e70fa4Paul Duffin        = Predicates.and(map.predicate, entryPredicate);
27781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new FilteredEntrySortedMap<K, V>(map.sortedMap(), predicate);
27791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
27801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
27810888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static class FilteredEntrySortedMap<K, V>
27820888a09821a98ac0680fad765217302858e70fa4Paul Duffin      extends FilteredEntryMap<K, V> implements SortedMap<K, V> {
27831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
27840888a09821a98ac0680fad765217302858e70fa4Paul Duffin    FilteredEntrySortedMap(SortedMap<K, V> unfiltered,
27850888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Predicate<? super Entry<K, V>> entryPredicate) {
27861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(unfiltered, entryPredicate);
27871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
27881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
27891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedMap<K, V> sortedMap() {
27901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (SortedMap<K, V>) unfiltered;
27911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
27921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
27930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public SortedSet<K> keySet() {
27940888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return (SortedSet<K>) super.keySet();
27950888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
27960888a09821a98ac0680fad765217302858e70fa4Paul Duffin
27970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
27980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SortedSet<K> createKeySet() {
27990888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new SortedKeySet();
28000888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
28010888a09821a98ac0680fad765217302858e70fa4Paul Duffin
28020888a09821a98ac0680fad765217302858e70fa4Paul Duffin    class SortedKeySet extends KeySet implements SortedSet<K> {
28030888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
28040888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public Comparator<? super K> comparator() {
28050888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return sortedMap().comparator();
28060888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
28070888a09821a98ac0680fad765217302858e70fa4Paul Duffin
28080888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
28090888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public SortedSet<K> subSet(K fromElement, K toElement) {
28100888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return (SortedSet<K>) subMap(fromElement, toElement).keySet();
28110888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
28120888a09821a98ac0680fad765217302858e70fa4Paul Duffin
28130888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
28140888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public SortedSet<K> headSet(K toElement) {
28150888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return (SortedSet<K>) headMap(toElement).keySet();
28160888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
28170888a09821a98ac0680fad765217302858e70fa4Paul Duffin
28180888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
28190888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public SortedSet<K> tailSet(K fromElement) {
28200888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return (SortedSet<K>) tailMap(fromElement).keySet();
28210888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
28220888a09821a98ac0680fad765217302858e70fa4Paul Duffin
28230888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
28240888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public K first() {
28250888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return firstKey();
28260888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
28270888a09821a98ac0680fad765217302858e70fa4Paul Duffin
28280888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
28290888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public K last() {
28300888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return lastKey();
28310888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
28320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
28330888a09821a98ac0680fad765217302858e70fa4Paul Duffin
28340888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Comparator<? super K> comparator() {
28351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return sortedMap().comparator();
28361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
28371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
28380888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public K firstKey() {
28391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // correctly throws NoSuchElementException when filtered map is empty.
28401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return keySet().iterator().next();
28411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
28421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
28430888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public K lastKey() {
28441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      SortedMap<K, V> headMap = sortedMap();
28451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      while (true) {
28461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // correctly throws NoSuchElementException when filtered map is empty.
28471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        K key = headMap.lastKey();
28481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        if (apply(key, unfiltered.get(key))) {
28491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return key;
28501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
28511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        headMap = sortedMap().headMap(key);
28521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
28531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
28541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
28550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public SortedMap<K, V> headMap(K toKey) {
28561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return new FilteredEntrySortedMap<K, V>(sortedMap().headMap(toKey), predicate);
28571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
28581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
28590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public SortedMap<K, V> subMap(K fromKey, K toKey) {
28600888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new FilteredEntrySortedMap<K, V>(
28610888a09821a98ac0680fad765217302858e70fa4Paul Duffin          sortedMap().subMap(fromKey, toKey), predicate);
28627dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
28637dd252788645e940eada959bdde927426e2531c9Paul Duffin
28640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public SortedMap<K, V> tailMap(K fromKey) {
28650888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new FilteredEntrySortedMap<K, V>(
28660888a09821a98ac0680fad765217302858e70fa4Paul Duffin          sortedMap().tailMap(fromKey), predicate);
28677dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
28687dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
28690888a09821a98ac0680fad765217302858e70fa4Paul Duffin
28707dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
28717dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when
28723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * filtering a filtered navigable map.
28733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   */
28743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
28753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private static <K, V> NavigableMap<K, V> filterFiltered(
28763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      FilteredEntryNavigableMap<K, V> map,
28773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      Predicate<? super Entry<K, V>> entryPredicate) {
28783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    Predicate<Entry<K, V>> predicate
28793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        = Predicates.and(map.entryPredicate, entryPredicate);
28803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return new FilteredEntryNavigableMap<K, V>(map.unfiltered, predicate);
28813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
28823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
28833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
28843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  private static class FilteredEntryNavigableMap<K, V> extends AbstractNavigableMap<K, V> {
28853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    /*
28863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin     * It's less code to extend AbstractNavigableMap and forward the filtering logic to
28873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin     * FilteredEntryMap than to extend FilteredEntrySortedMap and reimplement all the NavigableMap
28883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin     * methods.
28893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin     */
28903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
28913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    private final NavigableMap<K, V> unfiltered;
28923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    private final Predicate<? super Entry<K, V>> entryPredicate;
28933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    private final Map<K, V> filteredDelegate;
28943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
28953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    FilteredEntryNavigableMap(
28963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        NavigableMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
28973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      this.unfiltered = checkNotNull(unfiltered);
28983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      this.entryPredicate = entryPredicate;
28993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      this.filteredDelegate = new FilteredEntryMap<K, V>(unfiltered, entryPredicate);
29003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Comparator<? super K> comparator() {
29043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return unfiltered.comparator();
29053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableSet<K> navigableKeySet() {
29093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return new Maps.NavigableKeySet<K, V>(this) {
29103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        @Override
29113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        public boolean removeAll(Collection<?> c) {
29123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          return Iterators.removeIf(unfiltered.entrySet().iterator(),
29133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin              Predicates.<Entry<K, V>>and(entryPredicate, Maps.<K>keyPredicateOnEntries(in(c))));
29143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        }
29153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        @Override
29173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        public boolean retainAll(Collection<?> c) {
29183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          return Iterators.removeIf(unfiltered.entrySet().iterator(), Predicates.<Entry<K, V>>and(
29193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin              entryPredicate, Maps.<K>keyPredicateOnEntries(not(in(c)))));
29203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        }
29213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      };
29223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Collection<V> values() {
29263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return new FilteredMapValues<K, V>(this, unfiltered, entryPredicate);
29273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    Iterator<Entry<K, V>> entryIterator() {
29313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return Iterators.filter(unfiltered.entrySet().iterator(), entryPredicate);
29323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    Iterator<Entry<K, V>> descendingEntryIterator() {
29363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return Iterators.filter(unfiltered.descendingMap().entrySet().iterator(), entryPredicate);
29373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public int size() {
29413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return filteredDelegate.size();
29423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public boolean isEmpty() {
29463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return !Iterables.any(unfiltered.entrySet(), entryPredicate);
29473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Nullable
29513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public V get(@Nullable Object key) {
29523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return filteredDelegate.get(key);
29533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public boolean containsKey(@Nullable Object key) {
29573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return filteredDelegate.containsKey(key);
29583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public V put(K key, V value) {
29623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return filteredDelegate.put(key, value);
29633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public V remove(@Nullable Object key) {
29673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return filteredDelegate.remove(key);
29683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public void putAll(Map<? extends K, ? extends V> m) {
29723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      filteredDelegate.putAll(m);
29733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public void clear() {
29773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      filteredDelegate.clear();
29783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Set<Entry<K, V>> entrySet() {
29823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return filteredDelegate.entrySet();
29833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> pollFirstEntry() {
29873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return Iterables.removeFirstMatching(unfiltered.entrySet(), entryPredicate);
29883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> pollLastEntry() {
29923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return Iterables.removeFirstMatching(unfiltered.descendingMap().entrySet(), entryPredicate);
29933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
29953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
29963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> descendingMap() {
29973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return filterEntries(unfiltered.descendingMap(), entryPredicate);
29983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
29993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
30003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
30013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> subMap(
30023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
30033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return filterEntries(
30043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          unfiltered.subMap(fromKey, fromInclusive, toKey, toInclusive), entryPredicate);
30053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
30063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
30073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
30083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
30093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return filterEntries(unfiltered.headMap(toKey, inclusive), entryPredicate);
30103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
30113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
30123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
30133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
30143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return filterEntries(unfiltered.tailMap(fromKey, inclusive), entryPredicate);
30153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
30163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
30173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
30183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  /**
30193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when
30207dd252788645e940eada959bdde927426e2531c9Paul Duffin   * filtering a filtered map.
30217dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
30220888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static <K, V> BiMap<K, V> filterFiltered(
30230888a09821a98ac0680fad765217302858e70fa4Paul Duffin      FilteredEntryBiMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
30247dd252788645e940eada959bdde927426e2531c9Paul Duffin    Predicate<Entry<K, V>> predicate = Predicates.and(map.predicate, entryPredicate);
30257dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new FilteredEntryBiMap<K, V>(map.unfiltered(), predicate);
30267dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
30277dd252788645e940eada959bdde927426e2531c9Paul Duffin
30280888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static final class FilteredEntryBiMap<K, V> extends FilteredEntryMap<K, V>
30290888a09821a98ac0680fad765217302858e70fa4Paul Duffin      implements BiMap<K, V> {
30307dd252788645e940eada959bdde927426e2531c9Paul Duffin    private final BiMap<V, K> inverse;
30317dd252788645e940eada959bdde927426e2531c9Paul Duffin
30327dd252788645e940eada959bdde927426e2531c9Paul Duffin    private static <K, V> Predicate<Entry<V, K>> inversePredicate(
30337dd252788645e940eada959bdde927426e2531c9Paul Duffin        final Predicate<? super Entry<K, V>> forwardPredicate) {
30347dd252788645e940eada959bdde927426e2531c9Paul Duffin      return new Predicate<Entry<V, K>>() {
30350888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @Override
30367dd252788645e940eada959bdde927426e2531c9Paul Duffin        public boolean apply(Entry<V, K> input) {
30370888a09821a98ac0680fad765217302858e70fa4Paul Duffin          return forwardPredicate.apply(
30380888a09821a98ac0680fad765217302858e70fa4Paul Duffin              Maps.immutableEntry(input.getValue(), input.getKey()));
30397dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
30407dd252788645e940eada959bdde927426e2531c9Paul Duffin      };
30417dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
30427dd252788645e940eada959bdde927426e2531c9Paul Duffin
30430888a09821a98ac0680fad765217302858e70fa4Paul Duffin    FilteredEntryBiMap(BiMap<K, V> delegate,
30440888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Predicate<? super Entry<K, V>> predicate) {
30457dd252788645e940eada959bdde927426e2531c9Paul Duffin      super(delegate, predicate);
30460888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.inverse = new FilteredEntryBiMap<V, K>(
30470888a09821a98ac0680fad765217302858e70fa4Paul Duffin          delegate.inverse(), inversePredicate(predicate), this);
30487dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
30497dd252788645e940eada959bdde927426e2531c9Paul Duffin
30500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private FilteredEntryBiMap(
30510888a09821a98ac0680fad765217302858e70fa4Paul Duffin        BiMap<K, V> delegate, Predicate<? super Entry<K, V>> predicate,
30527dd252788645e940eada959bdde927426e2531c9Paul Duffin        BiMap<V, K> inverse) {
30537dd252788645e940eada959bdde927426e2531c9Paul Duffin      super(delegate, predicate);
30547dd252788645e940eada959bdde927426e2531c9Paul Duffin      this.inverse = inverse;
30557dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
30567dd252788645e940eada959bdde927426e2531c9Paul Duffin
30577dd252788645e940eada959bdde927426e2531c9Paul Duffin    BiMap<K, V> unfiltered() {
30587dd252788645e940eada959bdde927426e2531c9Paul Duffin      return (BiMap<K, V>) unfiltered;
30591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
30601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
30610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
30627dd252788645e940eada959bdde927426e2531c9Paul Duffin    public V forcePut(@Nullable K key, @Nullable V value) {
30630888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkArgument(apply(key, value));
30647dd252788645e940eada959bdde927426e2531c9Paul Duffin      return unfiltered().forcePut(key, value);
30657dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
30667dd252788645e940eada959bdde927426e2531c9Paul Duffin
30670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
30687dd252788645e940eada959bdde927426e2531c9Paul Duffin    public BiMap<V, K> inverse() {
30697dd252788645e940eada959bdde927426e2531c9Paul Duffin      return inverse;
30707dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
30717dd252788645e940eada959bdde927426e2531c9Paul Duffin
30727dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
30737dd252788645e940eada959bdde927426e2531c9Paul Duffin    public Set<V> values() {
30747dd252788645e940eada959bdde927426e2531c9Paul Duffin      return inverse.keySet();
30751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
30761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
30771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
30783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  /**
30793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Returns an unmodifiable view of the specified navigable map. Query operations on the returned
30803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * map read through to the specified map, and attempts to modify the returned map, whether direct
30813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * or via its views, result in an {@code UnsupportedOperationException}.
30823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
30833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>The returned navigable map will be serializable if the specified navigable map is
30843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * serializable.
30853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
30863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * @param map the navigable map for which an unmodifiable view is to be returned
30873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * @return an unmodifiable view of the specified navigable map
30883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * @since 12.0
30893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   */
30903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
30913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public static <K, V> NavigableMap<K, V> unmodifiableNavigableMap(NavigableMap<K, V> map) {
30923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    checkNotNull(map);
30933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    if (map instanceof UnmodifiableNavigableMap) {
30943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return map;
30953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    } else {
30963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return new UnmodifiableNavigableMap<K, V>(map);
30973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
30983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
30993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31000888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Nullable private static <K, V> Entry<K, V> unmodifiableOrNull(@Nullable Entry<K, V> entry) {
31010888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return (entry == null) ? null : Maps.unmodifiableEntry(entry);
31021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
31031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
31043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
31053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  static class UnmodifiableNavigableMap<K, V>
31063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      extends ForwardingSortedMap<K, V> implements NavigableMap<K, V>, Serializable {
31073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    private final NavigableMap<K, V> delegate;
31083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    UnmodifiableNavigableMap(NavigableMap<K, V> delegate) {
31103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      this.delegate = delegate;
31113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    UnmodifiableNavigableMap(
31143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        NavigableMap<K, V> delegate, UnmodifiableNavigableMap<K, V> descendingMap) {
31153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      this.delegate = delegate;
31163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      this.descendingMap = descendingMap;
31173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    protected SortedMap<K, V> delegate() {
31213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return Collections.unmodifiableSortedMap(delegate);
31223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> lowerEntry(K key) {
31263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return unmodifiableOrNull(delegate.lowerEntry(key));
31273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K lowerKey(K key) {
31313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return delegate.lowerKey(key);
31323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> floorEntry(K key) {
31363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return unmodifiableOrNull(delegate.floorEntry(key));
31373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K floorKey(K key) {
31413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return delegate.floorKey(key);
31423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> ceilingEntry(K key) {
31463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return unmodifiableOrNull(delegate.ceilingEntry(key));
31473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K ceilingKey(K key) {
31513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return delegate.ceilingKey(key);
31523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> higherEntry(K key) {
31563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return unmodifiableOrNull(delegate.higherEntry(key));
31573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K higherKey(K key) {
31613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return delegate.higherKey(key);
31623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> firstEntry() {
31663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return unmodifiableOrNull(delegate.firstEntry());
31673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> lastEntry() {
31713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return unmodifiableOrNull(delegate.lastEntry());
31723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public final Entry<K, V> pollFirstEntry() {
31763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      throw new UnsupportedOperationException();
31773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public final Entry<K, V> pollLastEntry() {
31813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      throw new UnsupportedOperationException();
31823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    private transient UnmodifiableNavigableMap<K, V> descendingMap;
31853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> descendingMap() {
31883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      UnmodifiableNavigableMap<K, V> result = descendingMap;
31893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return (result == null)
31903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          ? descendingMap = new UnmodifiableNavigableMap<K, V>(delegate.descendingMap(), this)
31913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          : result;
31923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
31953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Set<K> keySet() {
31963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return navigableKeySet();
31973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
31983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
31993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
32003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableSet<K> navigableKeySet() {
32013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return Sets.unmodifiableNavigableSet(delegate.navigableKeySet());
32023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
32033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
32043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
32053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableSet<K> descendingKeySet() {
32063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return Sets.unmodifiableNavigableSet(delegate.descendingKeySet());
32073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
32083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
32093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
32103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public SortedMap<K, V> subMap(K fromKey, K toKey) {
32113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return subMap(fromKey, true, toKey, false);
32123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
32133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
32143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
32153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public SortedMap<K, V> headMap(K toKey) {
32163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return headMap(toKey, false);
32173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
32183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
32193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
32203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public SortedMap<K, V> tailMap(K fromKey) {
32213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return tailMap(fromKey, true);
32223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
32233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
32243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
32253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public
32263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        NavigableMap<K, V>
32273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
32283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return Maps.unmodifiableNavigableMap(delegate.subMap(
32293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          fromKey,
32303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          fromInclusive,
32313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          toKey,
32323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          toInclusive));
32333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
32343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
32353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
32363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
32373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return Maps.unmodifiableNavigableMap(delegate.headMap(toKey, inclusive));
32383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
32393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
32403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
32413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
32423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return Maps.unmodifiableNavigableMap(delegate.tailMap(fromKey, inclusive));
32433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
32443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
32453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
32463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  /**
32473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * Returns a synchronized (thread-safe) navigable map backed by the specified
32483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * navigable map.  In order to guarantee serial access, it is critical that
32493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <b>all</b> access to the backing navigable map is accomplished
32503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * through the returned navigable map (or its views).
32513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
32523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>It is imperative that the user manually synchronize on the returned
32533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * navigable map when iterating over any of its collection views, or the
32543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * collections views of any of its {@code descendingMap}, {@code subMap},
32553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * {@code headMap} or {@code tailMap} views. <pre>   {@code
32563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
32573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   NavigableMap<K, V> map = synchronizedNavigableMap(new TreeMap<K, V>());
32583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
32593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   // Needn't be in synchronized block
32603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   NavigableSet<K> set = map.navigableKeySet();
32613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
32623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   synchronized (map) { // Synchronizing on map, not set!
32633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *     Iterator<K> it = set.iterator(); // Must be in synchronized block
32643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *     while (it.hasNext()) {
32653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *       foo(it.next());
32663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *     }
32673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   }}</pre>
32683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
32693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>or: <pre>   {@code
32703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
32713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   NavigableMap<K, V> map = synchronizedNavigableMap(new TreeMap<K, V>());
32723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   NavigableMap<K, V> map2 = map.subMap(foo, false, bar, true);
32733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
32743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   // Needn't be in synchronized block
32753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   NavigableSet<K> set2 = map2.descendingKeySet();
32763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
32773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   synchronized (map) { // Synchronizing on map, not map2 or set2!
32783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *     Iterator<K> it = set2.iterator(); // Must be in synchronized block
32793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *     while (it.hasNext()) {
32803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *       foo(it.next());
32813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *     }
32823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *   }}</pre>
32833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
32843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>Failure to follow this advice may result in non-deterministic behavior.
32853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
32863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * <p>The returned navigable map will be serializable if the specified
32873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * navigable map is serializable.
32883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *
32893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * @param navigableMap the navigable map to be "wrapped" in a synchronized
32903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   *    navigable map.
32913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * @return a synchronized view of the specified navigable map.
32923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   * @since 13.0
32933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin   */
32943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
32953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public static <K, V> NavigableMap<K, V> synchronizedNavigableMap(
32963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      NavigableMap<K, V> navigableMap) {
32973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return Synchronized.navigableMap(navigableMap);
32983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
32993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
33001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
33011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code AbstractMap} extension that implements {@link #isEmpty()} as {@code
33021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * entrySet().isEmpty()} instead of {@code size() == 0} to speed up
33031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * implementations where {@code size()} is O(n), and it delegates the {@code
33041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * isEmpty()} methods of its key set and value collection to this
33051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * implementation.
33061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
33071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtCompatible
33087dd252788645e940eada959bdde927426e2531c9Paul Duffin  abstract static class ImprovedAbstractMap<K, V> extends AbstractMap<K, V> {
33091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
33101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Creates the entry set to be returned by {@link #entrySet()}. This method
33111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * is invoked at most once on a given map, at the time when {@code entrySet}
33121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * is first called.
33131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
33140888a09821a98ac0680fad765217302858e70fa4Paul Duffin    abstract Set<Entry<K, V>> createEntrySet();
33151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
33160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private transient Set<Entry<K, V>> entrySet;
33171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
33180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Set<Entry<K, V>> entrySet() {
33191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<Entry<K, V>> result = entrySet;
33200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return (result == null) ? entrySet = createEntrySet() : result;
33211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
33221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
33230888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private transient Set<K> keySet;
33241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
33250888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Set<K> keySet() {
33261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<K> result = keySet;
33270888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return (result == null) ? keySet = createKeySet() : result;
33280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
33290888a09821a98ac0680fad765217302858e70fa4Paul Duffin
33300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Set<K> createKeySet() {
33310888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new KeySet<K, V>(this);
33321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
33331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
33340888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private transient Collection<V> values;
33351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
33360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Collection<V> values() {
33371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<V> result = values;
33380888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return (result == null) ? values = createValues() : result;
33391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
33401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
33410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Collection<V> createValues() {
33420888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new Values<K, V>(this);
33430888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
33440888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
33451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
33461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
33471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Delegates to {@link Map#get}. Returns {@code null} on {@code
33487dd252788645e940eada959bdde927426e2531c9Paul Duffin   * ClassCastException} and {@code NullPointerException}.
33491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
33500888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <V> V safeGet(Map<?, V> map, @Nullable Object key) {
33517dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(map);
33521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
33531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return map.get(key);
33541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (ClassCastException e) {
33551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return null;
33567dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (NullPointerException e) {
33577dd252788645e940eada959bdde927426e2531c9Paul Duffin      return null;
33581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
33591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
33601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
33611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
33621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Delegates to {@link Map#containsKey}. Returns {@code false} on {@code
33637dd252788645e940eada959bdde927426e2531c9Paul Duffin   * ClassCastException} and {@code NullPointerException}.
33641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
33651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static boolean safeContainsKey(Map<?, ?> map, Object key) {
33667dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(map);
33671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
33681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return map.containsKey(key);
33691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (ClassCastException e) {
33701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return false;
33717dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (NullPointerException e) {
33727dd252788645e940eada959bdde927426e2531c9Paul Duffin      return false;
33737dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
33747dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
33757dd252788645e940eada959bdde927426e2531c9Paul Duffin
33767dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
33777dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Delegates to {@link Map#remove}. Returns {@code null} on {@code
33787dd252788645e940eada959bdde927426e2531c9Paul Duffin   * ClassCastException} and {@code NullPointerException}.
33797dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
33807dd252788645e940eada959bdde927426e2531c9Paul Duffin  static <V> V safeRemove(Map<?, V> map, Object key) {
33817dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkNotNull(map);
33827dd252788645e940eada959bdde927426e2531c9Paul Duffin    try {
33837dd252788645e940eada959bdde927426e2531c9Paul Duffin      return map.remove(key);
33847dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (ClassCastException e) {
33857dd252788645e940eada959bdde927426e2531c9Paul Duffin      return null;
33867dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (NullPointerException e) {
33877dd252788645e940eada959bdde927426e2531c9Paul Duffin      return null;
33881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
33891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
33901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
33911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
33920888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * An admittedly inefficient implementation of {@link Map#containsKey}.
33930888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
33940888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static boolean containsKeyImpl(Map<?, ?> map, @Nullable Object key) {
33950888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return Iterators.contains(keyIterator(map.entrySet().iterator()), key);
33960888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
33970888a09821a98ac0680fad765217302858e70fa4Paul Duffin
33980888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
33990888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * An implementation of {@link Map#containsValue}.
34000888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
34010888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static boolean containsValueImpl(Map<?, ?> map, @Nullable Object value) {
34020888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return Iterators.contains(valueIterator(map.entrySet().iterator()), value);
34030888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
34040888a09821a98ac0680fad765217302858e70fa4Paul Duffin
34050888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
34061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Implements {@code Collection.contains} safely for forwarding collections of
34071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * map entries. If {@code o} is an instance of {@code Map.Entry}, it is
34081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * wrapped using {@link #unmodifiableEntry} to protect against a possible
34091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * nefarious equals method.
34101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
34111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Note that {@code c} is the backing (delegate) collection, rather than
34121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * the forwarding collection.
34131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
34141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param c the delegate (unwrapped) collection of map entries
34151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param o the object that might be contained in {@code c}
34161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return {@code true} if {@code c} contains {@code o}
34171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
34181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static <K, V> boolean containsEntryImpl(Collection<Entry<K, V>> c, Object o) {
34191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (!(o instanceof Entry)) {
34201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return false;
34211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
34221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return c.contains(unmodifiableEntry((Entry<?, ?>) o));
34231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
34241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
34251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
34261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Implements {@code Collection.remove} safely for forwarding collections of
34271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * map entries. If {@code o} is an instance of {@code Map.Entry}, it is
34281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * wrapped using {@link #unmodifiableEntry} to protect against a possible
34291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * nefarious equals method.
34301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
34311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Note that {@code c} is backing (delegate) collection, rather than the
34321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * forwarding collection.
34331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
34341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param c the delegate (unwrapped) collection of map entries
34351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param o the object to remove from {@code c}
34361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return {@code true} if {@code c} was changed
34371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
34381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static <K, V> boolean removeEntryImpl(Collection<Entry<K, V>> c, Object o) {
34391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (!(o instanceof Entry)) {
34401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return false;
34411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
34421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return c.remove(unmodifiableEntry((Entry<?, ?>) o));
34431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
34441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
34451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
34461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * An implementation of {@link Map#equals}.
34471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
34481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static boolean equalsImpl(Map<?, ?> map, Object object) {
34491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (map == object) {
34501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return true;
34510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } else if (object instanceof Map) {
34521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Map<?, ?> o = (Map<?, ?>) object;
34531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return map.entrySet().equals(o.entrySet());
34541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
34551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return false;
34561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
34571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
34580888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static final MapJoiner STANDARD_JOINER =
34590888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Collections2.STANDARD_JOINER.withKeyValueSeparator("=");
34600888a09821a98ac0680fad765217302858e70fa4Paul Duffin
34611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
34621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * An implementation of {@link Map#toString}.
34631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
34641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static String toStringImpl(Map<?, ?> map) {
34650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    StringBuilder sb
34660888a09821a98ac0680fad765217302858e70fa4Paul Duffin        = Collections2.newStringBuilderForCollection(map.size()).append('{');
34671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    STANDARD_JOINER.appendTo(sb, map);
34681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return sb.append('}').toString();
34691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
34701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
34711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
34721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * An implementation of {@link Map#putAll}.
34731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
34740888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <K, V> void putAllImpl(
34750888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<K, V> self, Map<? extends K, ? extends V> map) {
34761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {
34771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      self.put(entry.getKey(), entry.getValue());
34781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
34791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
34801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
34810888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static class KeySet<K, V> extends Sets.ImprovedAbstractSet<K> {
34820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    final Map<K, V> map;
34831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
34840888a09821a98ac0680fad765217302858e70fa4Paul Duffin    KeySet(Map<K, V> map) {
34850888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.map = checkNotNull(map);
34860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
34871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
34880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Map<K, V> map() {
34890888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return map;
34900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
34911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
34920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Iterator<K> iterator() {
34937dd252788645e940eada959bdde927426e2531c9Paul Duffin      return keyIterator(map().entrySet().iterator());
34941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
34951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
34960888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int size() {
34971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return map().size();
34981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
34991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
35000888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean isEmpty() {
35011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return map().isEmpty();
35021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
35031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
35040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean contains(Object o) {
35051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return map().containsKey(o);
35061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
35071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
35080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean remove(Object o) {
35091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (contains(o)) {
35101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        map().remove(o);
35111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return true;
35121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
35131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return false;
35141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
35151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
35160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public void clear() {
3517dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin      map().clear();
35181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
35191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
35201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
35217dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Nullable
35227dd252788645e940eada959bdde927426e2531c9Paul Duffin  static <K> K keyOrNull(@Nullable Entry<K, ?> entry) {
35237dd252788645e940eada959bdde927426e2531c9Paul Duffin    return (entry == null) ? null : entry.getKey();
35247dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
35257dd252788645e940eada959bdde927426e2531c9Paul Duffin
35267dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Nullable
35277dd252788645e940eada959bdde927426e2531c9Paul Duffin  static <V> V valueOrNull(@Nullable Entry<?, V> entry) {
35287dd252788645e940eada959bdde927426e2531c9Paul Duffin    return (entry == null) ? null : entry.getValue();
35297dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
35307dd252788645e940eada959bdde927426e2531c9Paul Duffin
35310888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static class SortedKeySet<K, V> extends KeySet<K, V> implements SortedSet<K> {
35320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SortedKeySet(SortedMap<K, V> map) {
35330888a09821a98ac0680fad765217302858e70fa4Paul Duffin      super(map);
35340888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
35357dd252788645e940eada959bdde927426e2531c9Paul Duffin
35360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
35370888a09821a98ac0680fad765217302858e70fa4Paul Duffin    SortedMap<K, V> map() {
35380888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return (SortedMap<K, V>) super.map();
35390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
35407dd252788645e940eada959bdde927426e2531c9Paul Duffin
35410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
35420888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public Comparator<? super K> comparator() {
35430888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return map().comparator();
35440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
35457dd252788645e940eada959bdde927426e2531c9Paul Duffin
35460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
35470888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public SortedSet<K> subSet(K fromElement, K toElement) {
35480888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new SortedKeySet<K, V>(map().subMap(fromElement, toElement));
35490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
35507dd252788645e940eada959bdde927426e2531c9Paul Duffin
35510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
35520888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public SortedSet<K> headSet(K toElement) {
35530888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new SortedKeySet<K, V>(map().headMap(toElement));
35540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
35557dd252788645e940eada959bdde927426e2531c9Paul Duffin
35560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
35570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public SortedSet<K> tailSet(K fromElement) {
35580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new SortedKeySet<K, V>(map().tailMap(fromElement));
35590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
35601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
35617dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
35620888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public K first() {
35630888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return map().firstKey();
35641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
35651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
35667dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
35670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public K last() {
35680888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return map().lastKey();
35690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
35700888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
35710888a09821a98ac0680fad765217302858e70fa4Paul Duffin
35723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
35733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  static class NavigableKeySet<K, V> extends SortedKeySet<K, V> implements NavigableSet<K> {
35743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    NavigableKeySet(NavigableMap<K, V> map) {
35753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      super(map);
35763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
35773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
35783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
35793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    NavigableMap<K, V> map() {
35803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return (NavigableMap<K, V>) map;
35813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
35823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
35833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
35843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K lower(K e) {
35853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return map().lowerKey(e);
35863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
35873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
35883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
35893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K floor(K e) {
35903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return map().floorKey(e);
35913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
35923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
35933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
35943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K ceiling(K e) {
35953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return map().ceilingKey(e);
35963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
35973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
35983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
35993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K higher(K e) {
36003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return map().higherKey(e);
36013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
36023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
36033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
36043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K pollFirst() {
36053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return keyOrNull(map().pollFirstEntry());
36063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
36073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
36083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
36093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K pollLast() {
36103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return keyOrNull(map().pollLastEntry());
36113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
36123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
36133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
36143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableSet<K> descendingSet() {
36153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return map().descendingKeySet();
36163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
36173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
36183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
36193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Iterator<K> descendingIterator() {
36203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return descendingSet().iterator();
36213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
36223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
36233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
36243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableSet<K> subSet(
36253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        K fromElement,
36263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        boolean fromInclusive,
36273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        K toElement,
36283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        boolean toInclusive) {
36293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return map().subMap(fromElement, fromInclusive, toElement, toInclusive).navigableKeySet();
36303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
36313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
36323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
36333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableSet<K> headSet(K toElement, boolean inclusive) {
36343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return map().headMap(toElement, inclusive).navigableKeySet();
36353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
36363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
36373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
36383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableSet<K> tailSet(K fromElement, boolean inclusive) {
36393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return map().tailMap(fromElement, inclusive).navigableKeySet();
36403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
36413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
36423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
36433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public SortedSet<K> subSet(K fromElement, K toElement) {
36443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return subSet(fromElement, true, toElement, false);
36453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
36463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
36473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
36483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public SortedSet<K> headSet(K toElement) {
36493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return headSet(toElement, false);
36503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
36513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
36523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
36533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public SortedSet<K> tailSet(K fromElement) {
36543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return tailSet(fromElement, true);
36553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
36563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
36573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
36580888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static class Values<K, V> extends AbstractCollection<V> {
36590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    final Map<K, V> map;
36600888a09821a98ac0680fad765217302858e70fa4Paul Duffin
36610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Values(Map<K, V> map) {
36620888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.map = checkNotNull(map);
36630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
36640888a09821a98ac0680fad765217302858e70fa4Paul Duffin
36650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    final Map<K, V> map() {
36660888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return map;
36670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
36680888a09821a98ac0680fad765217302858e70fa4Paul Duffin
36690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Iterator<V> iterator() {
36700888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return valueIterator(map().entrySet().iterator());
36710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
36720888a09821a98ac0680fad765217302858e70fa4Paul Duffin
36730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean remove(Object o) {
36741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
36751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return super.remove(o);
36761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException e) {
36771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        for (Entry<K, V> entry : map().entrySet()) {
36781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          if (Objects.equal(o, entry.getValue())) {
36791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            map().remove(entry.getKey());
36801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return true;
36811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
36821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
36831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return false;
36841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
36851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
36861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
36870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean removeAll(Collection<?> c) {
36881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
36891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return super.removeAll(checkNotNull(c));
36901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException e) {
36911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Set<K> toRemove = Sets.newHashSet();
36921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        for (Entry<K, V> entry : map().entrySet()) {
36931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          if (c.contains(entry.getValue())) {
36941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            toRemove.add(entry.getKey());
36951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
36961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
36971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return map().keySet().removeAll(toRemove);
36981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
36991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
37001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
37010888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean retainAll(Collection<?> c) {
37021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
37031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return super.retainAll(checkNotNull(c));
37041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException e) {
37051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Set<K> toRetain = Sets.newHashSet();
37061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        for (Entry<K, V> entry : map().entrySet()) {
37071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          if (c.contains(entry.getValue())) {
37081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            toRetain.add(entry.getKey());
37091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
37101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
37111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return map().keySet().retainAll(toRetain);
37121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
37131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
37141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
37150888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int size() {
37161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return map().size();
37171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
37181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
37190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean isEmpty() {
37201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return map().isEmpty();
37211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
37221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
37230888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean contains(@Nullable Object o) {
37241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return map().containsValue(o);
37251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
37261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
37270888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public void clear() {
37281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      map().clear();
37291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
37301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
37311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
37320888a09821a98ac0680fad765217302858e70fa4Paul Duffin  abstract static class EntrySet<K, V>
37330888a09821a98ac0680fad765217302858e70fa4Paul Duffin      extends Sets.ImprovedAbstractSet<Entry<K, V>> {
37341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    abstract Map<K, V> map();
37351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
37360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int size() {
37371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return map().size();
37381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
37391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
37400888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public void clear() {
37411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      map().clear();
37421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
37431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
37440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean contains(Object o) {
37451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (o instanceof Entry) {
37461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Entry<?, ?> entry = (Entry<?, ?>) o;
37471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Object key = entry.getKey();
37480888a09821a98ac0680fad765217302858e70fa4Paul Duffin        V value = Maps.safeGet(map(), key);
37490888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return Objects.equal(value, entry.getValue())
37500888a09821a98ac0680fad765217302858e70fa4Paul Duffin            && (value != null || map().containsKey(key));
37511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
37521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return false;
37531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
37541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
37550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean isEmpty() {
37561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return map().isEmpty();
37571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
37581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
37590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean remove(Object o) {
37601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (contains(o)) {
37611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Entry<?, ?> entry = (Entry<?, ?>) o;
37621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return map().keySet().remove(entry.getKey());
37631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
37641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return false;
37651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
37661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
37670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean removeAll(Collection<?> c) {
37681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
37691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return super.removeAll(checkNotNull(c));
37701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException e) {
37711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // if the iterators don't support remove
37720888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return Sets.removeAllImpl(this, c.iterator());
37731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
37741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
37751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
37760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean retainAll(Collection<?> c) {
37771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
37781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return super.retainAll(checkNotNull(c));
37791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException e) {
37801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // if the iterators don't support remove
37811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Set<Object> keys = Sets.newHashSetWithExpectedSize(c.size());
37821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        for (Object o : c) {
37831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          if (contains(o)) {
37841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Entry<?, ?> entry = (Entry<?, ?>) o;
37851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            keys.add(entry.getKey());
37861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
37871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
37881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return map().keySet().retainAll(keys);
37891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
37901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
37911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
37923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
37933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("NavigableMap")
37943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  abstract static class DescendingMap<K, V> extends ForwardingMap<K, V>
37953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      implements NavigableMap<K, V> {
37963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
37973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    abstract NavigableMap<K, V> forward();
37983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
37993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    protected final Map<K, V> delegate() {
38013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward();
38023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    private transient Comparator<? super K> comparator;
38053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @SuppressWarnings("unchecked")
38073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Comparator<? super K> comparator() {
38093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      Comparator<? super K> result = comparator;
38103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      if (result == null) {
38113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        Comparator<? super K> forwardCmp = forward().comparator();
38123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        if (forwardCmp == null) {
38133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          forwardCmp = (Comparator) Ordering.natural();
38143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        }
38153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        result = comparator = reverse(forwardCmp);
38163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      }
38173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return result;
38183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    // If we inline this, we get a javac error.
38213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    private static <T> Ordering<T> reverse(Comparator<T> forward) {
38223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return Ordering.from(forward).reverse();
38233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K firstKey() {
38273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().lastKey();
38283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K lastKey() {
38323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().firstKey();
38333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> lowerEntry(K key) {
38373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().higherEntry(key);
38383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K lowerKey(K key) {
38423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().higherKey(key);
38433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> floorEntry(K key) {
38473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().ceilingEntry(key);
38483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K floorKey(K key) {
38523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().ceilingKey(key);
38533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> ceilingEntry(K key) {
38573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().floorEntry(key);
38583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K ceilingKey(K key) {
38623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().floorKey(key);
38633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> higherEntry(K key) {
38673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().lowerEntry(key);
38683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public K higherKey(K key) {
38723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().lowerKey(key);
38733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> firstEntry() {
38773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().lastEntry();
38783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> lastEntry() {
38823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().firstEntry();
38833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> pollFirstEntry() {
38873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().pollLastEntry();
38883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Entry<K, V> pollLastEntry() {
38923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().pollFirstEntry();
38933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
38953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
38963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> descendingMap() {
38973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward();
38983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
38993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    private transient Set<Entry<K, V>> entrySet;
39013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
39033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Set<Entry<K, V>> entrySet() {
39043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      Set<Entry<K, V>> result = entrySet;
39053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return (result == null) ? entrySet = createEntrySet() : result;
39063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
39073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    abstract Iterator<Entry<K, V>> entryIterator();
39093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    Set<Entry<K, V>> createEntrySet() {
39113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return new EntrySet<K, V>() {
39123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        @Override
39133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        Map<K, V> map() {
39143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          return DescendingMap.this;
39153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        }
39163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        @Override
39183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        public Iterator<Entry<K, V>> iterator() {
39193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin          return entryIterator();
39203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        }
39213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      };
39223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
39233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
39253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Set<K> keySet() {
39263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return navigableKeySet();
39273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
39283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    private transient NavigableSet<K> navigableKeySet;
39303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
39323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableSet<K> navigableKeySet() {
39333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      NavigableSet<K> result = navigableKeySet;
39343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return (result == null) ? navigableKeySet = new NavigableKeySet<K, V>(this) : result;
39353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
39363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
39383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableSet<K> descendingKeySet() {
39393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().navigableKeySet();
39403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
39413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
39433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public
39443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    NavigableMap<K, V>
39453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
39463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().subMap(toKey, toInclusive, fromKey, fromInclusive).descendingMap();
39473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
39483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
39503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
39513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().tailMap(toKey, inclusive).descendingMap();
39523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
39533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
39553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
39563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return forward().headMap(fromKey, inclusive).descendingMap();
39573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
39583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
39603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public SortedMap<K, V> subMap(K fromKey, K toKey) {
39613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return subMap(fromKey, true, toKey, false);
39623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
39633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
39653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public SortedMap<K, V> headMap(K toKey) {
39663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return headMap(toKey, false);
39673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
39683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
39703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public SortedMap<K, V> tailMap(K fromKey) {
39713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return tailMap(fromKey, true);
39723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
39733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
39753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public Collection<V> values() {
39763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return new Values<K, V>(this);
39773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
39783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
39793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    @Override
39803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    public String toString() {
39813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      return standardToString();
39823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    }
39833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
39841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
3985