1090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors
3090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson *
4090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * you may not use this file except in compliance with the License.
6090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * You may obtain a copy of the License at
7090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson *
8090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0
9090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson *
10090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Unless required by applicable law or agreed to in writing, software
11090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * See the License for the specific language governing permissions and
14090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * limitations under the License.
15090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */
16090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
17090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonpackage com.google.common.collect;
18090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.base.Preconditions.checkElementIndex;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull;
217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.base.Preconditions.checkPositionIndexes;
220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.ObjectArrays.arraysCopyOf;
230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.ObjectArrays.checkElementsNotNull;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
25090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport com.google.common.annotations.GwtCompatible;
26090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
27090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.io.InvalidObjectException;
28090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.io.ObjectInputStream;
29090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.io.Serializable;
30090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.Collection;
31090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.Iterator;
32090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.List;
33090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.RandomAccess;
34090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
35090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport javax.annotation.Nullable;
36090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
37090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson/**
38090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * A high-performance, immutable, random-access {@code List} implementation.
39090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Does not permit null elements.
40090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson *
41090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * <p>Unlike {@link Collections#unmodifiableList}, which is a <i>view</i> of a
42090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * separate collection that can still change, an instance of {@code
43090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * ImmutableList} contains its own private data and will <i>never</i> change.
44090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * {@code ImmutableList} is convenient for {@code public static final} lists
45090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * ("constant lists") and also lets you easily make a "defensive copy" of a list
46090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * provided to your class by a caller.
47090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson *
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> Although this class is not final, it cannot be subclassed as
49090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * it has no public or protected constructors. Thus, instances of this type are
50090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * guaranteed to be immutable.
51090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson *
527dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>See the Guava User Guide article on <a href=
537dd252788645e940eada959bdde927426e2531c9Paul Duffin * "http://code.google.com/p/guava-libraries/wiki/ImmutableCollectionsExplained">
547dd252788645e940eada959bdde927426e2531c9Paul Duffin * immutable collections</a>.
557dd252788645e940eada959bdde927426e2531c9Paul Duffin *
56090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @see ImmutableMap
57090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @see ImmutableSet
58090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @author Kevin Bourrillion
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 (imported from Google Collections Library)
60090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(serializable = true, emulated = true)
620888a09821a98ac0680fad765217302858e70fa4Paul Duffin@SuppressWarnings("serial") // we're overriding default serialization
630888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic abstract class ImmutableList<E> extends ImmutableCollection<E>
640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    implements List<E>, RandomAccess {
650888a09821a98ac0680fad765217302858e70fa4Paul Duffin
660888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static final ImmutableList<Object> EMPTY =
670888a09821a98ac0680fad765217302858e70fa4Paul Duffin      new RegularImmutableList<Object>(ObjectArrays.EMPTY_ARRAY);
680888a09821a98ac0680fad765217302858e70fa4Paul Duffin
69090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
70090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns the empty immutable list. This set behaves and performs comparably
71090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * to {@link Collections#emptyList}, and is preferable mainly for consistency
72090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * and maintainability of your code.
73090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
74090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  // Casting to any type is safe because the list will never hold any elements.
75090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  @SuppressWarnings("unchecked")
76090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <E> ImmutableList<E> of() {
770888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return (ImmutableList<E>) EMPTY;
78090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
79090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
80090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
81090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns an immutable list containing a single element. This list behaves
82090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * and performs comparably to {@link Collections#singleton}, but will not
83090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * accept a null element. It is preferable mainly for consistency and
84090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * maintainability of your code.
85090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
86090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws NullPointerException if {@code element} is null
87090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
88090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <E> ImmutableList<E> of(E element) {
89090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return new SingletonImmutableList<E>(element);
90090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
91090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
92090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable list containing the given elements, in order.
94090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
95090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws NullPointerException if any element is null
96090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
97090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <E> ImmutableList<E> of(E e1, E e2) {
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return construct(e1, e2);
99090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
100090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
101090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable list containing the given elements, in order.
103090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
104090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws NullPointerException if any element is null
105090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
106090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <E> ImmutableList<E> of(E e1, E e2, E e3) {
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return construct(e1, e2, e3);
108090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
109090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
110090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable list containing the given elements, in order.
112090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
113090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws NullPointerException if any element is null
114090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
115090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <E> ImmutableList<E> of(E e1, E e2, E e3, E e4) {
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return construct(e1, e2, e3, e4);
117090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
118090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
119090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable list containing the given elements, in order.
121090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
122090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws NullPointerException if any element is null
123090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
124090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <E> ImmutableList<E> of(E e1, E e2, E e3, E e4, E e5) {
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return construct(e1, e2, e3, e4, e5);
126090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
127090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
128090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable list containing the given elements, in order.
130090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
131090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws NullPointerException if any element is null
132090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
133090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <E> ImmutableList<E> of(E e1, E e2, E e3, E e4, E e5, E e6) {
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return construct(e1, e2, e3, e4, e5, e6);
135090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
136090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
137090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable list containing the given elements, in order.
139090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
140090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws NullPointerException if any element is null
141090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <E> ImmutableList<E> of(
1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin      E e1, E e2, E e3, E e4, E e5, E e6, E e7) {
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return construct(e1, e2, e3, e4, e5, e6, e7);
145090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
146090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
147090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable list containing the given elements, in order.
149090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
150090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws NullPointerException if any element is null
151090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <E> ImmutableList<E> of(
1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin      E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) {
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return construct(e1, e2, e3, e4, e5, e6, e7, e8);
155090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
156090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
157090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable list containing the given elements, in order.
159090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
160090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws NullPointerException if any element is null
161090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <E> ImmutableList<E> of(
1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin      E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) {
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return construct(e1, e2, e3, e4, e5, e6, e7, e8, e9);
165090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
166090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
167090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable list containing the given elements, in order.
169090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
170090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws NullPointerException if any element is null
171090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <E> ImmutableList<E> of(
1730888a09821a98ac0680fad765217302858e70fa4Paul Duffin      E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) {
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return construct(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);
175090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
176090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
177090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable list containing the given elements, in order.
179090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
180090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws NullPointerException if any element is null
181090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
1820888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <E> ImmutableList<E> of(
1830888a09821a98ac0680fad765217302858e70fa4Paul Duffin      E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10, E e11) {
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return construct(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11);
185090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
186090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
187090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  // These go up to eleven. After that, you just get the varargs form, and
188090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  // whatever warnings might come along with it. :(
189090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
190090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
191090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns an immutable list containing the given elements, in order.
192090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if any element is null
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 3.0 (source-compatible since 2.0)
195090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static <E> ImmutableList<E> of(
1970888a09821a98ac0680fad765217302858e70fa4Paul Duffin      E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10, E e11, E e12,
1980888a09821a98ac0680fad765217302858e70fa4Paul Duffin      E... others) {
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Object[] array = new Object[12 + others.length];
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[0] = e1;
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[1] = e2;
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[2] = e3;
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[3] = e4;
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[4] = e5;
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[5] = e6;
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[6] = e7;
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[7] = e8;
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[8] = e9;
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[9] = e10;
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[10] = e11;
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[11] = e12;
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    System.arraycopy(others, 0, array, 12, others.length);
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return construct(array);
214090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
215090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
216090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
217bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns an immutable list containing the given elements, in order. If
218bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * {@code elements} is a {@link Collection}, this method behaves exactly as
219bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * {@link #copyOf(Collection)}; otherwise, it behaves exactly as {@code
220bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * copyOf(elements.iterator()}.
221bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
222bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * @throws NullPointerException if any of {@code elements} is null
223bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
224bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static <E> ImmutableList<E> copyOf(Iterable<? extends E> elements) {
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(elements); // TODO(kevinb): is this here only for GWT?
2260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return (elements instanceof Collection)
2273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      ? copyOf((Collection<? extends E>) elements)
2280888a09821a98ac0680fad765217302858e70fa4Paul Duffin      : copyOf(elements.iterator());
229bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  }
230bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor
231bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
232bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns an immutable list containing the given elements, in order.
233090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Despite the method name, this method attempts to avoid actually copying
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * the data when it is safe to do so. The exact circumstances under which a
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * copy will or will not be performed are undocumented and subject to change.
237090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
238bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * <p>Note that if {@code list} is a {@code List<String>}, then {@code
239bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * ImmutableList.copyOf(list)} returns an {@code ImmutableList<String>}
240bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * containing each of the strings in {@code list}, while
241bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * ImmutableList.of(list)} returns an {@code ImmutableList<List<String>>}
242bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * containing one element (the given list itself).
243bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
244bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * <p>This method is safe to use even when {@code elements} is a synchronized
245bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * or concurrent collection that is currently being modified by another
246bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * thread.
247bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
248090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws NullPointerException if any of {@code elements} is null
249090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
250bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  public static <E> ImmutableList<E> copyOf(Collection<? extends E> elements) {
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (elements instanceof ImmutableCollection) {
2520888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @SuppressWarnings("unchecked") // all supported methods are covariant
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList<E> list = ((ImmutableCollection<E>) elements).asList();
2540888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return list.isPartialView()
2550888a09821a98ac0680fad765217302858e70fa4Paul Duffin          ? ImmutableList.<E>asImmutableList(list.toArray())
2560888a09821a98ac0680fad765217302858e70fa4Paul Duffin          : list;
257090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
2580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return construct(elements.toArray());
259090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
260090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
261090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
262090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns an immutable list containing the given elements, in order.
263090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
264090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws NullPointerException if any of {@code elements} is null
265090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
266090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <E> ImmutableList<E> copyOf(Iterator<? extends E> elements) {
2677dd252788645e940eada959bdde927426e2531c9Paul Duffin    // We special-case for 0 or 1 elements, but going further is madness.
2687dd252788645e940eada959bdde927426e2531c9Paul Duffin    if (!elements.hasNext()) {
2697dd252788645e940eada959bdde927426e2531c9Paul Duffin      return of();
2707dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2717dd252788645e940eada959bdde927426e2531c9Paul Duffin    E first = elements.next();
2727dd252788645e940eada959bdde927426e2531c9Paul Duffin    if (!elements.hasNext()) {
2737dd252788645e940eada959bdde927426e2531c9Paul Duffin      return of(first);
2747dd252788645e940eada959bdde927426e2531c9Paul Duffin    } else {
2750888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new ImmutableList.Builder<E>()
2760888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .add(first)
2770888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .addAll(elements)
2780888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .build();
2797dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
280090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
281090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an immutable list containing the given elements, in order.
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if any of {@code elements} is null
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 3.0
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <E> ImmutableList<E> copyOf(E[] elements) {
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    switch (elements.length) {
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      case 0:
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return ImmutableList.of();
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      case 1:
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return new SingletonImmutableList<E>(elements[0]);
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      default:
2950888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return new RegularImmutableList<E>(checkElementsNotNull(elements.clone()));
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2997dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
3000888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Views the array as an immutable list.  Checks for nulls; does not copy.
3010888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
3020888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static <E> ImmutableList<E> construct(Object... elements) {
3030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return asImmutableList(checkElementsNotNull(elements));
3040888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
3050888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3060888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
3070888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Views the array as an immutable list.  Does not check for nulls; does not copy.
3087dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
3097dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>The array must be internally created.
3107dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
3117dd252788645e940eada959bdde927426e2531c9Paul Duffin  static <E> ImmutableList<E> asImmutableList(Object[] elements) {
3120888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return asImmutableList(elements, elements.length);
3130888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
3140888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3150888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
3160888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Views the array as an immutable list. Copies if the specified range does not cover the complete
3170888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * array. Does not check for nulls.
3180888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
3190888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static <E> ImmutableList<E> asImmutableList(Object[] elements, int length) {
3200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    switch (length) {
321090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      case 0:
322090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        return of();
323090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      case 1:
3240888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @SuppressWarnings("unchecked") // collection had only Es in it
325bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        ImmutableList<E> list = new SingletonImmutableList<E>((E) elements[0]);
326bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor        return list;
327090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      default:
3280888a09821a98ac0680fad765217302858e70fa4Paul Duffin        if (length < elements.length) {
3290888a09821a98ac0680fad765217302858e70fa4Paul Duffin          elements = arraysCopyOf(elements, length);
3300888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
3310888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return new RegularImmutableList<E>(elements);
332090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
335090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  ImmutableList() {}
336090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
337090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  // This declaration is needed to make List.iterator() and
338090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  // ImmutableCollection.iterator() consistent.
3390888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public UnmodifiableIterator<E> iterator() {
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return listIterator();
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3430888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public UnmodifiableListIterator<E> listIterator() {
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return listIterator(0);
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3470888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public UnmodifiableListIterator<E> listIterator(int index) {
3487dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new AbstractIndexedListIterator<E>(size(), index) {
3497dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
3507dd252788645e940eada959bdde927426e2531c9Paul Duffin      protected E get(int index) {
3517dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ImmutableList.this.get(index);
3527dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
3537dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
3547dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
355090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
3560888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
3577dd252788645e940eada959bdde927426e2531c9Paul Duffin  public int indexOf(@Nullable Object object) {
3587dd252788645e940eada959bdde927426e2531c9Paul Duffin    return (object == null) ? -1 : Lists.indexOfImpl(this, object);
3597dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
3607dd252788645e940eada959bdde927426e2531c9Paul Duffin
3610888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
3627dd252788645e940eada959bdde927426e2531c9Paul Duffin  public int lastIndexOf(@Nullable Object object) {
3637dd252788645e940eada959bdde927426e2531c9Paul Duffin    return (object == null) ? -1 : Lists.lastIndexOfImpl(this, object);
3647dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
365090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
3677dd252788645e940eada959bdde927426e2531c9Paul Duffin  public boolean contains(@Nullable Object object) {
3687dd252788645e940eada959bdde927426e2531c9Paul Duffin    return indexOf(object) >= 0;
3697dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
370090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
371090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  // constrain the return type to ImmutableList<E>
372090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
373090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
374090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns an immutable list of the elements between the specified {@code
375090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * fromIndex}, inclusive, and {@code toIndex}, exclusive. (If {@code
376090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * fromIndex} and {@code toIndex} are equal, the empty immutable list is
377090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * returned.)
378090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
3790888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
3807dd252788645e940eada959bdde927426e2531c9Paul Duffin  public ImmutableList<E> subList(int fromIndex, int toIndex) {
3817dd252788645e940eada959bdde927426e2531c9Paul Duffin    checkPositionIndexes(fromIndex, toIndex, size());
3827dd252788645e940eada959bdde927426e2531c9Paul Duffin    int length = toIndex - fromIndex;
3837dd252788645e940eada959bdde927426e2531c9Paul Duffin    switch (length) {
3847dd252788645e940eada959bdde927426e2531c9Paul Duffin      case 0:
3857dd252788645e940eada959bdde927426e2531c9Paul Duffin        return of();
3867dd252788645e940eada959bdde927426e2531c9Paul Duffin      case 1:
3877dd252788645e940eada959bdde927426e2531c9Paul Duffin        return of(get(fromIndex));
3887dd252788645e940eada959bdde927426e2531c9Paul Duffin      default:
3897dd252788645e940eada959bdde927426e2531c9Paul Duffin        return subListUnchecked(fromIndex, toIndex);
3907dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
3917dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
3927dd252788645e940eada959bdde927426e2531c9Paul Duffin
3937dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
3947dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Called by the default implementation of {@link #subList} when {@code
3957dd252788645e940eada959bdde927426e2531c9Paul Duffin   * toIndex - fromIndex > 1}, after index validation has already been
3967dd252788645e940eada959bdde927426e2531c9Paul Duffin   * performed.
3977dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
3987dd252788645e940eada959bdde927426e2531c9Paul Duffin  ImmutableList<E> subListUnchecked(int fromIndex, int toIndex) {
3997dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new SubList(fromIndex, toIndex - fromIndex);
4007dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
4017dd252788645e940eada959bdde927426e2531c9Paul Duffin
4027dd252788645e940eada959bdde927426e2531c9Paul Duffin  class SubList extends ImmutableList<E> {
4037dd252788645e940eada959bdde927426e2531c9Paul Duffin    transient final int offset;
4047dd252788645e940eada959bdde927426e2531c9Paul Duffin    transient final int length;
4057dd252788645e940eada959bdde927426e2531c9Paul Duffin
4067dd252788645e940eada959bdde927426e2531c9Paul Duffin    SubList(int offset, int length) {
4077dd252788645e940eada959bdde927426e2531c9Paul Duffin      this.offset = offset;
4087dd252788645e940eada959bdde927426e2531c9Paul Duffin      this.length = length;
4097dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4107dd252788645e940eada959bdde927426e2531c9Paul Duffin
4110888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4127dd252788645e940eada959bdde927426e2531c9Paul Duffin    public int size() {
4137dd252788645e940eada959bdde927426e2531c9Paul Duffin      return length;
4147dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4157dd252788645e940eada959bdde927426e2531c9Paul Duffin
4160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
4177dd252788645e940eada959bdde927426e2531c9Paul Duffin    public E get(int index) {
4187dd252788645e940eada959bdde927426e2531c9Paul Duffin      checkElementIndex(index, length);
4197dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableList.this.get(index + offset);
4207dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4217dd252788645e940eada959bdde927426e2531c9Paul Duffin
4227dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
4237dd252788645e940eada959bdde927426e2531c9Paul Duffin    public ImmutableList<E> subList(int fromIndex, int toIndex) {
4247dd252788645e940eada959bdde927426e2531c9Paul Duffin      checkPositionIndexes(fromIndex, toIndex, length);
4257dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableList.this.subList(fromIndex + offset, toIndex + offset);
4267dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4277dd252788645e940eada959bdde927426e2531c9Paul Duffin
4287dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
4297dd252788645e940eada959bdde927426e2531c9Paul Duffin    boolean isPartialView() {
4307dd252788645e940eada959bdde927426e2531c9Paul Duffin      return true;
4317dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4327dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
433090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
434090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
435090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Guaranteed to throw an exception and leave the list unmodified.
436090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
437090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws UnsupportedOperationException always
4387dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @deprecated Unsupported operation.
439090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
4407dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Deprecated
4410888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
442090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public final boolean addAll(int index, Collection<? extends E> newElements) {
443090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    throw new UnsupportedOperationException();
444090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
445090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
446090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
447090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Guaranteed to throw an exception and leave the list unmodified.
448090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
449090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws UnsupportedOperationException always
4507dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @deprecated Unsupported operation.
451090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
4527dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Deprecated
4530888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
454090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public final E set(int index, E element) {
455090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    throw new UnsupportedOperationException();
456090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
457090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
458090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
459090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Guaranteed to throw an exception and leave the list unmodified.
460090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
461090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws UnsupportedOperationException always
4627dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @deprecated Unsupported operation.
463090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
4647dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Deprecated
4650888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
466090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public final void add(int index, E element) {
467090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    throw new UnsupportedOperationException();
468090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
469090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
470090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
471090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Guaranteed to throw an exception and leave the list unmodified.
472090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
473090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @throws UnsupportedOperationException always
4747dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @deprecated Unsupported operation.
475090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
4767dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Deprecated
4770888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
478090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public final E remove(int index) {
479090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    throw new UnsupportedOperationException();
480090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
481090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
482bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor  /**
483bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   * Returns this list instance.
484bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   *
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 2.0
486bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor   */
4870888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public final ImmutableList<E> asList() {
488bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor    return this;
489090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
490090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
4910888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
4920888a09821a98ac0680fad765217302858e70fa4Paul Duffin  int copyIntoArray(Object[] dst, int offset) {
4930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // this loop is faster for RandomAccess instances, which ImmutableLists are
4940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int size = size();
4950888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int i = 0; i < size; i++) {
4960888a09821a98ac0680fad765217302858e70fa4Paul Duffin      dst[offset + i] = get(i);
4970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return offset + size;
4990888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
5000888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a view of this immutable list in reverse order. For example, {@code
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ImmutableList.of(1, 2, 3).reverse()} is equivalent to {@code
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ImmutableList.of(3, 2, 1)}.
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @return a view of this immutable list in reverse order
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 7.0
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public ImmutableList<E> reverse() {
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new ReverseImmutableList<E>(this);
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class ReverseImmutableList<E> extends ImmutableList<E> {
5147dd252788645e940eada959bdde927426e2531c9Paul Duffin    private final transient ImmutableList<E> forwardList;
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ReverseImmutableList(ImmutableList<E> backingList) {
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.forwardList = backingList;
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private int reverseIndex(int index) {
5210888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return (size() - 1) - index;
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private int reversePosition(int index) {
5250888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return size() - index;
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public ImmutableList<E> reverse() {
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return forwardList;
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean contains(@Nullable Object object) {
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return forwardList.contains(object);
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int indexOf(@Nullable Object object) {
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int index = forwardList.lastIndexOf(object);
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (index >= 0) ? reverseIndex(index) : -1;
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int lastIndexOf(@Nullable Object object) {
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int index = forwardList.indexOf(object);
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (index >= 0) ? reverseIndex(index) : -1;
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public ImmutableList<E> subList(int fromIndex, int toIndex) {
5470888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkPositionIndexes(fromIndex, toIndex, size());
5480888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return forwardList.subList(
5490888a09821a98ac0680fad765217302858e70fa4Paul Duffin          reversePosition(toIndex), reversePosition(fromIndex)).reverse();
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5520888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public E get(int index) {
5530888a09821a98ac0680fad765217302858e70fa4Paul Duffin      checkElementIndex(index, size());
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return forwardList.get(reverseIndex(index));
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int size() {
5580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return forwardList.size();
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override boolean isPartialView() {
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return forwardList.isPartialView();
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5657dd252788645e940eada959bdde927426e2531c9Paul Duffin
5660888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public boolean equals(@Nullable Object obj) {
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Lists.equalsImpl(this, obj);
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5700888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override public int hashCode() {
5710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int hashCode = 1;
5720888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int n = size();
5730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int i = 0; i < n; i++) {
5740888a09821a98ac0680fad765217302858e70fa4Paul Duffin      hashCode = 31 * hashCode + get(i).hashCode();
5750888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5760888a09821a98ac0680fad765217302858e70fa4Paul Duffin      hashCode = ~~hashCode;
5770888a09821a98ac0680fad765217302858e70fa4Paul Duffin      // needed to deal with GWT integer overflow
5780888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
5790888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return hashCode;
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
582090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /*
583090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Serializes ImmutableLists as their logical contents. This ensures that
584090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * implementation types do not leak into the serialized representation.
585090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
5860888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static class SerializedForm implements Serializable {
587090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    final Object[] elements;
588090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    SerializedForm(Object[] elements) {
589090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      this.elements = elements;
590090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
591090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    Object readResolve() {
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return copyOf(elements);
593090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
594090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private static final long serialVersionUID = 0;
595090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
596090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
5970888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private void readObject(ObjectInputStream stream)
5980888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throws InvalidObjectException {
599090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    throw new InvalidObjectException("Use SerializedForm");
600090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
601090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
6020888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override Object writeReplace() {
603090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return new SerializedForm(toArray());
604090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
605090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
606090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
607090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a new builder. The generated builder is equivalent to the builder
608090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * created by the {@link Builder} constructor.
609090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
610090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <E> Builder<E> builder() {
611090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return new Builder<E>();
612090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
613090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
614090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A builder for creating immutable list instances, especially {@code public
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * static final} lists ("constant lists"). Example: <pre>   {@code
617090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
618090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *   public static final ImmutableList<Color> GOOGLE_COLORS
619090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *       = new ImmutableList.Builder<Color>()
620090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *           .addAll(WEBSAFE_COLORS)
621090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *           .add(new Color(0, 191, 255))
622090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *           .build();}</pre>
623090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
6240888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * <p>Builder instances can be reused; it is safe to call {@link #build} multiple
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * times to build multiple lists in series. Each new list contains all the
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * elements of the ones created before it.
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 2.0 (imported from Google Collections Library)
629090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
6300888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static final class Builder<E> extends ImmutableCollection.ArrayBasedBuilder<E> {
631090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    /**
632090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * Creates a new builder. The returned builder is equivalent to the builder
633090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * generated by {@link ImmutableList#builder}.
634090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     */
6357dd252788645e940eada959bdde927426e2531c9Paul Duffin    public Builder() {
6367dd252788645e940eada959bdde927426e2531c9Paul Duffin      this(DEFAULT_INITIAL_CAPACITY);
6377dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
6387dd252788645e940eada959bdde927426e2531c9Paul Duffin
6397dd252788645e940eada959bdde927426e2531c9Paul Duffin    // TODO(user): consider exposing this
6407dd252788645e940eada959bdde927426e2531c9Paul Duffin    Builder(int capacity) {
6410888a09821a98ac0680fad765217302858e70fa4Paul Duffin      super(capacity);
6427dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
643090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
644090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    /**
645090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * Adds {@code element} to the {@code ImmutableList}.
646090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     *
647090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * @param element the element to add
648090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * @return this {@code Builder} object
649090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * @throws NullPointerException if {@code element} is null
650090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     */
6510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Builder<E> add(E element) {
6520888a09821a98ac0680fad765217302858e70fa4Paul Duffin      super.add(element);
653090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return this;
654090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
655090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
656090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    /**
657090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * Adds each element of {@code elements} to the {@code ImmutableList}.
658090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     *
659090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * @param elements the {@code Iterable} to add to the {@code ImmutableList}
660090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * @return this {@code Builder} object
661090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * @throws NullPointerException if {@code elements} is null or contains a
662090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     *     null element
663090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     */
6640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Builder<E> addAll(Iterable<? extends E> elements) {
665090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      super.addAll(elements);
666090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return this;
667090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
668090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
669090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    /**
670090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * Adds each element of {@code elements} to the {@code ImmutableList}.
671090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     *
672090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * @param elements the {@code Iterable} to add to the {@code ImmutableList}
673090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * @return this {@code Builder} object
674090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * @throws NullPointerException if {@code elements} is null or contains a
675090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     *     null element
676090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     */
6770888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Builder<E> add(E... elements) {
6780888a09821a98ac0680fad765217302858e70fa4Paul Duffin      super.add(elements);
679090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return this;
680090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
681090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
682090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    /**
683090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * Adds each element of {@code elements} to the {@code ImmutableList}.
684090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     *
685090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * @param elements the {@code Iterable} to add to the {@code ImmutableList}
686090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * @return this {@code Builder} object
687090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * @throws NullPointerException if {@code elements} is null or contains a
688090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     *     null element
689090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     */
6900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public Builder<E> addAll(Iterator<? extends E> elements) {
691090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      super.addAll(elements);
692090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return this;
693090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
694090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
695090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    /**
696090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * Returns a newly-created {@code ImmutableList} based on the contents of
697090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     * the {@code Builder}.
698090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson     */
6990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public ImmutableList<E> build() {
7000888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return asImmutableList(contents, size);
701090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
702090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
703090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson}
704