10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/* 20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2011 The Guava Authors 30888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * in compliance with the License. You may obtain a copy of the License at 60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 70888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 90888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software distributed under the 100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * express or implied. See the License for the specific language governing permissions and 120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * limitations under the License. 130888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 140888a09821a98ac0680fad765217302858e70fa4Paul Duffin 150888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.collect; 160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 170888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.Beta; 180888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.GwtCompatible; 190888a09821a98ac0680fad765217302858e70fa4Paul Duffin 200888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Comparator; 210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Iterator; 220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.SortedSet; 230888a09821a98ac0680fad765217302858e70fa4Paul Duffin 240888a09821a98ac0680fad765217302858e70fa4Paul Duffin/** 250888a09821a98ac0680fad765217302858e70fa4Paul Duffin * A sorted multiset which forwards all its method calls to another sorted multiset. Subclasses 260888a09821a98ac0680fad765217302858e70fa4Paul Duffin * should override one or more methods to modify the behavior of the backing multiset as desired 270888a09821a98ac0680fad765217302858e70fa4Paul Duffin * per the <a href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>. 280888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 290888a09821a98ac0680fad765217302858e70fa4Paul Duffin * <p><b>Warning:</b> The methods of {@code ForwardingSortedMultiset} forward 300888a09821a98ac0680fad765217302858e70fa4Paul Duffin * <b>indiscriminately</b> to the methods of the delegate. For example, overriding 310888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link #add(Object, int)} alone <b>will not</b> change the behavior of {@link #add(Object)}, 320888a09821a98ac0680fad765217302858e70fa4Paul Duffin * which can lead to unexpected behavior. In this case, you should override {@code add(Object)} as 330888a09821a98ac0680fad765217302858e70fa4Paul Duffin * well, either providing your own implementation, or delegating to the provided {@code 340888a09821a98ac0680fad765217302858e70fa4Paul Duffin * standardAdd} method. 350888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 360888a09821a98ac0680fad765217302858e70fa4Paul Duffin * <p>The {@code standard} methods and any collection views they return are not guaranteed to be 370888a09821a98ac0680fad765217302858e70fa4Paul Duffin * thread-safe, even when all of the methods that they depend on are thread-safe. 380888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 390888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Louis Wasserman 400888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @since 15.0 410888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 420888a09821a98ac0680fad765217302858e70fa4Paul Duffin@Beta 430888a09821a98ac0680fad765217302858e70fa4Paul Duffin@GwtCompatible(emulated = true) 440888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic abstract class ForwardingSortedMultiset<E> extends ForwardingMultiset<E> 450888a09821a98ac0680fad765217302858e70fa4Paul Duffin implements SortedMultiset<E> { 460888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** Constructor for use by subclasses. */ 470888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected ForwardingSortedMultiset() {} 480888a09821a98ac0680fad765217302858e70fa4Paul Duffin 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 500888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected abstract SortedMultiset<E> delegate(); 510888a09821a98ac0680fad765217302858e70fa4Paul Duffin 520888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin public SortedSet<E> elementSet() { 540888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (SortedSet<E>) super.elementSet(); 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin * A sensible implementation of {@link SortedMultiset#elementSet} in terms of the following 590888a09821a98ac0680fad765217302858e70fa4Paul Duffin * methods: {@link SortedMultiset#clear}, {@link SortedMultiset#comparator}, {@link 600888a09821a98ac0680fad765217302858e70fa4Paul Duffin * SortedMultiset#contains}, {@link SortedMultiset#containsAll}, {@link SortedMultiset#count}, 610888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link SortedMultiset#firstEntry} {@link SortedMultiset#headMultiset}, {@link 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin * SortedMultiset#isEmpty}, {@link SortedMultiset#lastEntry}, {@link SortedMultiset#subMultiset}, 630888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link SortedMultiset#tailMultiset}, the {@code size()} and {@code iterator()} methods of 640888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link SortedMultiset#entrySet}, and {@link SortedMultiset#remove(Object, int)}. In many 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin * situations, you may wish to override {@link SortedMultiset#elementSet} to forward to this 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin * implementation or a subclass thereof. 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected class StandardElementSet extends SortedMultisets.ElementSet<E> { 690888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** Constructor for use by subclasses. */ 700888a09821a98ac0680fad765217302858e70fa4Paul Duffin public StandardElementSet() { 710888a09821a98ac0680fad765217302858e70fa4Paul Duffin super(ForwardingSortedMultiset.this); 720888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 730888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 740888a09821a98ac0680fad765217302858e70fa4Paul Duffin 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 760888a09821a98ac0680fad765217302858e70fa4Paul Duffin public Comparator<? super E> comparator() { 770888a09821a98ac0680fad765217302858e70fa4Paul Duffin return delegate().comparator(); 780888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin 800888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin public SortedMultiset<E> descendingMultiset() { 820888a09821a98ac0680fad765217302858e70fa4Paul Duffin return delegate().descendingMultiset(); 830888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 860888a09821a98ac0680fad765217302858e70fa4Paul Duffin * A skeleton implementation of a descending multiset view. Normally, 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link #descendingMultiset()} will not reflect any changes you make to the behavior of methods 880888a09821a98ac0680fad765217302858e70fa4Paul Duffin * such as {@link #add(Object)} or {@link #pollFirstEntry}. This skeleton implementation 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin * correctly delegates each of its operations to the appropriate methods of this {@code 900888a09821a98ac0680fad765217302858e70fa4Paul Duffin * ForwardingSortedMultiset}. 910888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 920888a09821a98ac0680fad765217302858e70fa4Paul Duffin * In many cases, you may wish to override {@link #descendingMultiset()} to return an instance of 930888a09821a98ac0680fad765217302858e70fa4Paul Duffin * a subclass of {@code StandardDescendingMultiset}. 940888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 950888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected abstract class StandardDescendingMultiset 960888a09821a98ac0680fad765217302858e70fa4Paul Duffin extends DescendingMultiset<E> { 970888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** Constructor for use by subclasses. */ 980888a09821a98ac0680fad765217302858e70fa4Paul Duffin public StandardDescendingMultiset() {} 990888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMultiset<E> forwardMultiset() { 1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin return ForwardingSortedMultiset.this; 1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin public Entry<E> firstEntry() { 1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin return delegate().firstEntry(); 1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * A sensible definition of {@link #firstEntry()} in terms of {@code entrySet().iterator()}. 1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * If you override {@link #entrySet()}, you may wish to override {@link #firstEntry()} to forward 1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin * to this implementation. 1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected Entry<E> standardFirstEntry() { 1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin Iterator<Entry<E>> entryIterator = entrySet().iterator(); 1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (!entryIterator.hasNext()) { 1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin return null; 1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin Entry<E> entry = entryIterator.next(); 1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Multisets.immutableEntry(entry.getElement(), entry.getCount()); 1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin public Entry<E> lastEntry() { 1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin return delegate().lastEntry(); 1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin * A sensible definition of {@link #lastEntry()} in terms of {@code 1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin * descendingMultiset().entrySet().iterator()}. 1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin * If you override {@link #descendingMultiset} or {@link #entrySet()}, you may wish to override 1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link #firstEntry()} to forward to this implementation. 1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected Entry<E> standardLastEntry() { 1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin Iterator<Entry<E>> entryIterator = descendingMultiset() 1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin .entrySet() 1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin .iterator(); 1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (!entryIterator.hasNext()) { 1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin return null; 1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin Entry<E> entry = entryIterator.next(); 1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Multisets.immutableEntry(entry.getElement(), entry.getCount()); 1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin public Entry<E> pollFirstEntry() { 1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin return delegate().pollFirstEntry(); 1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin * A sensible definition of {@link #pollFirstEntry()} in terms of {@code entrySet().iterator()}. 1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin * If you override {@link #entrySet()}, you may wish to override {@link #pollFirstEntry()} to 1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin * forward to this implementation. 1590888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 1600888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected Entry<E> standardPollFirstEntry() { 1610888a09821a98ac0680fad765217302858e70fa4Paul Duffin Iterator<Entry<E>> entryIterator = entrySet().iterator(); 1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (!entryIterator.hasNext()) { 1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin return null; 1640888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1650888a09821a98ac0680fad765217302858e70fa4Paul Duffin Entry<E> entry = entryIterator.next(); 1660888a09821a98ac0680fad765217302858e70fa4Paul Duffin entry = Multisets.immutableEntry(entry.getElement(), entry.getCount()); 1670888a09821a98ac0680fad765217302858e70fa4Paul Duffin entryIterator.remove(); 1680888a09821a98ac0680fad765217302858e70fa4Paul Duffin return entry; 1690888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1700888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1710888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin public Entry<E> pollLastEntry() { 1730888a09821a98ac0680fad765217302858e70fa4Paul Duffin return delegate().pollLastEntry(); 1740888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1750888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1760888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 1770888a09821a98ac0680fad765217302858e70fa4Paul Duffin * A sensible definition of {@link #pollLastEntry()} in terms of {@code 1780888a09821a98ac0680fad765217302858e70fa4Paul Duffin * descendingMultiset().entrySet().iterator()}. 1790888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 1800888a09821a98ac0680fad765217302858e70fa4Paul Duffin * If you override {@link #descendingMultiset()} or {@link #entrySet()}, you may wish to override 1810888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link #pollLastEntry()} to forward to this implementation. 1820888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 1830888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected Entry<E> standardPollLastEntry() { 1840888a09821a98ac0680fad765217302858e70fa4Paul Duffin Iterator<Entry<E>> entryIterator = descendingMultiset() 1850888a09821a98ac0680fad765217302858e70fa4Paul Duffin .entrySet() 1860888a09821a98ac0680fad765217302858e70fa4Paul Duffin .iterator(); 1870888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (!entryIterator.hasNext()) { 1880888a09821a98ac0680fad765217302858e70fa4Paul Duffin return null; 1890888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1900888a09821a98ac0680fad765217302858e70fa4Paul Duffin Entry<E> entry = entryIterator.next(); 1910888a09821a98ac0680fad765217302858e70fa4Paul Duffin entry = Multisets.immutableEntry(entry.getElement(), entry.getCount()); 1920888a09821a98ac0680fad765217302858e70fa4Paul Duffin entryIterator.remove(); 1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin return entry; 1940888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1950888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1970888a09821a98ac0680fad765217302858e70fa4Paul Duffin public SortedMultiset<E> headMultiset(E upperBound, BoundType boundType) { 1980888a09821a98ac0680fad765217302858e70fa4Paul Duffin return delegate().headMultiset(upperBound, boundType); 1990888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2000888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2010888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 2020888a09821a98ac0680fad765217302858e70fa4Paul Duffin public SortedMultiset<E> subMultiset( 2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType) { 2040888a09821a98ac0680fad765217302858e70fa4Paul Duffin return delegate().subMultiset(lowerBound, lowerBoundType, upperBound, upperBoundType); 2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2060888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2070888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 2080888a09821a98ac0680fad765217302858e70fa4Paul Duffin * A sensible definition of {@link #subMultiset(Object, BoundType, Object, BoundType)} in terms 2090888a09821a98ac0680fad765217302858e70fa4Paul Duffin * of {@link #headMultiset(Object, BoundType) headMultiset} and 2100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link #tailMultiset(Object, BoundType) tailMultiset}. 2110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 2120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * If you override either of these methods, you may wish to override 2130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link #subMultiset(Object, BoundType, Object, BoundType)} to forward to this implementation. 2140888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 2150888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected SortedMultiset<E> standardSubMultiset( 2160888a09821a98ac0680fad765217302858e70fa4Paul Duffin E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType) { 2170888a09821a98ac0680fad765217302858e70fa4Paul Duffin return tailMultiset(lowerBound, lowerBoundType).headMultiset(upperBound, upperBoundType); 2180888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2190888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2200888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 2210888a09821a98ac0680fad765217302858e70fa4Paul Duffin public SortedMultiset<E> tailMultiset(E lowerBound, BoundType boundType) { 2220888a09821a98ac0680fad765217302858e70fa4Paul Duffin return delegate().tailMultiset(lowerBound, boundType); 2230888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2240888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2250888a09821a98ac0680fad765217302858e70fa4Paul Duffin} 226