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