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 static com.google.common.base.Preconditions.checkArgument; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkElementIndex; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkPositionIndex; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkPositionIndexes; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkState; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.VisibleForTesting; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Function; 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Objects; 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.primitives.Ints; 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable; 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.AbstractList; 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.AbstractSequentialList; 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ArrayList; 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays; 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection; 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections; 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator; 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.LinkedList; 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List; 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ListIterator; 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.NoSuchElementException; 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.RandomAccess; 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable; 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Static utility methods pertaining to {@link List} instances. Also see this 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * class's counterparts {@link Sets} and {@link Maps}. 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Mike Bostock 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 (imported from Google Collections Library) 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic final class Lists { 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private Lists() {} 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // ArrayList 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a <i>mutable</i>, empty {@code ArrayList} instance. 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if mutability is not required, use {@link 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ImmutableList#of()} instead. 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, empty {@code ArrayList} 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtCompatible(serializable = true) 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ArrayList<E> newArrayList() { 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new ArrayList<E>(); 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a <i>mutable</i> {@code ArrayList} instance containing the given 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * elements. 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if mutability is not required and the elements are 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * non-null, use an overload of {@link ImmutableList#of()} (for varargs) or 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link ImmutableList#copyOf(Object[])} (for an array) instead. 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param elements the elements that the list should contain, in order 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new {@code ArrayList} containing those elements 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtCompatible(serializable = true) 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ArrayList<E> newArrayList(E... elements) { 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(elements); // for GWT 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Avoid integer overflow when a large array is passed in 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int capacity = computeArrayListCapacity(elements.length); 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ArrayList<E> list = new ArrayList<E>(capacity); 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collections.addAll(list, elements); 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return list; 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @VisibleForTesting static int computeArrayListCapacity(int arraySize) { 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkArgument(arraySize >= 0); 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // TODO(kevinb): Figure out the right behavior, and document it 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Ints.saturatedCast(5L + arraySize + (arraySize / 10)); 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a <i>mutable</i> {@code ArrayList} instance containing the given 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * elements. 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if mutability is not required and the elements are 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * non-null, use {@link ImmutableList#copyOf(Iterator)} instead. 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param elements the elements that the list should contain, in order 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new {@code ArrayList} containing those elements 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtCompatible(serializable = true) 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) { 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(elements); // for GWT 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Let ArrayList's sizing logic work, if possible 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (elements instanceof Collection) 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ? new ArrayList<E>(Collections2.cast(elements)) 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert : newArrayList(elements.iterator()); 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a <i>mutable</i> {@code ArrayList} instance containing the given 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * elements. 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if mutability is not required and the elements are 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * non-null, use {@link ImmutableList#copyOf(Iterator)} instead. 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param elements the elements that the list should contain, in order 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new {@code ArrayList} containing those elements 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtCompatible(serializable = true) 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ArrayList<E> newArrayList(Iterator<? extends E> elements) { 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(elements); // for GWT 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ArrayList<E> list = newArrayList(); 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert while (elements.hasNext()) { 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert list.add(elements.next()); 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return list; 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates an {@code ArrayList} instance backed by an array of the 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <i>exact</i> size specified; equivalent to 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link ArrayList#ArrayList(int)}. 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if you know the exact size your list will be, consider 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * using a fixed-size list ({@link Arrays#asList(Object[])}) or an {@link 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ImmutableList} instead of a growable {@link ArrayList}. 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> If you have only an <i>estimate</i> of the eventual size of 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the list, consider padding this estimate by a suitable amount, or simply 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * use {@link #newArrayListWithExpectedSize(int)} instead. 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param initialArraySize the exact size of the initial backing array for 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the returned array list ({@code ArrayList} documentation calls this 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * value the "capacity") 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, empty {@code ArrayList} which is guaranteed not to resize 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * itself unless its size reaches {@code initialArraySize + 1} 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IllegalArgumentException if {@code initialArraySize} is negative 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtCompatible(serializable = true) 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ArrayList<E> newArrayListWithCapacity( 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialArraySize) { 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkArgument(initialArraySize >= 0); // for GWT. 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new ArrayList<E>(initialArraySize); 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates an {@code ArrayList} instance sized appropriately to hold an 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <i>estimated</i> number of elements without resizing. A small amount of 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * padding is added in case the estimate is low. 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> If you know the <i>exact</i> number of elements the list 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * will hold, or prefer to calculate your own amount of padding, refer to 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #newArrayListWithCapacity(int)}. 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param estimatedSize an estimate of the eventual {@link List#size()} of 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the new list 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, empty {@code ArrayList}, sized appropriately to hold the 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * estimated number of elements 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IllegalArgumentException if {@code estimatedSize} is negative 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtCompatible(serializable = true) 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ArrayList<E> newArrayListWithExpectedSize( 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int estimatedSize) { 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new ArrayList<E>(computeArrayListCapacity(estimatedSize)); 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // LinkedList 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates an empty {@code LinkedList} instance. 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if you need an immutable empty {@link List}, use 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link ImmutableList#of()} instead. 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, empty {@code LinkedList} 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtCompatible(serializable = true) 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> LinkedList<E> newLinkedList() { 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new LinkedList<E>(); 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a {@code LinkedList} instance containing the given elements. 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param elements the elements that the list should contain, in order 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new {@code LinkedList} containing those elements 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtCompatible(serializable = true) 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> LinkedList<E> newLinkedList( 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterable<? extends E> elements) { 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LinkedList<E> list = newLinkedList(); 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (E element : elements) { 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert list.add(element); 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return list; 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an unmodifiable list containing the specified first element and 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * backed by the specified array of additional elements. Changes to the {@code 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * rest} array will be reflected in the returned list. Unlike {@link 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Arrays#asList}, the returned list is unmodifiable. 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This is useful when a varargs method needs to use a signature such as 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code (Foo firstFoo, Foo... moreFoos)}, in order to avoid overload 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ambiguity or to enforce a minimum argument count. 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The returned list is serializable and implements {@link RandomAccess}. 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param first the first element 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param rest an array of additional elements, possibly empty 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return an unmodifiable list containing the specified elements 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> List<E> asList(@Nullable E first, E[] rest) { 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new OnePlusArrayList<E>(first, rest); 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** @see Lists#asList(Object, Object[]) */ 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class OnePlusArrayList<E> extends AbstractList<E> 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert implements Serializable, RandomAccess { 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final E first; 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final E[] rest; 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert OnePlusArrayList(@Nullable E first, E[] rest) { 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.first = first; 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.rest = checkNotNull(rest); 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int size() { 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return rest.length + 1; 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public E get(int index) { 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // check explicitly so the IOOBE will have the right message 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkElementIndex(index, size()); 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (index == 0) ? first : rest[index - 1]; 2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an unmodifiable list containing the specified first and second 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * element, and backed by the specified array of additional elements. Changes 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * to the {@code rest} array will be reflected in the returned list. Unlike 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link Arrays#asList}, the returned list is unmodifiable. 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This is useful when a varargs method needs to use a signature such as 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code (Foo firstFoo, Foo secondFoo, Foo... moreFoos)}, in order to avoid 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * overload ambiguity or to enforce a minimum argument count. 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The returned list is serializable and implements {@link RandomAccess}. 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param first the first element 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param second the second element 2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param rest an array of additional elements, possibly empty 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return an unmodifiable list containing the specified elements 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> List<E> asList( 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Nullable E first, @Nullable E second, E[] rest) { 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new TwoPlusArrayList<E>(first, second, rest); 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** @see Lists#asList(Object, Object, Object[]) */ 2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class TwoPlusArrayList<E> extends AbstractList<E> 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert implements Serializable, RandomAccess { 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final E first; 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final E second; 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final E[] rest; 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TwoPlusArrayList(@Nullable E first, @Nullable E second, E[] rest) { 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.first = first; 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.second = second; 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.rest = checkNotNull(rest); 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int size() { 2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return rest.length + 2; 3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public E get(int index) { 3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert switch (index) { 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case 0: 3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return first; 3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case 1: 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return second; 3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert default: 3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // check explicitly so the IOOBE will have the right message 3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkElementIndex(index, size()); 3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return rest[index - 2]; 3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a list that applies {@code function} to each element of {@code 3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * fromList}. The returned list is a transformed view of {@code fromList}; 3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * changes to {@code fromList} will be reflected in the returned list and vice 3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * versa. 3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Since functions are not reversible, the transform is one-way and new 3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * items cannot be stored in the returned list. The {@code add}, 3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code addAll} and {@code set} methods are unsupported in the returned 3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * list. 3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The function is applied lazily, invoked when needed. This is necessary 3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * for the returned list to be a view, but it means that the function will be 3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * applied many times for bulk operations like {@link List#contains} and 3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link List#hashCode}. For this to perform well, {@code function} should be 3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * fast. To avoid lazy evaluation when the returned list doesn't need to be a 3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * view, copy the returned list into a new list of your choosing. 3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>If {@code fromList} implements {@link RandomAccess}, so will the 3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * returned list. The returned list always implements {@link Serializable}, 3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * but serialization will succeed only when {@code fromList} and 3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code function} are serializable. The returned list is threadsafe if the 3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * supplied list and function are. 3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>If only a {@code Collection} or {@code Iterable} input is available, use 3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link Collections2#transform} or {@link Iterables#transform}. 3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <F, T> List<T> transform( 3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<F> fromList, Function<? super F, ? extends T> function) { 3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (fromList instanceof RandomAccess) 3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ? new TransformingRandomAccessList<F, T>(fromList, function) 3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert : new TransformingSequentialList<F, T>(fromList, function); 3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Implementation of a sequential transforming list. 3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @see Lists#transform 3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class TransformingSequentialList<F, T> 3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends AbstractSequentialList<T> implements Serializable { 3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final List<F> fromList; 3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Function<? super F, ? extends T> function; 3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TransformingSequentialList( 3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<F> fromList, Function<? super F, ? extends T> function) { 3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.fromList = checkNotNull(fromList); 3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.function = checkNotNull(function); 3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * The default implementation inherited is based on iteration and removal of 3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * each element which can be overkill. That's why we forward this call 3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * directly to the backing list. 3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public void clear() { 3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fromList.clear(); 3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int size() { 3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return fromList.size(); 3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public ListIterator<T> listIterator(final int index) { 3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ListIterator<F> delegate = fromList.listIterator(index); 3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new ListIterator<T>() { 3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void add(T e) { 3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new UnsupportedOperationException(); 3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean hasNext() { 3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate.hasNext(); 3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean hasPrevious() { 3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate.hasPrevious(); 3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public T next() { 3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return function.apply(delegate.next()); 3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int nextIndex() { 4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate.nextIndex(); 4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public T previous() { 4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return function.apply(delegate.previous()); 4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int previousIndex() { 4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate.previousIndex(); 4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void remove() { 4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert delegate.remove(); 4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void set(T e) { 4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new UnsupportedOperationException("not supported"); 4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Implementation of a transforming random access list. We try to make as many 4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * of these methods pass-through to the source list as possible so that the 4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * performance characteristics of the source list and transformed list are 4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * similar. 4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @see Lists#transform 4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class TransformingRandomAccessList<F, T> 4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends AbstractList<T> implements RandomAccess, Serializable { 4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final List<F> fromList; 4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Function<? super F, ? extends T> function; 4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TransformingRandomAccessList( 4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<F> fromList, Function<? super F, ? extends T> function) { 4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.fromList = checkNotNull(fromList); 4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.function = checkNotNull(function); 4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public void clear() { 4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fromList.clear(); 4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public T get(int index) { 4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return function.apply(fromList.get(index)); 4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean isEmpty() { 4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return fromList.isEmpty(); 4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public T remove(int index) { 4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return function.apply(fromList.remove(index)); 4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int size() { 4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return fromList.size(); 4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns consecutive {@linkplain List#subList(int, int) sublists} of a list, 4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * each of the same size (the final list may be smaller). For example, 4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * partitioning a list containing {@code [a, b, c, d, e]} with a partition 4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * size of 3 yields {@code [[a, b, c], [d, e]]} -- an outer list containing 4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * two inner lists of three and two elements, all in the original order. 4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The outer list is unmodifiable, but reflects the latest state of the 4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * source list. The inner lists are sublist views of the original list, 4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * produced on demand using {@link List#subList(int, int)}, and are subject 4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * to all the usual caveats about modification as explained in that API. 4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param list the list to return consecutive sublists of 4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param size the desired size of each sublist (the last may be 4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * smaller) 4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a list of consecutive sublists 4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IllegalArgumentException if {@code partitionSize} is nonpositive 4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <T> List<List<T>> partition(List<T> list, int size) { 4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(list); 4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkArgument(size > 0); 4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (list instanceof RandomAccess) 4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ? new RandomAccessPartition<T>(list, size) 4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert : new Partition<T>(list, size); 4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class Partition<T> extends AbstractList<List<T>> { 4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final List<T> list; 4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final int size; 4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Partition(List<T> list, int size) { 4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.list = list; 4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.size = size; 4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public List<T> get(int index) { 5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int listSize = size(); 5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkElementIndex(index, listSize); 5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int start = index * size; 5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int end = Math.min(start + size, list.size()); 5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return list.subList(start, end); 5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int size() { 5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // TODO(user): refactor to common.math.IntMath.divide 5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int result = list.size() / size; 5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (result * size != list.size()) { 5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert result++; 5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return result; 5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean isEmpty() { 5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return list.isEmpty(); 5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class RandomAccessPartition<T> extends Partition<T> 5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert implements RandomAccess { 5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert RandomAccessPartition(List<T> list, int size) { 5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(list, size); 5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a view of the specified string as an immutable list of {@code 5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Character} values. 5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Beta public static ImmutableList<Character> charactersOf(String string) { 5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new StringAsImmutableList(checkNotNull(string)); 5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("serial") // serialized using ImmutableList serialization 5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final class StringAsImmutableList 5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends ImmutableList<Character> { 5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final String string; 5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringAsImmutableList(String string) { 5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.string = string; 5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean contains(@Nullable Object object) { 5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return indexOf(object) >= 0; 5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int indexOf(@Nullable Object object) { 5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (object instanceof Character) 5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ? string.indexOf((Character) object) : -1; 5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int lastIndexOf(@Nullable Object object) { 5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (object instanceof Character) 5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ? string.lastIndexOf((Character) object) : -1; 5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public UnmodifiableListIterator<Character> listIterator( 5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int index) { 5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new AbstractIndexedListIterator<Character>(size(), index) { 5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Character get(int index) { 5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return string.charAt(index); 5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public ImmutableList<Character> subList( 5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int fromIndex, int toIndex) { 5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return charactersOf(string.substring(fromIndex, toIndex)); 5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override boolean isPartialView() { 5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Character get(int index) { 5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return string.charAt(index); 5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int size() { 5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return string.length(); 5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object obj) { 5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!(obj instanceof List)) { 5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<?> list = (List<?>) obj; 5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int n = string.length(); 5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (n != list.size()) { 5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterator<?> iterator = list.iterator(); 5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i < n; i++) { 6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object elem = iterator.next(); 6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!(elem instanceof Character) 6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert || ((Character) elem).charValue() != string.charAt(i)) { 6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int hash = 0; 6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int hashCode() { 6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int h = hash; 6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (h == 0) { 6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert h = 1; 6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i < string.length(); i++) { 6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert h = h * 31 + string.charAt(i); 6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert hash = h; 6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return h; 6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a view of the specified {@code CharSequence} as a {@code 6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * List<Character>}, viewing {@code sequence} as a sequence of Unicode code 6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * units. The view does not support any modification operations, but reflects 6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * any changes to the underlying character sequence. 6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param sequence the character sequence to view as a {@code List} of 6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * characters 6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return an {@code List<Character>} view of the character sequence 6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Beta public static List<Character> charactersOf(CharSequence sequence) { 6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new CharSequenceAsList(checkNotNull(sequence)); 6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final class CharSequenceAsList 6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends AbstractList<Character> { 6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final CharSequence sequence; 6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CharSequenceAsList(CharSequence sequence) { 6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.sequence = sequence; 6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Character get(int index) { 6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return sequence.charAt(index); 6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean contains(@Nullable Object o) { 6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return indexOf(o) >= 0; 6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int indexOf(@Nullable Object o) { 6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (o instanceof Character) { 6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert char c = (Character) o; 6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i < sequence.length(); i++) { 6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (sequence.charAt(i) == c) { 6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return i; 6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return -1; 6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int lastIndexOf(@Nullable Object o) { 6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (o instanceof Character) { 6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert char c = ((Character) o).charValue(); 6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = sequence.length() - 1; i >= 0; i--) { 6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (sequence.charAt(i) == c) { 6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return i; 6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return -1; 6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int size() { 6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return sequence.length(); 6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public List<Character> subList(int fromIndex, int toIndex) { 6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return charactersOf(sequence.subSequence(fromIndex, toIndex)); 6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int hashCode() { 6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int hash = 1; 6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i < sequence.length(); i++) { 6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert hash = hash * 31 + sequence.charAt(i); 6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return hash; 6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object o) { 6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!(o instanceof List)) { 6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<?> list = (List<?>) o; 7001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int n = sequence.length(); 7011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (n != list.size()) { 7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterator<?> iterator = list.iterator(); 7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i < n; i++) { 7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object elem = iterator.next(); 7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!(elem instanceof Character) 7081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert || ((Character) elem).charValue() != sequence.charAt(i)) { 7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a reversed view of the specified list. For example, {@code 7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Lists.reverse(Arrays.asList(1, 2, 3))} returns a list containing {@code 3, 7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2, 1}. The returned list is backed by this list, so changes in the returned 7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * list are reflected in this list, and vice-versa. The returned list supports 7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * all of the optional list operations supported by this list. 7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The returned list is random-access if the specified list is random 7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * access. 7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <T> List<T> reverse(List<T> list) { 7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (list instanceof ReverseList) { 7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ((ReverseList<T>) list).getForwardList(); 7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else if (list instanceof RandomAccess) { 7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new RandomAccessReverseList<T>(list); 7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new ReverseList<T>(list); 7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class ReverseList<T> extends AbstractList<T> { 7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final List<T> forwardList; 7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ReverseList(List<T> forwardList) { 7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.forwardList = checkNotNull(forwardList); 7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<T> getForwardList() { 7461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardList; 7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private int reverseIndex(int index) { 7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int size = size(); 7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkElementIndex(index, size); 7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (size - 1) - index; 7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private int reversePosition(int index) { 7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int size = size(); 7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkPositionIndex(index, size); 7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return size - index; 7591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public void add(int index, @Nullable T element) { 7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forwardList.add(reversePosition(index), element); 7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public void clear() { 7661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forwardList.clear(); 7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public T remove(int index) { 7701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardList.remove(reverseIndex(index)); 7711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected void removeRange(int fromIndex, int toIndex) { 7741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert subList(fromIndex, toIndex).clear(); 7751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public T set(int index, @Nullable T element) { 7781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardList.set(reverseIndex(index), element); 7791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public T get(int index) { 7821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardList.get(reverseIndex(index)); 7831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean isEmpty() { 7861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardList.isEmpty(); 7871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int size() { 7901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardList.size(); 7911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean contains(@Nullable Object o) { 7941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardList.contains(o); 7951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean containsAll(Collection<?> c) { 7981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardList.containsAll(c); 7991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public List<T> subList(int fromIndex, int toIndex) { 8021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkPositionIndexes(fromIndex, toIndex, size()); 8031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return reverse(forwardList.subList( 8041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert reversePosition(toIndex), reversePosition(fromIndex))); 8051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int indexOf(@Nullable Object o) { 8081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int index = forwardList.lastIndexOf(o); 8091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (index >= 0) ? reverseIndex(index) : -1; 8101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int lastIndexOf(@Nullable Object o) { 8131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int index = forwardList.indexOf(o); 8141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (index >= 0) ? reverseIndex(index) : -1; 8151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Iterator<T> iterator() { 8181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return listIterator(); 8191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public ListIterator<T> listIterator(int index) { 8221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int start = reversePosition(index); 8231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ListIterator<T> forwardIterator = forwardList.listIterator(start); 8241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new ListIterator<T>() { 8251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean canRemove; 8271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean canSet; 8281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public void add(T e) { 8301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forwardIterator.add(e); 8311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forwardIterator.previous(); 8321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert canSet = canRemove = false; 8331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean hasNext() { 8361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardIterator.hasPrevious(); 8371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean hasPrevious() { 8401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardIterator.hasNext(); 8411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public T next() { 8441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!hasNext()) { 8451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new NoSuchElementException(); 8461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert canSet = canRemove = true; 8481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardIterator.previous(); 8491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int nextIndex() { 8521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return reversePosition(forwardIterator.nextIndex()); 8531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public T previous() { 8561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!hasPrevious()) { 8571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new NoSuchElementException(); 8581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert canSet = canRemove = true; 8601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return forwardIterator.next(); 8611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int previousIndex() { 8641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return nextIndex() - 1; 8651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public void remove() { 8681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkState(canRemove); 8691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forwardIterator.remove(); 8701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert canRemove = canSet = false; 8711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public void set(T e) { 8741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkState(canSet); 8751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert forwardIterator.set(e); 8761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 8781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class RandomAccessReverseList<T> extends ReverseList<T> 8821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert implements RandomAccess { 8831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert RandomAccessReverseList(List<T> forwardList) { 8841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(forwardList); 8851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 8891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An implementation of {@link List#hashCode()}. 8901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 8911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static int hashCodeImpl(List<?> list){ 8921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int hashCode = 1; 8931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Object o : list) { 8941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert hashCode = 31 * hashCode + (o == null ? 0 : o.hashCode()); 8951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return hashCode; 8971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 9001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An implementation of {@link List#equals(Object)}. 9011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 9021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static boolean equalsImpl(List<?> list, @Nullable Object object) { 9031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (object == checkNotNull(list)) { 9041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 9051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!(object instanceof List)) { 9071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 9081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<?> o = (List<?>) object; 9111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return list.size() == o.size() 9131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert && Iterators.elementsEqual(list.iterator(), o.iterator()); 9141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 9171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An implementation of {@link List#addAll(int, Collection)}. 9181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 9191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static <E> boolean addAllImpl( 9201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<E> list, int index, Iterable<? extends E> elements) { 9211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean changed = false; 9221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ListIterator<E> listIterator = list.listIterator(index); 9231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (E e : elements) { 9241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert listIterator.add(e); 9251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert changed = true; 9261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return changed; 9281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 9311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An implementation of {@link List#indexOf(Object)}. 9321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 9331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static int indexOfImpl(List<?> list, @Nullable Object element){ 9341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ListIterator<?> listIterator = list.listIterator(); 9351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert while (listIterator.hasNext()) { 9361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (Objects.equal(element, listIterator.next())) { 9371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return listIterator.previousIndex(); 9381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return -1; 9411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 9441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An implementation of {@link List#lastIndexOf(Object)}. 9451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 9461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static int lastIndexOfImpl(List<?> list, @Nullable Object element){ 9471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ListIterator<?> listIterator = list.listIterator(list.size()); 9481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert while (listIterator.hasPrevious()) { 9491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (Objects.equal(element, listIterator.previous())) { 9501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return listIterator.nextIndex(); 9511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return -1; 9541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 9571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an implementation of {@link List#listIterator(int)}. 9581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 9591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static <E> ListIterator<E> listIteratorImpl(List<E> list, int index) { 9601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new AbstractListWrapper<E>(list).listIterator(index); 9611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 9641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An implementation of {@link List#subList(int, int)}. 9651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 9661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static <E> List<E> subListImpl( 9671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final List<E> list, int fromIndex, int toIndex) { 9681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<E> wrapper; 9691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (list instanceof RandomAccess) { 9701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert wrapper = new RandomAccessListWrapper<E>(list) { 9711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public ListIterator<E> listIterator(int index) { 9721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return backingList.listIterator(index); 9731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 9761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 9771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 9781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert wrapper = new AbstractListWrapper<E>(list) { 9791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public ListIterator<E> listIterator(int index) { 9801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return backingList.listIterator(index); 9811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 9841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 9851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return wrapper.subList(fromIndex, toIndex); 9871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class AbstractListWrapper<E> extends AbstractList<E> { 9901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final List<E> backingList; 9911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AbstractListWrapper(List<E> backingList) { 9931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.backingList = checkNotNull(backingList); 9941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public void add(int index, E element) { 9971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert backingList.add(index, element); 9981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean addAll(int index, Collection<? extends E> c) { 10011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return backingList.addAll(index, c); 10021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public E get(int index) { 10051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return backingList.get(index); 10061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public E remove(int index) { 10091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return backingList.remove(index); 10101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public E set(int index, E element) { 10131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return backingList.set(index, element); 10141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean contains(Object o) { 10171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return backingList.contains(o); 10181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int size() { 10211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return backingList.size(); 10221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class RandomAccessListWrapper<E> 10261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends AbstractListWrapper<E> implements RandomAccess { 10271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert RandomAccessListWrapper(List<E> backingList) { 10281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(backingList); 10291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 1032