11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2010 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 Bringertimport static com.google.common.base.Preconditions.checkNotNull; 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A transforming wrapper around an ImmutableList. For internal use only. {@link 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #transform(Object)} must be functional. 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@SuppressWarnings("serial") // uses writeReplace(), not default serialization 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertabstract class TransformedImmutableList<D, E> extends ImmutableList<E> { 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private class TransformedView extends TransformedImmutableList<D, E> { 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TransformedView(ImmutableList<D> backingList) { 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(backingList); 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override E transform(D d) { 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return TransformedImmutableList.this.transform(d); 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private transient final ImmutableList<D> backingList; 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TransformedImmutableList(ImmutableList<D> backingList) { 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.backingList = checkNotNull(backingList); 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert abstract E transform(D d); 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int indexOf(@Nullable Object object) { 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (object == null) { 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return -1; 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i < size(); i++) { 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (get(i).equals(object)) { 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return i; 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return -1; 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int lastIndexOf(@Nullable Object object) { 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (object == null) { 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return -1; 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = size() - 1; i >= 0; i--) { 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (get(i).equals(object)) { 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return i; 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return -1; 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public E get(int index) { 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return transform(backingList.get(index)); 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public UnmodifiableListIterator<E> listIterator(int index) { 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new AbstractIndexedListIterator<E>(size(), index) { 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected E get(int index) { 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return TransformedImmutableList.this.get(index); 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int size() { 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return backingList.size(); 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public ImmutableList<E> subList(int fromIndex, int toIndex) { 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new TransformedView(backingList.subList(fromIndex, toIndex)); 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object obj) { 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (obj == this) { 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (obj instanceof List) { 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<?> list = (List<?>) obj; 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return size() == list.size() 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert && Iterators.elementsEqual(iterator(), list.iterator()); 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int hashCode() { 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int hashCode = 1; 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (E e : this) { 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert hashCode = 31 * hashCode + (e == null ? 0 : e.hashCode()); 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return hashCode; 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Object[] toArray() { 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ObjectArrays.toArrayImpl(this); 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public <T> T[] toArray(T[] array) { 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ObjectArrays.toArrayImpl(this, array); 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override boolean isPartialView() { 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 129