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