17dd252788645e940eada959bdde927426e2531c9Paul Duffin/*
27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2008 The Guava Authors
37dd252788645e940eada959bdde927426e2531c9Paul Duffin *
47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License.
67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at
77dd252788645e940eada959bdde927426e2531c9Paul Duffin *
87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
97dd252788645e940eada959bdde927426e2531c9Paul Duffin *
107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software
117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and
147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License.
157dd252788645e940eada959bdde927426e2531c9Paul Duffin */
167dd252788645e940eada959bdde927426e2531c9Paul Duffin
177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.collect;
187dd252788645e940eada959bdde927426e2531c9Paul Duffin
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.GwtCompatible;
207dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.GwtIncompatible;
217dd252788645e940eada959bdde927426e2531c9Paul Duffin
227dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.io.Serializable;
237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Map.Entry;
247dd252788645e940eada959bdde927426e2531c9Paul Duffin
257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport javax.annotation.Nullable;
267dd252788645e940eada959bdde927426e2531c9Paul Duffin
277dd252788645e940eada959bdde927426e2531c9Paul Duffin/**
287dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@code keySet()} implementation for {@link ImmutableMap}.
297dd252788645e940eada959bdde927426e2531c9Paul Duffin *
307dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Jesse Wilson
317dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Kevin Bourrillion
327dd252788645e940eada959bdde927426e2531c9Paul Duffin */
337dd252788645e940eada959bdde927426e2531c9Paul Duffin@GwtCompatible(emulated = true)
347dd252788645e940eada959bdde927426e2531c9Paul Duffinfinal class ImmutableMapKeySet<K, V> extends ImmutableSet<K> {
357dd252788645e940eada959bdde927426e2531c9Paul Duffin  private final ImmutableMap<K, V> map;
367dd252788645e940eada959bdde927426e2531c9Paul Duffin
377dd252788645e940eada959bdde927426e2531c9Paul Duffin  ImmutableMapKeySet(ImmutableMap<K, V> map) {
387dd252788645e940eada959bdde927426e2531c9Paul Duffin    this.map = map;
397dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
407dd252788645e940eada959bdde927426e2531c9Paul Duffin
410888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
427dd252788645e940eada959bdde927426e2531c9Paul Duffin  public int size() {
437dd252788645e940eada959bdde927426e2531c9Paul Duffin    return map.size();
447dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
457dd252788645e940eada959bdde927426e2531c9Paul Duffin
467dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Override
477dd252788645e940eada959bdde927426e2531c9Paul Duffin  public UnmodifiableIterator<K> iterator() {
487dd252788645e940eada959bdde927426e2531c9Paul Duffin    return asList().iterator();
497dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
507dd252788645e940eada959bdde927426e2531c9Paul Duffin
517dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Override
527dd252788645e940eada959bdde927426e2531c9Paul Duffin  public boolean contains(@Nullable Object object) {
537dd252788645e940eada959bdde927426e2531c9Paul Duffin    return map.containsKey(object);
547dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
557dd252788645e940eada959bdde927426e2531c9Paul Duffin
567dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Override
577dd252788645e940eada959bdde927426e2531c9Paul Duffin  ImmutableList<K> createAsList() {
587dd252788645e940eada959bdde927426e2531c9Paul Duffin    final ImmutableList<Entry<K, V>> entryList = map.entrySet().asList();
597dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new ImmutableAsList<K>() {
607dd252788645e940eada959bdde927426e2531c9Paul Duffin
610888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
627dd252788645e940eada959bdde927426e2531c9Paul Duffin      public K get(int index) {
637dd252788645e940eada959bdde927426e2531c9Paul Duffin        return entryList.get(index).getKey();
647dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
657dd252788645e940eada959bdde927426e2531c9Paul Duffin
667dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
677dd252788645e940eada959bdde927426e2531c9Paul Duffin      ImmutableCollection<K> delegateCollection() {
687dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ImmutableMapKeySet.this;
697dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
707dd252788645e940eada959bdde927426e2531c9Paul Duffin
717dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
727dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
737dd252788645e940eada959bdde927426e2531c9Paul Duffin
747dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Override
757dd252788645e940eada959bdde927426e2531c9Paul Duffin  boolean isPartialView() {
767dd252788645e940eada959bdde927426e2531c9Paul Duffin    return true;
777dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
787dd252788645e940eada959bdde927426e2531c9Paul Duffin
797dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("serialization")
807dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Override Object writeReplace() {
817dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new KeySetSerializedForm<K>(map);
827dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
837dd252788645e940eada959bdde927426e2531c9Paul Duffin
847dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("serialization")
857dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static class KeySetSerializedForm<K> implements Serializable {
867dd252788645e940eada959bdde927426e2531c9Paul Duffin    final ImmutableMap<K, ?> map;
877dd252788645e940eada959bdde927426e2531c9Paul Duffin    KeySetSerializedForm(ImmutableMap<K, ?> map) {
887dd252788645e940eada959bdde927426e2531c9Paul Duffin      this.map = map;
897dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
907dd252788645e940eada959bdde927426e2531c9Paul Duffin    Object readResolve() {
917dd252788645e940eada959bdde927426e2531c9Paul Duffin      return map.keySet();
927dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
937dd252788645e940eada959bdde927426e2531c9Paul Duffin    private static final long serialVersionUID = 0;
947dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
957dd252788645e940eada959bdde927426e2531c9Paul Duffin}
96