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 Bringertimport com.google.common.base.Objects; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A collection which forwards all its method calls to another collection. 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Subclasses should override one or more methods to modify the behavior of the 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * backing collection as desired per the <a 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>. 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Warning:</b> The methods of {@code ForwardingCollection} forward 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <b>indiscriminately</b> to the methods of the delegate. For example, 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * overriding {@link #add} alone <b>will not</b> change the behavior of {@link 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #addAll}, which can lead to unexpected behavior. In this case, you should 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * override {@code addAll} as well, either providing your own implementation, or 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * delegating to the provided {@code standardAddAll} method. 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The {@code standard} methods are not guaranteed to be thread-safe, even 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * when all of the methods that they depend on are thread-safe. 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 (imported from Google Collections Library) 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible 480888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic abstract class ForwardingCollection<E> extends ForwardingObject 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin implements Collection<E> { 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // TODO(user): identify places where thread safety is actually lost 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** Constructor for use by subclasses. */ 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected ForwardingCollection() {} 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override protected abstract Collection<E> delegate(); 567dd252788645e940eada959bdde927426e2531c9Paul Duffin 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Iterator<E> iterator() { 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().iterator(); 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int size() { 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().size(); 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean removeAll(Collection<?> collection) { 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().removeAll(collection); 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 720888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean isEmpty() { 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().isEmpty(); 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 770888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean contains(Object object) { 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().contains(object); 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 820888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean add(E element) { 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().add(element); 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean remove(Object object) { 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().remove(object); 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 920888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean containsAll(Collection<?> collection) { 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().containsAll(collection); 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 970888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean addAll(Collection<? extends E> collection) { 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().addAll(collection); 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean retainAll(Collection<?> collection) { 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().retainAll(collection); 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void clear() { 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert delegate().clear(); 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Object[] toArray() { 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().toArray(); 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public <T> T[] toArray(T[] array) { 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().toArray(array); 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #contains} in terms of {@link #iterator}. 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * If you override {@link #iterator}, you may wish to override {@link 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #contains} to forward to this implementation. 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1297dd252788645e940eada959bdde927426e2531c9Paul Duffin protected boolean standardContains(@Nullable Object object) { 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Iterators.contains(iterator(), object); 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #containsAll} in terms of {@link #contains} 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * . If you override {@link #contains}, you may wish to override {@link 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #containsAll} to forward to this implementation. 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1407dd252788645e940eada959bdde927426e2531c9Paul Duffin protected boolean standardContainsAll(Collection<?> collection) { 1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Collections2.containsAllImpl(this, collection); 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #addAll} in terms of {@link #add}. If you 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * override {@link #add}, you may wish to override {@link #addAll} to forward 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * to this implementation. 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1517dd252788645e940eada959bdde927426e2531c9Paul Duffin protected boolean standardAddAll(Collection<? extends E> collection) { 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Iterators.addAll(this, collection.iterator()); 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #remove} in terms of {@link #iterator}, 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * using the iterator's {@code remove} method. If you override {@link 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #iterator}, you may wish to override {@link #remove} to forward to this 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * implementation. 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1637dd252788645e940eada959bdde927426e2531c9Paul Duffin protected boolean standardRemove(@Nullable Object object) { 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterator<E> iterator = iterator(); 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert while (iterator.hasNext()) { 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (Objects.equal(iterator.next(), object)) { 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert iterator.remove(); 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #removeAll} in terms of {@link #iterator}, 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * using the iterator's {@code remove} method. If you override {@link 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #iterator}, you may wish to override {@link #removeAll} to forward to this 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * implementation. 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1827dd252788645e940eada959bdde927426e2531c9Paul Duffin protected boolean standardRemoveAll(Collection<?> collection) { 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Iterators.removeAll(iterator(), collection); 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #retainAll} in terms of {@link #iterator}, 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * using the iterator's {@code remove} method. If you override {@link 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #iterator}, you may wish to override {@link #retainAll} to forward to this 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * implementation. 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1947dd252788645e940eada959bdde927426e2531c9Paul Duffin protected boolean standardRetainAll(Collection<?> collection) { 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Iterators.retainAll(iterator(), collection); 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #clear} in terms of {@link #iterator}, 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * using the iterator's {@code remove} method. If you override {@link 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #iterator}, you may wish to override {@link #clear} to forward to this 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * implementation. 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2067dd252788645e940eada959bdde927426e2531c9Paul Duffin protected void standardClear() { 2077dd252788645e940eada959bdde927426e2531c9Paul Duffin Iterators.clear(iterator()); 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #isEmpty} as {@code !iterator().hasNext}. 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * If you override {@link #isEmpty}, you may wish to override {@link #isEmpty} 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * to forward to this implementation. Alternately, it may be more efficient to 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * implement {@code isEmpty} as {@code size() == 0}. 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2187dd252788645e940eada959bdde927426e2531c9Paul Duffin protected boolean standardIsEmpty() { 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return !iterator().hasNext(); 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #toString} in terms of {@link #iterator}. 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * If you override {@link #iterator}, you may wish to override {@link 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #toString} to forward to this implementation. 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2297dd252788645e940eada959bdde927426e2531c9Paul Duffin protected String standardToString() { 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Collections2.toStringImpl(this); 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #toArray()} in terms of {@link 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #toArray(Object[])}. If you override {@link #toArray(Object[])}, you may 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * wish to override {@link #toArray} to forward to this implementation. 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2407dd252788645e940eada959bdde927426e2531c9Paul Duffin protected Object[] standardToArray() { 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object[] newArray = new Object[size()]; 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return toArray(newArray); 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A sensible definition of {@link #toArray(Object[])} in terms of {@link 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #size} and {@link #iterator}. If you override either of these methods, you 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * may wish to override {@link #toArray} to forward to this implementation. 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2527dd252788645e940eada959bdde927426e2531c9Paul Duffin protected <T> T[] standardToArray(T[] array) { 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ObjectArrays.toArrayImpl(this, array); 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 256