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 com.google.common.annotations.GwtCompatible;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.SortedSet;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Basic implementation of the {@link SortedSetMultimap} interface. It's a
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * wrapper around {@link AbstractMultimap} that converts the returned
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * collections into sorted sets. The {@link #createCollection} method
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * must return a {@code SortedSet}.
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertabstract class AbstractSortedSetMultimap<K, V>
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    extends AbstractSetMultimap<K, V> implements SortedSetMultimap<K, V> {
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Creates a new multimap that uses the provided map.
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @param map place to store the mapping from each key to its corresponding
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *     values
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected AbstractSortedSetMultimap(Map<K, Collection<V>> map) {
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    super(map);
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override abstract SortedSet<V> createCollection();
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Following Javadoc copied from Multimap and SortedSetMultimap.
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a collection view of all values associated with a key. If no
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * mappings in the multimap have the provided key, an empty collection is
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * returned.
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Changes to the returned collection will update the underlying multimap,
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * and vice versa.
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Because a {@code SortedSetMultimap} has unique sorted values for a given
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * key, this method returns a {@link SortedSet}, instead of the
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link Collection} specified in the {@link Multimap} interface.
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public SortedSet<V> get(@Nullable K key) {
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return (SortedSet<V>) super.get(key);
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Removes all values associated with a given key. The returned collection is
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * immutable.
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Because a {@code SortedSetMultimap} has unique sorted values for a given
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * key, this method returns a {@link SortedSet}, instead of the
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link Collection} specified in the {@link Multimap} interface.
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public SortedSet<V> removeAll(@Nullable Object key) {
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return (SortedSet<V>) super.removeAll(key);
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Stores a collection of values with the same key, replacing any existing
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * values for that key. The returned collection is immutable.
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Because a {@code SortedSetMultimap} has unique sorted values for a given
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * key, this method returns a {@link SortedSet}, instead of the
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link Collection} specified in the {@link Multimap} interface.
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Any duplicates in {@code values} will be stored in the multimap once.
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public SortedSet<V> replaceValues(
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      K key, Iterable<? extends V> values) {
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return (SortedSet<V>) super.replaceValues(key, values);
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a map view that associates each key with the corresponding values
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * in the multimap. Changes to the returned map, such as element removal, will
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * update the underlying multimap. The map does not support {@code setValue}
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * on its entries, {@code put}, or {@code putAll}.
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>When passed a key that is present in the map, {@code
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * asMap().get(Object)} has the same behavior as {@link #get}, returning a
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * live collection. When passed a key that is not present, however, {@code
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * asMap().get(Object)} returns {@code null} instead of an empty collection.
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Though the method signature doesn't say so explicitly, the returned map
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * has {@link SortedSet} values.
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public Map<K, Collection<V>> asMap() {
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return super.asMap();
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@inheritDoc}
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Consequently, the values do not follow their natural ordering or the
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ordering of the value comparator.
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public Collection<V> values() {
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return super.values();
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final long serialVersionUID = 430848587173315748L;
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
125