/* * Copyright (C) 2012 The Guava Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.common.collect; import static com.google.common.base.Preconditions.checkNotNull; import javax.annotation.Nullable; /** * An implementation of an immutable sorted map with one or more entries. * * @author Louis Wasserman */ @SuppressWarnings("serial") // uses writeReplace, not default serialization final class RegularImmutableSortedMap extends ImmutableSortedMap { private final transient RegularImmutableSortedSet keySet; private final transient ImmutableList valueList; RegularImmutableSortedMap(RegularImmutableSortedSet keySet, ImmutableList valueList) { this.keySet = keySet; this.valueList = valueList; } RegularImmutableSortedMap( RegularImmutableSortedSet keySet, ImmutableList valueList, ImmutableSortedMap descendingMap) { super(descendingMap); this.keySet = keySet; this.valueList = valueList; } @Override ImmutableSet> createEntrySet() { return new EntrySet(); } private class EntrySet extends ImmutableMapEntrySet { @Override public UnmodifiableIterator> iterator() { return asList().iterator(); } @Override ImmutableList> createAsList() { return new ImmutableAsList>() { // avoid additional indirection private final ImmutableList keyList = keySet().asList(); private final ImmutableList valueList = values().asList(); @Override public Entry get(int index) { return Maps.immutableEntry(keyList.get(index), valueList.get(index)); } @Override ImmutableCollection> delegateCollection() { return EntrySet.this; } }; } @Override ImmutableMap map() { return RegularImmutableSortedMap.this; } } @Override public ImmutableSortedSet keySet() { return keySet; } @Override public ImmutableCollection values() { return valueList; } @Override public V get(@Nullable Object key) { int index = keySet.indexOf(key); return (index == -1) ? null : valueList.get(index); } private ImmutableSortedMap getSubMap(int fromIndex, int toIndex) { if (fromIndex == 0 && toIndex == size()) { return this; } else if (fromIndex == toIndex) { return emptyMap(comparator()); } else { return from( keySet.getSubSet(fromIndex, toIndex), valueList.subList(fromIndex, toIndex)); } } @Override public ImmutableSortedMap headMap(K toKey, boolean inclusive) { return getSubMap(0, keySet.headIndex(checkNotNull(toKey), inclusive)); } @Override public ImmutableSortedMap tailMap(K fromKey, boolean inclusive) { return getSubMap(keySet.tailIndex(checkNotNull(fromKey), inclusive), size()); } @Override ImmutableSortedMap createDescendingMap() { return new RegularImmutableSortedMap( (RegularImmutableSortedSet) keySet.descendingSet(), valueList.reverse(), this); } }