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.Beta; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Objects; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A multiset which forwards all its method calls to another multiset. 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Subclasses should override one or more methods to modify the behavior of the 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * backing multiset as desired per the <a 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>. 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Warning:</b> The methods of {@code ForwardingMultiset} forward 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <b>indiscriminately</b> to the methods of the delegate. For example, 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * overriding {@link #add(Object, int)} alone <b>will not</b> change the 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * behavior of {@link #add(Object)}, which can lead to unexpected behavior. In 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * this case, you should override {@code add(Object)} as well, either providing 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * your own implementation, or delegating to the provided {@code standardAdd} 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * method. 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The {@code standard} methods and any collection views they return are not 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * guaranteed to be thread-safe, even when all of the methods that they depend 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * on are thread-safe. 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 (imported from Google Collections Library) 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible 520888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic abstract class ForwardingMultiset<E> extends ForwardingCollection<E> 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin implements Multiset<E> { 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** Constructor for use by subclasses. */ 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected ForwardingMultiset() {} 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override protected abstract Multiset<E> delegate(); 597dd252788645e940eada959bdde927426e2531c9Paul Duffin 600888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int count(Object element) { 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().count(element); 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int add(E element, int occurrences) { 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().add(element, occurrences); 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 700888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int remove(Object element, int occurrences) { 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().remove(element, occurrences); 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Set<E> elementSet() { 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().elementSet(); 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 800888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Set<Entry<E>> entrySet() { 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().entrySet(); 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean equals(@Nullable Object object) { 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return object == this || delegate().equals(object); 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int hashCode() { 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().hashCode(); 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 930888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int setCount(E element, int count) { 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().setCount(element, count); 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 980888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean setCount(E element, int oldCount, int newCount) { 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().setCount(element, oldCount, newCount); 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #contains} in terms of {@link #count}. If 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you override {@link #count}, you may wish to override {@link #contains} to 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * forward to this implementation. 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override protected boolean standardContains(@Nullable Object object) { 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return count(object) > 0; 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #clear} in terms of the {@code iterator} 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * method of {@link #entrySet}. If you override {@link #entrySet}, you may 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * wish to override {@link #clear} to forward to this implementation. 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override protected void standardClear() { 1227dd252788645e940eada959bdde927426e2531c9Paul Duffin Iterators.clear(entrySet().iterator()); 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible, albeit inefficient, definition of {@link #count} in terms of 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #entrySet}. If you override {@link #entrySet}, you may wish to 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * override {@link #count} to forward to this implementation. 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Beta protected int standardCount(@Nullable Object object) { 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<?> entry : this.entrySet()) { 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (Objects.equal(entry.getElement(), object)) { 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return entry.getCount(); 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return 0; 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #add(Object)} in terms of {@link 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #add(Object, int)}. If you override {@link #add(Object, int)}, you may 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * wish to override {@link #add(Object)} to forward to this implementation. 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1487dd252788645e940eada959bdde927426e2531c9Paul Duffin protected boolean standardAdd(E element) { 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert add(element, 1); 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #addAll(Collection)} in terms of {@link 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #add(Object)} and {@link #add(Object, int)}. If you override either of 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * these methods, you may wish to override {@link #addAll(Collection)} to 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * forward to this implementation. 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1610888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Beta @Override protected boolean standardAddAll( 1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collection<? extends E> elementsToAdd) { 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Multisets.addAllImpl(this, elementsToAdd); 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #remove(Object)} in terms of {@link 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #remove(Object, int)}. If you override {@link #remove(Object, int)}, you 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * may wish to override {@link #remove(Object)} to forward to this 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * implementation. 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1740888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override protected boolean standardRemove(Object element) { 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return remove(element, 1) > 0; 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #removeAll} in terms of the {@code 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * removeAll} method of {@link #elementSet}. If you override {@link 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #elementSet}, you may wish to override {@link #removeAll} to forward to 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * this implementation. 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1860888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override protected boolean standardRemoveAll( 1870888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collection<?> elementsToRemove) { 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Multisets.removeAllImpl(this, elementsToRemove); 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #retainAll} in terms of the {@code 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * retainAll} method of {@link #elementSet}. If you override {@link 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #elementSet}, you may wish to override {@link #retainAll} to forward to 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * this implementation. 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1990888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override protected boolean standardRetainAll( 2000888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collection<?> elementsToRetain) { 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Multisets.retainAllImpl(this, elementsToRetain); 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #setCount(Object, int)} in terms of {@link 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #count(Object)}, {@link #add(Object, int)}, and {@link #remove(Object, 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * int)}. {@link #entrySet()}. If you override any of these methods, you may 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * wish to override {@link #setCount(Object, int)} to forward to this 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * implementation. 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2137dd252788645e940eada959bdde927426e2531c9Paul Duffin protected int standardSetCount(E element, int count) { 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Multisets.setCountImpl(this, element, count); 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #setCount(Object, int, int)} in terms of 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #count(Object)} and {@link #setCount(Object, int)}. If you override 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * either of these methods, you may wish to override {@link #setCount(Object, 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * int, int)} to forward to this implementation. 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2257dd252788645e940eada959bdde927426e2531c9Paul Duffin protected boolean standardSetCount(E element, int oldCount, int newCount) { 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Multisets.setCountImpl(this, element, oldCount, newCount); 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible implementation of {@link Multiset#elementSet} in terms of the 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * following methods: {@link ForwardingMultiset#clear}, {@link 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ForwardingMultiset#contains}, {@link ForwardingMultiset#containsAll}, 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link ForwardingMultiset#count}, {@link ForwardingMultiset#isEmpty}, the 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link Set#size} and {@link Set#iterator} methods of {@link 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ForwardingMultiset#entrySet}, and {@link ForwardingMultiset#remove(Object, 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * int)}. In many situations, you may wish to override {@link 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ForwardingMultiset#elementSet} to forward to this implementation or a 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * subclass thereof. 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 10.0 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Beta 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected class StandardElementSet extends Multisets.ElementSet<E> { 2447dd252788645e940eada959bdde927426e2531c9Paul Duffin /** Constructor for use by subclasses. */ 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public StandardElementSet() {} 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Multiset<E> multiset() { 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ForwardingMultiset.this; 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2520888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #iterator} in terms of {@link #entrySet} 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * and {@link #remove(Object)}. If you override either of these methods, you 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * may wish to override {@link #iterator} to forward to this implementation. 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2607dd252788645e940eada959bdde927426e2531c9Paul Duffin protected Iterator<E> standardIterator() { 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Multisets.iteratorImpl(this); 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible, albeit inefficient, definition of {@link #size} in terms of 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #entrySet}. If you override {@link #entrySet}, you may wish to 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * override {@link #size} to forward to this implementation. 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2717dd252788645e940eada959bdde927426e2531c9Paul Duffin protected int standardSize() { 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Multisets.sizeImpl(this); 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible, albeit inefficient, definition of {@link #size} in terms of 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code entrySet().size()} and {@link #count}. If you override either of 2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * these methods, you may wish to override {@link #size} to forward to this 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * implementation. 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2837dd252788645e940eada959bdde927426e2531c9Paul Duffin protected boolean standardEquals(@Nullable Object object) { 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Multisets.equalsImpl(this, object); 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #hashCode} as {@code entrySet().hashCode()} 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * . If you override {@link #entrySet}, you may wish to override {@link 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #hashCode} to forward to this implementation. 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2947dd252788645e940eada959bdde927426e2531c9Paul Duffin protected int standardHashCode() { 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return entrySet().hashCode(); 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #toString} as {@code entrySet().toString()} 3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * . If you override {@link #entrySet}, you may wish to override {@link 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #toString} to forward to this implementation. 3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 3050888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override protected String standardToString() { 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return entrySet().toString(); 3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 309