Home | History | Annotate | Download | only in collect
      1 /*
      2  * Copyright (C) 2009 The Guava Authors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
      5  * in compliance with the License. You may obtain a copy of the License at
      6  *
      7  * http://www.apache.org/licenses/LICENSE-2.0
      8  *
      9  * Unless required by applicable law or agreed to in writing, software distributed under the
     10  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     11  * express or implied. See the License for the specific language governing permissions and
     12  * limitations under the License.
     13  */
     14 
     15 package com.google.common.collect;
     16 
     17 import com.google.common.base.Preconditions;
     18 
     19 import java.util.Comparator;
     20 
     21 import javax.annotation.Nullable;
     22 
     23 /**
     24  * List returned by {@code ImmutableSortedSet.asList()} when the set isn't empty.
     25  *
     26  * @author Jared Levy
     27  * @author Louis Wasserman
     28  */
     29 @SuppressWarnings("serial")
     30 final class ImmutableSortedAsList<E> extends ImmutableList<E> implements SortedIterable<E> {
     31   private final transient ImmutableSortedSet<E> backingSet;
     32   private final transient ImmutableList<E> backingList;
     33 
     34   ImmutableSortedAsList(
     35       ImmutableSortedSet<E> backingSet, ImmutableList<E> backingList) {
     36     this.backingSet = backingSet;
     37     this.backingList = backingList;
     38   }
     39 
     40   @Override public Comparator<? super E> comparator() {
     41     return backingSet.comparator();
     42   }
     43 
     44   // Override contains(), indexOf(), and lastIndexOf() to be O(log N) instead of O(N).
     45 
     46   @Override public boolean contains(@Nullable Object target) {
     47     // TODO: why not contains(target)?
     48     return backingSet.indexOf(target) >= 0;
     49   }
     50 
     51   @Override public int indexOf(@Nullable Object target) {
     52     return backingSet.indexOf(target);
     53   }
     54 
     55   @Override public int lastIndexOf(@Nullable Object target) {
     56     return backingSet.indexOf(target);
     57   }
     58 
     59   // The returned ImmutableSortedAsList maintains the contains(), indexOf(), and
     60   // lastIndexOf() performance benefits.
     61   @Override public ImmutableList<E> subList(int fromIndex, int toIndex) {
     62     Preconditions.checkPositionIndexes(fromIndex, toIndex, size());
     63     return (fromIndex == toIndex) ? ImmutableList.<E>of()
     64         : new RegularImmutableSortedSet<E>(
     65             backingList.subList(fromIndex, toIndex), backingSet.comparator())
     66             .asList();
     67   }
     68 
     69   // The ImmutableAsList serialized form has the correct behavior.
     70   @Override Object writeReplace() {
     71     return new ImmutableAsList.SerializedForm(backingSet);
     72   }
     73 
     74   @Override public UnmodifiableIterator<E> iterator() {
     75     return backingList.iterator();
     76   }
     77 
     78   @Override public E get(int index) {
     79     return backingList.get(index);
     80   }
     81 
     82   @Override public UnmodifiableListIterator<E> listIterator() {
     83     return backingList.listIterator();
     84   }
     85 
     86   @Override public UnmodifiableListIterator<E> listIterator(int index) {
     87     return backingList.listIterator(index);
     88   }
     89 
     90   @Override public int size() {
     91     return backingList.size();
     92   }
     93 
     94   @Override public boolean equals(@Nullable Object obj) {
     95     return backingList.equals(obj);
     96   }
     97 
     98   @Override public int hashCode() {
     99     return backingList.hashCode();
    100   }
    101 
    102   @Override boolean isPartialView() {
    103     return backingList.isPartialView();
    104   }
    105 }
    106