1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 21286772eb30e454847a7000b001529fca9cb65e6dJesse Wilsonimport java.io.ObjectInputStream; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream; 2355392539fea537abfb6581b474918f9d611fba27Jesse Wilsonimport java.io.ObjectStreamException; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Array; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Collections} contains static methods which operate on 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Collection} classes. 30f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 31f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.2 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Collections { 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 35e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static final Iterator<?> EMPTY_ITERATOR = new Iterator<Object>() { 36e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean hasNext() { 37e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson return false; 38e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson } 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 40e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Object next() { 41e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson throw new NoSuchElementException(); 42e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson } 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 44e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void remove() { 45e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson throw new IllegalStateException(); 46e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson } 47e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson }; 48e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson 49e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static final Enumeration<?> EMPTY_ENUMERATION = new Enumeration<Object>() { 50e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean hasMoreElements() { 51e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson return false; 52e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson } 53e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson 54e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Object nextElement() { 55e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson throw new NoSuchElementException(); 56e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson } 57e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson }; 58e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson 59e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static final class CopiesList<E> extends AbstractList<E> implements Serializable { 60e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static final long serialVersionUID = 2739099268398711800L; 61e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private final int n; 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final E element; 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CopiesList(int length, E object) { 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (length < 0) { 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project n = length; 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project element = object; 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 72e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean contains(Object object) { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return element == null ? object == null : element.equals(object); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 76e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return n; 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 80e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E get(int location) { 81b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (location >= 0 && location < n) { 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return element; 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 89e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static final class EmptyList extends AbstractList 90e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson implements RandomAccess, Serializable { 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 8842843931221139166L; 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 93e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean contains(Object object) { 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 97e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 101e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Object get(int location) { 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object readResolve() { 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Collections.EMPTY_LIST; 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 111e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static final class EmptySet extends AbstractSet implements Serializable { 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 1582296315990362920L; 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 114e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean contains(Object object) { 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 118e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 122e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Iterator iterator() { 123e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson return EMPTY_ITERATOR; 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object readResolve() { 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Collections.EMPTY_SET; 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 132e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static final class EmptyMap extends AbstractMap implements Serializable { 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 6428348081105594320L; 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 135e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsKey(Object key) { 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 139e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsValue(Object value) { 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 143e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Set entrySet() { 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return EMPTY_SET; 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 147e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Object get(Object key) { 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 151e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Set keySet() { 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return EMPTY_SET; 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 155e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Collection values() { 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return EMPTY_LIST; 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object readResolve() { 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Collections.EMPTY_MAP; 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * An empty immutable instance of {@link List}. 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final List EMPTY_LIST = new EmptyList(); 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * An empty immutable instance of {@link Set}. 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final Set EMPTY_SET = new EmptySet(); 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * An empty immutable instance of {@link Map}. 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final Map EMPTY_MAP = new EmptyMap(); 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18255392539fea537abfb6581b474918f9d611fba27Jesse Wilson /** 18355392539fea537abfb6581b474918f9d611fba27Jesse Wilson * This class is a singleton so that equals() and hashCode() work properly. 18455392539fea537abfb6581b474918f9d611fba27Jesse Wilson */ 185e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static final class ReverseComparator<T> implements Comparator<T>, Serializable { 186e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static final ReverseComparator<Object> INSTANCE = new ReverseComparator<Object>(); 18755392539fea537abfb6581b474918f9d611fba27Jesse Wilson 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 7207038068494060240L; 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 191e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int compare(T o1, T o2) { 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Comparable<T> c2 = (Comparable<T>) o2; 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c2.compareTo(o1); 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 19555392539fea537abfb6581b474918f9d611fba27Jesse Wilson 19655392539fea537abfb6581b474918f9d611fba27Jesse Wilson private Object readResolve() throws ObjectStreamException { 19755392539fea537abfb6581b474918f9d611fba27Jesse Wilson return INSTANCE; 19855392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 201e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static final class ReverseComparator2<T> implements Comparator<T>, Serializable { 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 4374092139857L; 2030790403433525b7ca94391592d72b13a4c94578cJesse Wilson private final Comparator<T> cmp; 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2050790403433525b7ca94391592d72b13a4c94578cJesse Wilson ReverseComparator2(Comparator<T> comparator) { 2060790403433525b7ca94391592d72b13a4c94578cJesse Wilson this.cmp = comparator; 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 209e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int compare(T o1, T o2) { 2100790403433525b7ca94391592d72b13a4c94578cJesse Wilson return cmp.compare(o2, o1); 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 21255392539fea537abfb6581b474918f9d611fba27Jesse Wilson 2130790403433525b7ca94391592d72b13a4c94578cJesse Wilson @Override public boolean equals(Object o) { 2140790403433525b7ca94391592d72b13a4c94578cJesse Wilson return o instanceof ReverseComparator2 2150790403433525b7ca94391592d72b13a4c94578cJesse Wilson && ((ReverseComparator2) o).cmp.equals(cmp); 21655392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 21755392539fea537abfb6581b474918f9d611fba27Jesse Wilson 2180790403433525b7ca94391592d72b13a4c94578cJesse Wilson @Override public int hashCode() { 2190790403433525b7ca94391592d72b13a4c94578cJesse Wilson return ~cmp.hashCode(); 22055392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 223e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static final class SingletonSet<E> extends AbstractSet<E> implements Serializable { 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 3193687207550431679L; 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final E element; 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SingletonSet(E object) { 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project element = object; 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 231e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean contains(Object object) { 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return element == null ? object == null : element.equals(object); 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 235e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 1; 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 239e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Iterator<E> iterator() { 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Iterator<E>() { 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean hasNext = true; 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 243e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean hasNext() { 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return hasNext; 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 247e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E next() { 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (hasNext) { 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hasNext = false; 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return element; 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NoSuchElementException(); 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 255e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void remove() { 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 262e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static final class SingletonList<E> extends AbstractList<E> implements Serializable { 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 3093736618740652951L; 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final E element; 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SingletonList(E object) { 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project element = object; 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 271e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean contains(Object object) { 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return element == null ? object == null : element.equals(object); 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 275e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E get(int location) { 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (location == 0) { 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return element; 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 282e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 1; 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final class SingletonMap<K, V> extends AbstractMap<K, V> 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implements Serializable { 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = -6979724477215052911L; 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final K k; 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final V v; 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SingletonMap(K key, V value) { 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project k = key; 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project v = value; 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 299e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsKey(Object key) { 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return k == null ? key == null : k.equals(key); 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 303e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsValue(Object value) { 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return v == null ? value == null : v.equals(value); 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 307e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V get(Object key) { 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (containsKey(key)) { 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return v; 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 314e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 1; 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 318e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Set<Map.Entry<K, V>> entrySet() { 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new AbstractSet<Map.Entry<K, V>>() { 320e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean contains(Object object) { 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (object instanceof Map.Entry) { 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Map.Entry<?, ?> entry = (Map.Entry<?, ?>) object; 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return containsKey(entry.getKey()) 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && containsValue(entry.getValue()); 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 329e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 1; 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 333e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Iterator<Map.Entry<K, V>> iterator() { 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Iterator<Map.Entry<K, V>>() { 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean hasNext = true; 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 337e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean hasNext() { 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return hasNext; 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 341e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Map.Entry<K, V> next() { 34255392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (!hasNext) { 34355392539fea537abfb6581b474918f9d611fba27Jesse Wilson throw new NoSuchElementException(); 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 34555392539fea537abfb6581b474918f9d611fba27Jesse Wilson 34655392539fea537abfb6581b474918f9d611fba27Jesse Wilson hasNext = false; 34755392539fea537abfb6581b474918f9d611fba27Jesse Wilson return new MapEntry<K, V>(k, v) { 348e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V setValue(V value) { 34955392539fea537abfb6581b474918f9d611fba27Jesse Wilson throw new UnsupportedOperationException(); 35055392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 35155392539fea537abfb6581b474918f9d611fba27Jesse Wilson }; 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 354e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void remove() { 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 363e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson static class SynchronizedCollection<E> implements Collection<E>, Serializable { 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 3053995032091335093L; 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final Collection<E> c; 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final Object mutex; 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedCollection(Collection<E> collection) { 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c = collection; 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mutex = this; 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedCollection(Collection<E> collection, Object mutex) { 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c = collection; 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.mutex = mutex; 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 378e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean add(E object) { 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.add(object); 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 384e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean addAll(Collection<? extends E> collection) { 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.addAll(collection); 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 390e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void clear() { 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c.clear(); 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 396e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean contains(Object object) { 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.contains(object); 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 402e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsAll(Collection<?> collection) { 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.containsAll(collection); 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 408e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean isEmpty() { 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.isEmpty(); 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 414e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Iterator<E> iterator() { 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.iterator(); 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 420e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean remove(Object object) { 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.remove(object); 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 426e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean removeAll(Collection<?> collection) { 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.removeAll(collection); 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 432e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean retainAll(Collection<?> collection) { 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.retainAll(collection); 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 438e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.size(); 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 444e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public java.lang.Object[] toArray() { 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.toArray(); 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 450e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public String toString() { 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.toString(); 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 456e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public <T> T[] toArray(T[] array) { 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.toArray(array); 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void writeObject(ObjectOutputStream stream) throws IOException { 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project stream.defaultWriteObject(); 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static class SynchronizedRandomAccessList<E> extends SynchronizedList<E> 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implements RandomAccess { 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 1530674583602358482L; 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedRandomAccessList(List<E> l) { 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(l); 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedRandomAccessList(List<E> l, Object mutex) { 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(l, mutex); 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 481e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public List<E> subList(int start, int end) { 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 483e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson return new SynchronizedRandomAccessList<E>(list.subList(start, end), mutex); 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Replaces this SynchronizedRandomAccessList with a SynchronizedList so 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * that JREs before 1.4 can deserialize this object without any 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * problems. This is necessary since RandomAccess API was introduced 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * only in 1.4. 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 493f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return SynchronizedList 495f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SynchronizedList#readResolve() 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object writeReplace() { 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedList<E>(list); 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 503e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson static class SynchronizedList<E> extends SynchronizedCollection<E> implements List<E> { 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = -7754090372962971524L; 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final List<E> list; 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedList(List<E> l) { 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(l); 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project list = l; 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedList(List<E> l, Object mutex) { 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(l, mutex); 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project list = l; 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 517e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void add(int location, E object) { 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project list.add(location, object); 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 523e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean addAll(int location, Collection<? extends E> collection) { 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list.addAll(location, collection); 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 529e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean equals(Object object) { 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list.equals(object); 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 535e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E get(int location) { 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list.get(location); 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 541e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int hashCode() { 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list.hashCode(); 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 547e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int indexOf(Object object) { 548f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson final int size; 549f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson final Object[] array; 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 551f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson size = list.size(); 552f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson array = new Object[size]; 553f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson list.toArray(array); 554f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 555b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (object != null) { 556f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson for (int i = 0; i < size; i++) { 557f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (object.equals(array[i])) { 558f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return i; 559f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 560f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 561b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes } else { 562f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson for (int i = 0; i < size; i++) { 563b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (array[i] == null) { 564f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return i; 565f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 566f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 568f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return -1; 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 571e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int lastIndexOf(Object object) { 572f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson final int size; 573f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson final Object[] array; 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 575f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson size = list.size(); 576f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson array = new Object[size]; 577f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson list.toArray(array); 578f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 579b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (object != null) { 580f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson for (int i = size - 1; i >= 0; i--) { 581f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (object.equals(array[i])) { 582f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return i; 583f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 584f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 585b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes } else { 586f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson for (int i = size - 1; i >= 0; i--) { 587b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (array[i] == null) { 588f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return i; 589f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 590f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 592f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return -1; 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 595e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public ListIterator<E> listIterator() { 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list.listIterator(); 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 601e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public ListIterator<E> listIterator(int location) { 602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list.listIterator(location); 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 607e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E remove(int location) { 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list.remove(location); 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 613e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E set(int location, E object) { 614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list.set(location, object); 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 619e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public List<E> subList(int start, int end) { 620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedList<E>(list.subList(start, end), mutex); 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void writeObject(ObjectOutputStream stream) throws IOException { 626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project stream.defaultWriteObject(); 628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Resolves SynchronizedList instances to SynchronizedRandomAccessList 633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instances if the underlying list is a Random Access list. 634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This is necessary since SynchronizedRandomAccessList instances are 636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * replaced with SynchronizedList instances during serialization for 637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * compliance with JREs before 1.4. 638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 639f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a SynchronizedList instance if the underlying list implements 641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RandomAccess interface, or this same object if not. 642f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SynchronizedRandomAccessList#writeReplace() 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object readResolve() { 646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (list instanceof RandomAccess) { 647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedRandomAccessList<E>(list, mutex); 648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static class SynchronizedMap<K, V> implements Map<K, V>, Serializable { 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 1978198479659022715L; 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Map<K, V> m; 657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final Object mutex; 659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedMap(Map<K, V> map) { 661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project m = map; 662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mutex = this; 663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedMap(Map<K, V> map, Object mutex) { 666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project m = map; 667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.mutex = mutex; 668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 670e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void clear() { 671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project m.clear(); 673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 676e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsKey(Object key) { 677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.containsKey(key); 679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 682e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsValue(Object value) { 683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.containsValue(value); 685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 688e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Set<Map.Entry<K, V>> entrySet() { 689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedSet<Map.Entry<K, V>>(m.entrySet(), mutex); 691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 694e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean equals(Object object) { 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.equals(object); 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 700e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V get(Object key) { 701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.get(key); 703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 706e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int hashCode() { 707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.hashCode(); 709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 712e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean isEmpty() { 713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.isEmpty(); 715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 718e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Set<K> keySet() { 719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedSet<K>(m.keySet(), mutex); 721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 724e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V put(K key, V value) { 725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.put(key, value); 727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 730e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void putAll(Map<? extends K, ? extends V> map) { 731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project m.putAll(map); 733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 736e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V remove(Object key) { 737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.remove(key); 739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 742e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.size(); 745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 748e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Collection<V> values() { 749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedCollection<V>(m.values(), mutex); 751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 754e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public String toString() { 755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.toString(); 757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void writeObject(ObjectOutputStream stream) throws IOException { 761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project stream.defaultWriteObject(); 763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 767e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson static class SynchronizedSet<E> extends SynchronizedCollection<E> implements Set<E> { 768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 487447009682186044L; 769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedSet(Set<E> set) { 771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(set); 772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedSet(Set<E> set, Object mutex) { 775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(set, mutex); 776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 778e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean equals(Object object) { 779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.equals(object); 781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 784e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int hashCode() { 785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.hashCode(); 787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void writeObject(ObjectOutputStream stream) throws IOException { 791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project stream.defaultWriteObject(); 793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static class SynchronizedSortedMap<K, V> extends SynchronizedMap<K, V> 798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implements SortedMap<K, V> { 799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = -8798146769416483793L; 800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final SortedMap<K, V> sm; 802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedSortedMap(SortedMap<K, V> map) { 804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(map); 805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sm = map; 806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedSortedMap(SortedMap<K, V> map, Object mutex) { 809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(map, mutex); 810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sm = map; 811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 813e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Comparator<? super K> comparator() { 814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sm.comparator(); 816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 819e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public K firstKey() { 820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sm.firstKey(); 822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 825e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedMap<K, V> headMap(K endKey) { 826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedSortedMap<K, V>(sm.headMap(endKey), 828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mutex); 829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 832e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public K lastKey() { 833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sm.lastKey(); 835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 838e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedMap<K, V> subMap(K startKey, K endKey) { 839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedSortedMap<K, V>(sm.subMap(startKey, 841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project endKey), mutex); 842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 845e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedMap<K, V> tailMap(K startKey) { 846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedSortedMap<K, V>(sm.tailMap(startKey), 848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mutex); 849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void writeObject(ObjectOutputStream stream) throws IOException { 853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project stream.defaultWriteObject(); 855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 859e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson static class SynchronizedSortedSet<E> extends SynchronizedSet<E> implements SortedSet<E> { 860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 8695801310862127406L; 861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final SortedSet<E> ss; 863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedSortedSet(SortedSet<E> set) { 865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(set); 866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ss = set; 867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SynchronizedSortedSet(SortedSet<E> set, Object mutex) { 870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(set, mutex); 871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ss = set; 872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 874e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Comparator<? super E> comparator() { 875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ss.comparator(); 877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 880e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E first() { 881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ss.first(); 883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 886e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedSet<E> headSet(E end) { 887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedSortedSet<E>(ss.headSet(end), mutex); 889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 892e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E last() { 893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ss.last(); 895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 898e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedSet<E> subSet(E start, E end) { 899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedSortedSet<E>(ss.subSet(start, end), 901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mutex); 902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 905e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedSet<E> tailSet(E start) { 906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedSortedSet<E>(ss.tailSet(start), mutex); 908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void writeObject(ObjectOutputStream stream) throws IOException { 912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (mutex) { 913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project stream.defaultWriteObject(); 914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 918e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static class UnmodifiableCollection<E> implements Collection<E>, Serializable { 919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 1820017752578914078L; 920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final Collection<E> c; 922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UnmodifiableCollection(Collection<E> collection) { 924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c = collection; 925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 927e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean add(E object) { 928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 931e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean addAll(Collection<? extends E> collection) { 932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 935e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void clear() { 936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 939e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean contains(Object object) { 940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.contains(object); 941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 943e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsAll(Collection<?> collection) { 944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.containsAll(collection); 945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 947e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean isEmpty() { 948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.isEmpty(); 949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 951e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Iterator<E> iterator() { 952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Iterator<E>() { 953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<E> iterator = c.iterator(); 954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 955e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean hasNext() { 956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return iterator.hasNext(); 957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 959e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E next() { 960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return iterator.next(); 961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 963e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void remove() { 964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 969e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean remove(Object object) { 970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 973e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean removeAll(Collection<?> collection) { 974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 977e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean retainAll(Collection<?> collection) { 978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 981e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.size(); 983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 985e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Object[] toArray() { 986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.toArray(); 987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 989e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public <T> T[] toArray(T[] array) { 990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.toArray(array); 991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 993e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public String toString() { 994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.toString(); 995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 998e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static class UnmodifiableRandomAccessList<E> extends UnmodifiableList<E> 999e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson implements RandomAccess { 1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = -2542308836966382001L; 1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UnmodifiableRandomAccessList(List<E> l) { 1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(l); 1004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1006e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public List<E> subList(int start, int end) { 1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableRandomAccessList<E>(list.subList(start, end)); 1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Replaces this UnmodifiableRandomAccessList with an UnmodifiableList 1012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * so that JREs before 1.4 can deserialize this object without any 1013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * problems. This is necessary since RandomAccess API was introduced 1014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * only in 1.4. 1015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 1016f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return UnmodifiableList 1018f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see UnmodifiableList#readResolve() 1020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object writeReplace() { 1022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableList<E>(list); 1023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class UnmodifiableList<E> extends UnmodifiableCollection<E> 1027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implements List<E> { 1028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = -283967356065247728L; 1029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1030adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final List<E> list; 1031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UnmodifiableList(List<E> l) { 1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(l); 1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project list = l; 1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1037e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void add(int location, E object) { 1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 1039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1041e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean addAll(int location, Collection<? extends E> collection) { 1042adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 1043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1045e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean equals(Object object) { 1046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list.equals(object); 1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1049e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E get(int location) { 1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list.get(location); 1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1053e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int hashCode() { 1054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list.hashCode(); 1055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1057e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int indexOf(Object object) { 1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list.indexOf(object); 1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1061e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int lastIndexOf(Object object) { 1062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list.lastIndexOf(object); 1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1065e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public ListIterator<E> listIterator() { 1066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return listIterator(0); 1067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1069e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public ListIterator<E> listIterator(final int location) { 1070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new ListIterator<E>() { 1071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListIterator<E> iterator = list.listIterator(location); 1072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1073e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void add(E object) { 1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 1075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1077e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean hasNext() { 1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return iterator.hasNext(); 1079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1081e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean hasPrevious() { 1082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return iterator.hasPrevious(); 1083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1085e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E next() { 1086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return iterator.next(); 1087adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1089e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int nextIndex() { 1090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return iterator.nextIndex(); 1091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1092adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1093e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E previous() { 1094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return iterator.previous(); 1095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1097e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int previousIndex() { 1098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return iterator.previousIndex(); 1099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1101e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void remove() { 1102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1105e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void set(E object) { 1106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 1107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1111e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E remove(int location) { 1112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 1113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1115e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E set(int location, E object) { 1116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 1117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1119e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public List<E> subList(int start, int end) { 1120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableList<E>(list.subList(start, end)); 1121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Resolves UnmodifiableList instances to UnmodifiableRandomAccessList 1125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instances if the underlying list is a Random Access list. 1126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 1127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This is necessary since UnmodifiableRandomAccessList instances are 1128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * replaced with UnmodifiableList instances during serialization for 1129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * compliance with JREs before 1.4. 1130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 1131f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an UnmodifiableList instance if the underlying list 1133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implements RandomAccess interface, or this same object if 1134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not. 1135f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see UnmodifiableRandomAccessList#writeReplace() 1137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object readResolve() { 1139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (list instanceof RandomAccess) { 1140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableRandomAccessList<E>(list); 1141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 1143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class UnmodifiableMap<K, V> implements Map<K, V>, 1147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Serializable { 1148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = -1034234728574286014L; 1149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Map<K, V> m; 1151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class UnmodifiableEntrySet<K, V> extends 1153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UnmodifiableSet<Map.Entry<K, V>> { 1154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 7854390611657943733L; 1155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class UnmodifiableMapEntry<K, V> implements 1157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Map.Entry<K, V> { 1158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Map.Entry<K, V> mapEntry; 1159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UnmodifiableMapEntry(Map.Entry<K, V> entry) { 1161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mapEntry = entry; 1162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1164e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean equals(Object object) { 1165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return mapEntry.equals(object); 1166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1168e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public K getKey() { 1169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return mapEntry.getKey(); 1170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1172e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V getValue() { 1173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return mapEntry.getValue(); 1174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1176e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int hashCode() { 1177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return mapEntry.hashCode(); 1178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1180e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V setValue(V object) { 1181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 1182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1184e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public String toString() { 1185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return mapEntry.toString(); 1186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UnmodifiableEntrySet(Set<Map.Entry<K, V>> set) { 1190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(set); 1191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1193e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Iterator<Map.Entry<K, V>> iterator() { 1194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Iterator<Map.Entry<K, V>>() { 1195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<Map.Entry<K, V>> iterator = c.iterator(); 1196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1197e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean hasNext() { 1198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return iterator.hasNext(); 1199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1201e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Map.Entry<K, V> next() { 1202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableMapEntry<K, V>(iterator.next()); 1203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1205e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void remove() { 1206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 1207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 1209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1211e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Object[] toArray() { 1212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int length = c.size(); 1213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object[] result = new Object[length]; 1214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<?> it = iterator(); 1215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = length; --i >= 0;) { 1216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result[i] = it.next(); 1217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 1219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 1222e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public <T> T[] toArray(T[] contents) { 1223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int size = c.size(), index = 0; 1224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<Map.Entry<K, V>> it = iterator(); 1225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (size > contents.length) { 1226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?> ct = contents.getClass().getComponentType(); 1227286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson contents = (T[]) Array.newInstance(ct, size); 1228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (index < size) { 1230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contents[index++] = (T) it.next(); 1231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index < contents.length) { 1233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contents[index] = null; 1234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return contents; 1236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UnmodifiableMap(Map<K, V> map) { 1240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project m = map; 1241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1243e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void clear() { 1244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 1245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1247e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsKey(Object key) { 1248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.containsKey(key); 1249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1251e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsValue(Object value) { 1252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.containsValue(value); 1253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1255e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Set<Map.Entry<K, V>> entrySet() { 1256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableEntrySet<K, V>(m.entrySet()); 1257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1259e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean equals(Object object) { 1260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.equals(object); 1261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1263e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V get(Object key) { 1264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.get(key); 1265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1267e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int hashCode() { 1268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.hashCode(); 1269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1271e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean isEmpty() { 1272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.isEmpty(); 1273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1275e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Set<K> keySet() { 1276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableSet<K>(m.keySet()); 1277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1279e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V put(K key, V value) { 1280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 1281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1283e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void putAll(Map<? extends K, ? extends V> map) { 1284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 1285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1287e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V remove(Object key) { 1288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 1289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1291e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 1292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.size(); 1293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1295e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Collection<V> values() { 1296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableCollection<V>(m.values()); 1297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1299e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public String toString() { 1300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.toString(); 1301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class UnmodifiableSet<E> extends UnmodifiableCollection<E> 1305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implements Set<E> { 1306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = -9215047833775013803L; 1307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UnmodifiableSet(Set<E> set) { 1309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(set); 1310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1312e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean equals(Object object) { 1313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.equals(object); 1314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1316e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int hashCode() { 1317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.hashCode(); 1318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class UnmodifiableSortedMap<K, V> extends 1322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UnmodifiableMap<K, V> implements SortedMap<K, V> { 1323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = -8806743815996713206L; 1324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final SortedMap<K, V> sm; 1326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UnmodifiableSortedMap(SortedMap<K, V> map) { 1328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(map); 1329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sm = map; 1330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1332e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Comparator<? super K> comparator() { 1333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sm.comparator(); 1334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1336e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public K firstKey() { 1337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sm.firstKey(); 1338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1340e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedMap<K, V> headMap(K before) { 1341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableSortedMap<K, V>(sm.headMap(before)); 1342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1344e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public K lastKey() { 1345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sm.lastKey(); 1346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1348e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedMap<K, V> subMap(K start, K end) { 1349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableSortedMap<K, V>(sm.subMap(start, end)); 1350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1352e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedMap<K, V> tailMap(K after) { 1353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableSortedMap<K, V>(sm.tailMap(after)); 1354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class UnmodifiableSortedSet<E> extends UnmodifiableSet<E> 1358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implements SortedSet<E> { 1359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = -4929149591599911165L; 1360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final SortedSet<E> ss; 1362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UnmodifiableSortedSet(SortedSet<E> set) { 1364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(set); 1365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ss = set; 1366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1368e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Comparator<? super E> comparator() { 1369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ss.comparator(); 1370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1372e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E first() { 1373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ss.first(); 1374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1376e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedSet<E> headSet(E before) { 1377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableSortedSet<E>(ss.headSet(before)); 1378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1380e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E last() { 1381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ss.last(); 1382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1384e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedSet<E> subSet(E start, E end) { 1385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableSortedSet<E>(ss.subSet(start, end)); 1386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1388e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedSet<E> tailSet(E after) { 1389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableSortedSet<E>(ss.tailSet(after)); 1390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1393e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private Collections() {} 1394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Performs a binary search for the specified element in the specified 1397f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * sorted list. The list needs to be already sorted in natural sorting 1398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * order. Searching in an unsorted array has an undefined result. It's also 1399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * undefined which element is found if there are multiple occurrences of the 1400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * same element. 1401f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 1403f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the sorted list to search. 1404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 1405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the element to find. 1406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the non-negative index of the element, or a negative index which 1407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is the {@code -index - 1} where the element would be inserted 1408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassCastException 1409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an element in the List or the search element does not 1410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implement Comparable, or cannot be compared to each other. 1411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 1413e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T object) { 1414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (list == null) { 141586acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("list == null"); 1416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (list.isEmpty()) { 1418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 1419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1421f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 1422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(list instanceof RandomAccess)) { 1423f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson ListIterator<? extends Comparable<? super T>> it = list.listIterator(); 1424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (it.hasNext()) { 1425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int result; 1426f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if ((result = -it.next().compareTo(object)) <= 0) { 1427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (result == 0) { 1428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return it.previousIndex(); 1429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -it.previousIndex() - 1; 1431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -list.size() - 1; 1434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int low = 0, mid = list.size(), high = mid - 1, result = -1; 1437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (low <= high) { 1438c8a71612646a1b0e2b787fe985245def93ecc705Jesse Wilson mid = (low + high) >>> 1; 1439f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if ((result = -list.get(mid).compareTo(object)) > 0) { 1440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project low = mid + 1; 1441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (result == 0) { 1442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return mid; 1443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project high = mid - 1; 1445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -mid - (result < 0 ? 1 : 2); 1448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Performs a binary search for the specified element in the specified 1452f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * sorted list using the specified comparator. The list needs to be already 1453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sorted according to the comparator passed. Searching in an unsorted array 1454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * has an undefined result. It's also undefined which element is found if 1455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * there are multiple occurrences of the same element. 1456f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 1458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the sorted List to search. 1459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 1460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the element to find. 1461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param comparator 1462f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the comparator. If the comparator is {@code null} then the 1463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * search uses the objects' natural ordering. 1464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the non-negative index of the element, or a negative index which 1465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is the {@code -index - 1} where the element would be inserted. 1466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassCastException 1467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when an element in the list and the searched element cannot 1468f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * be compared to each other using the comparator. 1469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 1471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> int binarySearch(List<? extends T> list, T object, 1472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Comparator<? super T> comparator) { 1473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (comparator == null) { 1474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Collections.binarySearch( 1475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (List<? extends Comparable<? super T>>) list, object); 1476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(list instanceof RandomAccess)) { 1478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListIterator<? extends T> it = list.listIterator(); 1479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (it.hasNext()) { 1480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int result; 1481f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if ((result = -comparator.compare(it.next(), object)) <= 0) { 1482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (result == 0) { 1483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return it.previousIndex(); 1484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -it.previousIndex() - 1; 1486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -list.size() - 1; 1489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int low = 0, mid = list.size(), high = mid - 1, result = -1; 1492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (low <= high) { 1493c8a71612646a1b0e2b787fe985245def93ecc705Jesse Wilson mid = (low + high) >>> 1; 1494e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson if ((result = -comparator.compare(list.get(mid), object)) > 0) { 1495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project low = mid + 1; 1496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (result == 0) { 1497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return mid; 1498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project high = mid - 1; 1500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -mid - (result < 0 ? 1 : 2); 1503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copies the elements from the source list to the destination list. At the 1507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * end both lists will have the same objects at the same index. If the 1508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * destination array is larger than the source list, the elements in the 1509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * destination list with {@code index >= source.size()} will be unchanged. 1510f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param destination 1512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the list whose elements are set from the source list. 1513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param source 1514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the list with the elements to be copied into the destination. 1515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IndexOutOfBoundsException 1516f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * when the destination list is smaller than the source list. 1517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnsupportedOperationException 1518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when replacing an element in the destination list is not 1519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * supported. 1520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1521b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes public static <T> void copy(List<? super T> destination, List<? extends T> source) { 1522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (destination.size() < source.size()) { 15230515ea0a581f329bce4f8174e098b653fb04979eElliott Hughes throw new IndexOutOfBoundsException("destination.size() < source.size(): " + 15240515ea0a581f329bce4f8174e098b653fb04979eElliott Hughes destination.size() + " < " + source.size()); 1525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<? extends T> srcIt = source.iterator(); 1527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListIterator<? super T> destIt = destination.listIterator(); 1528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (srcIt.hasNext()) { 1529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 1530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project destIt.next(); 1531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NoSuchElementException e) { 1532b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes // TODO: AssertionError? 1533b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes throw new IndexOutOfBoundsException("Source size " + source.size() + 1534b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes " does not fit into destination"); 1535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project destIt.set(srcIt.next()); 1537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an {@code Enumeration} on the specified collection. 1542f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param collection 1544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the collection to enumerate. 1545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an Enumeration. 1546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> Enumeration<T> enumeration(Collection<T> collection) { 1548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final Collection<T> c = collection; 1549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Enumeration<T>() { 1550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<T> it = c.iterator(); 1551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1552e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean hasMoreElements() { 1553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return it.hasNext(); 1554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1556e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public T nextElement() { 1557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return it.next(); 1558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 1560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1563f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Fills the specified list with the specified element. 1564f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 1566f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the list to fill. 1567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 1568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the element to fill the list with. 1569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnsupportedOperationException 1570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when replacing an element in the List is not supported. 1571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> void fill(List<? super T> list, T object) { 1573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListIterator<? super T> it = list.listIterator(); 1574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (it.hasNext()) { 1575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project it.next(); 1576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project it.set(object); 1577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1581f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Searches the specified collection for the maximum element. 1582f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param collection 1584f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the collection to search. 1585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the maximum element in the Collection. 1586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassCastException 1587f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * when an element in the collection does not implement 1588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Comparable} or elements cannot be compared to each 1589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * other. 1590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T extends Object & Comparable<? super T>> T max( 1592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Collection<? extends T> collection) { 1593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<? extends T> it = collection.iterator(); 1594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project T max = it.next(); 1595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (it.hasNext()) { 1596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project T next = it.next(); 1597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (max.compareTo(next) < 0) { 1598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project max = next; 1599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return max; 1602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1605f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Searches the specified collection for the maximum element using the 1606f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * specified comparator. 1607f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param collection 1609f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the collection to search. 1610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param comparator 1611f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the comparator. 1612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the maximum element in the Collection. 1613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassCastException 1614f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * when elements in the collection cannot be compared to each 1615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * other using the {@code Comparator}. 1616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> T max(Collection<? extends T> collection, 1618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Comparator<? super T> comparator) { 161955392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (comparator == null) { 162055392539fea537abfb6581b474918f9d611fba27Jesse Wilson @SuppressWarnings("unchecked") // null comparator? T is comparable 162155392539fea537abfb6581b474918f9d611fba27Jesse Wilson T result = (T) max((Collection<Comparable>) collection); 162255392539fea537abfb6581b474918f9d611fba27Jesse Wilson return result; 162355392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 162455392539fea537abfb6581b474918f9d611fba27Jesse Wilson 1625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<? extends T> it = collection.iterator(); 1626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project T max = it.next(); 1627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (it.hasNext()) { 1628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project T next = it.next(); 1629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (comparator.compare(max, next) < 0) { 1630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project max = next; 1631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return max; 1634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1637f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Searches the specified collection for the minimum element. 1638f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param collection 1640f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the collection to search. 1641f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return the minimum element in the collection. 1642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassCastException 1643f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * when an element in the collection does not implement 1644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Comparable} or elements cannot be compared to each 1645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * other. 1646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T extends Object & Comparable<? super T>> T min( 1648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Collection<? extends T> collection) { 1649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<? extends T> it = collection.iterator(); 1650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project T min = it.next(); 1651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (it.hasNext()) { 1652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project T next = it.next(); 1653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (min.compareTo(next) > 0) { 1654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project min = next; 1655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return min; 1658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1661f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Searches the specified collection for the minimum element using the 1662f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * specified comparator. 1663f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param collection 1665f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the collection to search. 1666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param comparator 1667f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the comparator. 1668f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return the minimum element in the collection. 1669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassCastException 1670f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * when elements in the collection cannot be compared to each 1671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * other using the {@code Comparator}. 1672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> T min(Collection<? extends T> collection, 1674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Comparator<? super T> comparator) { 167555392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (comparator == null) { 167655392539fea537abfb6581b474918f9d611fba27Jesse Wilson @SuppressWarnings("unchecked") // null comparator? T is comparable 167755392539fea537abfb6581b474918f9d611fba27Jesse Wilson T result = (T) min((Collection<Comparable>) collection); 167855392539fea537abfb6581b474918f9d611fba27Jesse Wilson return result; 167955392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 168055392539fea537abfb6581b474918f9d611fba27Jesse Wilson 1681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<? extends T> it = collection.iterator(); 1682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project T min = it.next(); 1683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (it.hasNext()) { 1684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project T next = it.next(); 1685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (comparator.compare(min, next) > 0) { 1686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project min = next; 1687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return min; 1690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1693f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a list containing the specified number of the specified element. 1694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The list cannot be modified. The list is serializable. 1695f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param length 1697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the size of the returned list. 1698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 1699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the element to be added {@code length} times to a list. 1700f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return a list containing {@code length} copies of the element. 1701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 1702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when {@code length < 0}. 1703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> List<T> nCopies(final int length, T object) { 1705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CopiesList<T>(length, object); 1706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Modifies the specified {@code List} by reversing the order of the 1710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * elements. 1711f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 1713f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the list to reverse. 1714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnsupportedOperationException 1715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when replacing an element in the List is not supported. 1716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 1718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static void reverse(List<?> list) { 1719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int size = list.size(); 1720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListIterator<Object> front = (ListIterator<Object>) list.listIterator(); 1721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListIterator<Object> back = (ListIterator<Object>) list 1722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .listIterator(size); 1723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size / 2; i++) { 1724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object frontNext = front.next(); 1725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object backPrev = back.previous(); 1726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project front.set(backPrev); 1727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project back.set(frontNext); 1728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1732f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * A comparator which reverses the natural order of the elements. The 1733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Comparator} that's returned is {@link Serializable}. 1734f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a {@code Comparator} instance. 1736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 173755392539fea537abfb6581b474918f9d611fba27Jesse Wilson @SuppressWarnings("unchecked") 1738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> Comparator<T> reverseOrder() { 173955392539fea537abfb6581b474918f9d611fba27Jesse Wilson return (Comparator) ReverseComparator.INSTANCE; 1740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a {@link Comparator} that reverses the order of the 1744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Comparator} passed. If the {@code Comparator} passed is 1745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code null}, then this method is equivalent to {@link #reverseOrder()}. 1746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 1747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The {@code Comparator} that's returned is {@link Serializable} if the 1748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Comparator} passed is serializable or {@code null}. 1749f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param c 1751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code Comparator} to reverse or {@code null}. 1752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a {@code Comparator} instance. 1753f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.5 1754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> Comparator<T> reverseOrder(Comparator<T> c) { 1756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c == null) { 1757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return reverseOrder(); 1758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 17590790403433525b7ca94391592d72b13a4c94578cJesse Wilson if (c instanceof ReverseComparator2) { 17600790403433525b7ca94391592d72b13a4c94578cJesse Wilson return ((ReverseComparator2<T>) c).cmp; 176155392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 17620790403433525b7ca94391592d72b13a4c94578cJesse Wilson return new ReverseComparator2<T>(c); 1763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1766f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Moves every element of the list to a random new position in the list. 1767f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 1769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the List to shuffle. 1770f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnsupportedOperationException 1772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when replacing an element in the List is not supported. 1773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static void shuffle(List<?> list) { 1775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project shuffle(list, new Random()); 1776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1779f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Moves every element of the list to a random new position in the list 1780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * using the specified random number generator. 1781f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 1783f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the list to shuffle. 1784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param random 1785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the random number generator. 1786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnsupportedOperationException 1787f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * when replacing an element in the list is not supported. 1788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static void shuffle(List<?> list, Random random) { 17905839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson @SuppressWarnings("unchecked") // we won't put foreign objects in 17915839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson final List<Object> objectList = (List<Object>) list; 17925839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson 17935839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson if (list instanceof RandomAccess) { 17945839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson for (int i = objectList.size() - 1; i > 0; i--) { 17955839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson int index = random.nextInt(i + 1); 17965839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson objectList.set(index, objectList.set(i, objectList.get(index))); 17975839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson } 17985839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson } else { 17995839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson Object[] array = objectList.toArray(); 1800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = array.length - 1; i > 0; i--) { 1801f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson int index = random.nextInt(i + 1); 1802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object temp = array[i]; 1803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project array[i] = array[index]; 1804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project array[index] = temp; 1805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i = 0; 18085839b909d9528b7726e678a4b696ed37df15d897Jesse Wilson ListIterator<Object> it = objectList.listIterator(); 1809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (it.hasNext()) { 1810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project it.next(); 1811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project it.set(array[i++]); 1812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1817f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a set containing the specified element. The set cannot be 1818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * modified. The set is serializable. 1819f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 1821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the element. 1822f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return a set containing the element. 1823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <E> Set<E> singleton(E object) { 1825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SingletonSet<E>(object); 1826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1829f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a list containing the specified element. The list cannot be 1830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * modified. The list is serializable. 1831f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 1833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the element. 1834f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return a list containing the element. 1835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <E> List<E> singletonList(E object) { 1837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SingletonList<E>(object); 1838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a Map containing the specified key and value. The map cannot be 1842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * modified. The map is serializable. 1843f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 1845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key. 1846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value 1847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the value. 1848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a Map containing the key and value. 1849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <K, V> Map<K, V> singletonMap(K key, V value) { 1851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SingletonMap<K, V>(key, value); 1852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1855f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Sorts the specified list in ascending natural order. The algorithm is 1856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stable which means equal elements don't get reordered. 1857f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 1859f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the list to be sorted. 1860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassCastException 1861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when an element in the List does not implement Comparable or 1862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * elements cannot be compared to each other. 1863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 1865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T extends Comparable<? super T>> void sort(List<T> list) { 1866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object[] array = list.toArray(); 1867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Arrays.sort(array); 1868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i = 0; 1869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListIterator<T> it = list.listIterator(); 1870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (it.hasNext()) { 1871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project it.next(); 1872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project it.set((T) array[i++]); 1873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1877f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Sorts the specified list using the specified comparator. The algorithm is 1878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stable which means equal elements don't get reordered. 1879f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 1881f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the list to be sorted. 1882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param comparator 1883f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the comparator. 1884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassCastException 1885f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * when elements in the list cannot be compared to each other 1886f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * using the comparator. 1887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 1889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> void sort(List<T> list, Comparator<? super T> comparator) { 1890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project T[] array = list.toArray((T[]) new Object[list.size()]); 1891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Arrays.sort(array, comparator); 1892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i = 0; 1893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListIterator<T> it = list.listIterator(); 1894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (it.hasNext()) { 1895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project it.next(); 1896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project it.set(array[i++]); 1897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1901f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Swaps the elements of list {@code list} at indices {@code index1} and 1902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code index2}. 1903f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 1905f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the list to manipulate. 1906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param index1 1907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position of the first element to swap with the element in 1908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * index2. 1909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param index2 1910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position of the other element. 1911f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IndexOutOfBoundsException 1913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if index1 or index2 is out of range of this list. 1914f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.4 1915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 1917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static void swap(List<?> list, int index1, int index2) { 1918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (list == null) { 191986acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("list == null"); 1920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1921f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson final int size = list.size(); 1922f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (index1 < 0 || index1 >= size || index2 < 0 || index2 >= size) { 1923f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson throw new IndexOutOfBoundsException(); 1924f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 1925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index1 == index2) { 1926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 1927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project List<Object> rawList = (List<Object>) list; 1929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project rawList.set(index2, rawList.set(index1, rawList.get(index2))); 1930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Replaces all occurrences of Object {@code obj} in {@code list} with 1934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code newObj}. If the {@code obj} is {@code null}, then all 1935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * occurrences of {@code null} are replaced with {@code newObj}. 1936f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 1938f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the list to modify. 1939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param obj 1940f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the object to find and replace occurrences of. 1941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param obj2 1942f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the object to replace all occurrences of {@code obj} in 1943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code list}. 1944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return true, if at least one occurrence of {@code obj} has been found in 1945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code list}. 1946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnsupportedOperationException 1947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the list does not support setting elements. 1948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> boolean replaceAll(List<T> list, T obj, T obj2) { 1950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index; 1951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean found = false; 1952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while ((index = list.indexOf(obj)) > -1) { 1954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project found = true; 1955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project list.set(index, obj2); 1956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return found; 1958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1961f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Rotates the elements in {@code list} by the distance {@code dist} 1962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 1963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * e.g. for a given list with elements [1, 2, 3, 4, 5, 6, 7, 8, 9, 0], 1964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * calling rotate(list, 3) or rotate(list, -7) would modify the list to look 1965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * like this: [8, 9, 0, 1, 2, 3, 4, 5, 6, 7] 1966f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param lst 1968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the list whose elements are to be rotated. 1969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dist 1970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is the distance the list is rotated. This can be any valid 1971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * integer. Negative values rotate the list backwards. 1972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 1974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static void rotate(List<?> lst, int dist) { 1975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project List<Object> list = (List<Object>) lst; 1976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int size = list.size(); 1977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Can't sensibly rotate an empty collection 1979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (size == 0) { 1980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 1981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // normalize the distance 1984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int normdist; 1985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (dist > 0) { 1986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project normdist = dist % size; 1987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project normdist = size - ((dist % size) * (-1)); 1989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (normdist == 0 || normdist == size) { 1992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 1993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (list instanceof RandomAccess) { 1996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // make sure each element gets juggled 1997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // with the element in the position it is supposed to go to 1998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object temp = list.get(0); 1999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = 0, beginIndex = 0; 2000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size; i++) { 2001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project index = (index + normdist) % size; 2002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project temp = list.set(index, temp); 2003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index == beginIndex) { 2004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project index = ++beginIndex; 2005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project temp = list.get(beginIndex); 2006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 2009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int divideIndex = (size - normdist) % size; 2010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project List<Object> sublist1 = list.subList(0, divideIndex); 2011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project List<Object> sublist2 = list.subList(divideIndex, size); 2012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project reverse(sublist1); 2013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project reverse(sublist2); 2014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project reverse(list); 2015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2018adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Searches the {@code list} for {@code sublist} and returns the beginning 2020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * index of the first occurrence. 2021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 2022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * -1 is returned if the {@code sublist} does not exist in {@code list}. 2023f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 2025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the List to search {@code sublist} in. 2026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param sublist 2027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the List to search in {@code list}. 2028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the beginning index of the first occurrence of {@code sublist} in 2029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code list}, or -1. 2030adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static int indexOfSubList(List<?> list, List<?> sublist) { 2032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int size = list.size(); 2033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int sublistSize = sublist.size(); 2034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sublistSize > size) { 2036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 2037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sublistSize == 0) { 2040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; 2041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2042adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // find the first element of sublist in the list to get a head start 2044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object firstObj = sublist.get(0); 2045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = list.indexOf(firstObj); 2046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index == -1) { 2047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 2048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (index < size && (size - index >= sublistSize)) { 2051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListIterator<?> listIt = list.listIterator(index); 2052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((firstObj == null) ? listIt.next() == null : firstObj 2054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .equals(listIt.next())) { 2055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // iterate through the elements in sublist to see 2057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if they are included in the same order in the list 2058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListIterator<?> sublistIt = sublist.listIterator(1); 2059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean difFound = false; 2060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (sublistIt.hasNext()) { 2061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object element = sublistIt.next(); 2062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!listIt.hasNext()) { 2063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 2064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((element == null) ? listIt.next() != null : !element 2066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .equals(listIt.next())) { 2067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project difFound = true; 2068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 2069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // All elements of sublist are found in main list 2072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // starting from index. 2073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!difFound) { 2074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return index; 2075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2077adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // This was not the sequence we were looking for, 2078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // continue search for the firstObj in main list 2079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // at the position after index. 2080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project index++; 2081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 2083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2085adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Searches the {@code list} for {@code sublist} and returns the beginning 2087adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * index of the last occurrence. 2088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 2089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * -1 is returned if the {@code sublist} does not exist in {@code list}. 2090f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 2092f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the list to search {@code sublist} in. 2093adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param sublist 2094f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the list to search in {@code list}. 2095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the beginning index of the last occurrence of {@code sublist} in 2096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code list}, or -1. 2097adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static int lastIndexOfSubList(List<?> list, List<?> sublist) { 2099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int sublistSize = sublist.size(); 2100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int size = list.size(); 2101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sublistSize > size) { 2103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 2104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sublistSize == 0) { 2107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return size; 2108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // find the last element of sublist in the list to get a head start 2111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object lastObj = sublist.get(sublistSize - 1); 2112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = list.lastIndexOf(lastObj); 2113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while ((index > -1) && (index + 1 >= sublistSize)) { 2115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListIterator<?> listIt = list.listIterator(index + 1); 2116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((lastObj == null) ? listIt.previous() == null : lastObj 2118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .equals(listIt.previous())) { 2119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // iterate through the elements in sublist to see 2120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if they are included in the same order in the list 2121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ListIterator<?> sublistIt = sublist 2122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .listIterator(sublistSize - 1); 2123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean difFound = false; 2124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (sublistIt.hasPrevious()) { 2125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object element = sublistIt.previous(); 2126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!listIt.hasPrevious()) { 2127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 2128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((element == null) ? listIt.previous() != null 2130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project : !element.equals(listIt.previous())) { 2131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project difFound = true; 2132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 2133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // All elements of sublist are found in main list 2136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // starting from listIt.nextIndex(). 2137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!difFound) { 2138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return listIt.nextIndex(); 2139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // This was not the sequence we were looking for, 2142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // continue search for the lastObj in main list 2143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // at the position before index. 2144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project index--; 2145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 2147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2150f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns an {@code ArrayList} with all the elements in the {@code 2151f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * enumeration}. The elements in the returned {@code ArrayList} are in the 2152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * same order as in the {@code enumeration}. 2153f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param enumeration 2155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the source {@link Enumeration}. 2156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an {@code ArrayList} from {@code enumeration}. 2157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> ArrayList<T> list(Enumeration<T> enumeration) { 2159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ArrayList<T> list = new ArrayList<T>(); 2160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (enumeration.hasMoreElements()) { 2161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project list.add(enumeration.nextElement()); 2162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return list; 2164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2167f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a wrapper on the specified collection which synchronizes all 2168f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * access to the collection. 2169f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param collection 2171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the Collection to wrap in a synchronized collection. 2172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a synchronized Collection. 2173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> Collection<T> synchronizedCollection( 2175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Collection<T> collection) { 2176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (collection == null) { 217786acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("collection == null"); 2178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedCollection<T>(collection); 2180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a wrapper on the specified List which synchronizes all access to 2184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the List. 2185f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 2187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the List to wrap in a synchronized list. 2188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a synchronized List. 2189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> List<T> synchronizedList(List<T> list) { 2191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (list == null) { 219286acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("list == null"); 2193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (list instanceof RandomAccess) { 2195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedRandomAccessList<T>(list); 2196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedList<T>(list); 2198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2201f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a wrapper on the specified map which synchronizes all access to 2202f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the map. 2203f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param map 2205f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the map to wrap in a synchronized map. 2206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a synchronized Map. 2207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <K, V> Map<K, V> synchronizedMap(Map<K, V> map) { 2209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (map == null) { 221086acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("map == null"); 2211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedMap<K, V>(map); 2213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2216f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a wrapper on the specified set which synchronizes all access to 2217f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the set. 2218f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param set 2220f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the set to wrap in a synchronized set. 2221f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return a synchronized set. 2222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <E> Set<E> synchronizedSet(Set<E> set) { 2224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (set == null) { 222586acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("set == null"); 2226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedSet<E>(set); 2228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2231f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a wrapper on the specified sorted map which synchronizes all 2232f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * access to the sorted map. 2233f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param map 2235f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the sorted map to wrap in a synchronized sorted map. 2236f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return a synchronized sorted map. 2237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <K, V> SortedMap<K, V> synchronizedSortedMap( 2239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SortedMap<K, V> map) { 2240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (map == null) { 224186acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("map == null"); 2242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedSortedMap<K, V>(map); 2244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2247f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a wrapper on the specified sorted set which synchronizes all 2248f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * access to the sorted set. 2249f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param set 2251f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the sorted set to wrap in a synchronized sorted set. 2252f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return a synchronized sorted set. 2253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <E> SortedSet<E> synchronizedSortedSet(SortedSet<E> set) { 2255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (set == null) { 225686acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("set == null"); 2257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new SynchronizedSortedSet<E>(set); 2259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2262f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a wrapper on the specified collection which throws an 2263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code UnsupportedOperationException} whenever an attempt is made to 2264f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * modify the collection. 2265f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param collection 2267f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the collection to wrap in an unmodifiable collection. 2268f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return an unmodifiable collection. 2269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 2271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <E> Collection<E> unmodifiableCollection( 2272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Collection<? extends E> collection) { 2273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (collection == null) { 227486acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("collection == null"); 2275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableCollection<E>((Collection<E>) collection); 2277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2280f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a wrapper on the specified list which throws an 2281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code UnsupportedOperationException} whenever an attempt is made to 2282f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * modify the list. 2283f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 2285f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the list to wrap in an unmodifiable list. 2286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an unmodifiable List. 2287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 2289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <E> List<E> unmodifiableList(List<? extends E> list) { 2290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (list == null) { 229186acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("list == null"); 2292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (list instanceof RandomAccess) { 2294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableRandomAccessList<E>((List<E>) list); 2295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableList<E>((List<E>) list); 2297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2300f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a wrapper on the specified map which throws an 2301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code UnsupportedOperationException} whenever an attempt is made to 2302f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * modify the map. 2303f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param map 2305f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the map to wrap in an unmodifiable map. 2306f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return a unmodifiable map. 2307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 2309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <K, V> Map<K, V> unmodifiableMap( 2310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Map<? extends K, ? extends V> map) { 2311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (map == null) { 231286acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("map == null"); 2313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableMap<K, V>((Map<K, V>) map); 2315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2318f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a wrapper on the specified set which throws an 2319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code UnsupportedOperationException} whenever an attempt is made to 2320f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * modify the set. 2321f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param set 2323f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the set to wrap in an unmodifiable set. 2324f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return a unmodifiable set 2325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 2327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <E> Set<E> unmodifiableSet(Set<? extends E> set) { 2328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (set == null) { 232986acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("set == null"); 2330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableSet<E>((Set<E>) set); 2332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2335f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a wrapper on the specified sorted map which throws an 2336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code UnsupportedOperationException} whenever an attempt is made to 2337f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * modify the sorted map. 2338f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param map 2340f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the sorted map to wrap in an unmodifiable sorted map. 2341f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return a unmodifiable sorted map 2342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 2344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <K, V> SortedMap<K, V> unmodifiableSortedMap( 2345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SortedMap<K, ? extends V> map) { 2346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (map == null) { 234786acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("map == null"); 2348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableSortedMap<K, V>((SortedMap<K, V>) map); 2350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2353f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns a wrapper on the specified sorted set which throws an 2354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code UnsupportedOperationException} whenever an attempt is made to 2355f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * modify the sorted set. 2356f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param set 2358f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the sorted set to wrap in an unmodifiable sorted set. 2359f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return a unmodifiable sorted set. 2360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <E> SortedSet<E> unmodifiableSortedSet(SortedSet<E> set) { 2362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (set == null) { 236386acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("set == null"); 2364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new UnmodifiableSortedSet<E>(set); 2366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the number of elements in the {@code Collection} that match the 2370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Object} passed. If the {@code Object} is {@code null}, then the 2371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * number of {@code null} elements is returned. 2372f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param c 2374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code Collection} to search. 2375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param o 2376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code Object} to search for. 2377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of matching elements. 2378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 2379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the {@code Collection} parameter is {@code null}. 2380f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.5 2381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static int frequency(Collection<?> c, Object o) { 2383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c == null) { 238486acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("c == null"); 2385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c.isEmpty()) { 2387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; 2388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int result = 0; 2390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<?> itr = c.iterator(); 2391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (itr.hasNext()) { 2392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object e = itr.next(); 2393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (o == null ? e == null : o.equals(e)) { 2394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result++; 2395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 2398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a type-safe empty, immutable {@link List}. 2402f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an empty {@link List}. 2404f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.5 2405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #EMPTY_LIST 2406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 2408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final <T> List<T> emptyList() { 2409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return EMPTY_LIST; 2410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a type-safe empty, immutable {@link Set}. 2414f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an empty {@link Set}. 2416f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.5 2417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #EMPTY_SET 2418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 2420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final <T> Set<T> emptySet() { 2421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return EMPTY_SET; 2422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a type-safe empty, immutable {@link Map}. 2426f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an empty {@link Map}. 2428f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.5 2429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #EMPTY_MAP 2430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 2432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final <K, V> Map<K, V> emptyMap() { 2433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return EMPTY_MAP; 2434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2437e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * Returns an enumeration containing no elements. 2438e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * @hide 1.7 2439e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson */ 2440e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @SuppressWarnings("unchecked") 2441e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson public static <T> Enumeration<T> emptyEnumeration() { 2442e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson return (Enumeration<T>) EMPTY_ENUMERATION; 2443e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson } 2444e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson 2445e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson /** 2446e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * Returns an iterator containing no elements. 2447e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * @hide 1.7 2448e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson */ 2449e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @SuppressWarnings("unchecked") 2450e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson public static <T> Iterator<T> emptyIterator() { 2451e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson return (Iterator<T>) EMPTY_ITERATOR; 2452e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson } 2453e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson 2454e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson /** 2455e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * Returns a list iterator containing no elements. 2456e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * @hide 1.7 2457e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson */ 2458e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson public static <T> ListIterator<T> emptyListIterator() { 2459e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson return Collections.<T>emptyList().listIterator(); 2460e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson } 2461e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson 2462e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson /** 2463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a dynamically typesafe view of the specified collection. Trying 2464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to insert an element of the wrong type into this collection throws a 2465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ClassCastException}. At creation time the types in {@code c} are 2466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not checked for correct type. 2467f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param c 2469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the collection to be wrapped in a typesafe collection. 2470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type 2471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the elements permitted to insert. 2472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a typesafe collection. 2473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <E> Collection<E> checkedCollection(Collection<E> c, 2475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<E> type) { 2476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedCollection<E>(c, type); 2477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a dynamically typesafe view of the specified map. Trying to 2481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * insert an element of the wrong type into this map throws a 2482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ClassCastException}. At creation time the types in {@code m} are 2483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not checked for correct type. 2484f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param m 2486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the map to be wrapped in a typesafe map. 2487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param keyType 2488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the keys permitted to insert. 2489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param valueType 2490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the values permitted to insert. 2491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a typesafe map. 2492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <K, V> Map<K, V> checkedMap(Map<K, V> m, Class<K> keyType, 2494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<V> valueType) { 2495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedMap<K, V>(m, keyType, valueType); 2496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a dynamically typesafe view of the specified list. Trying to 2500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * insert an element of the wrong type into this list throws a 2501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ClassCastException}. At creation time the types in {@code list} 2502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * are not checked for correct type. 2503f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param list 2505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the list to be wrapped in a typesafe list. 2506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type 2507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the elements permitted to insert. 2508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a typesafe list. 2509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <E> List<E> checkedList(List<E> list, Class<E> type) { 2511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (list instanceof RandomAccess) { 2512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedRandomAccessList<E>(list, type); 2513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedList<E>(list, type); 2515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a dynamically typesafe view of the specified set. Trying to 2519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * insert an element of the wrong type into this set throws a 2520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ClassCastException}. At creation time the types in {@code s} are 2521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not checked for correct type. 2522f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param s 2524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the set to be wrapped in a typesafe set. 2525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type 2526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the elements permitted to insert. 2527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a typesafe set. 2528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <E> Set<E> checkedSet(Set<E> s, Class<E> type) { 2530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedSet<E>(s, type); 2531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a dynamically typesafe view of the specified sorted map. Trying 2535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to insert an element of the wrong type into this sorted map throws a 2536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ClassCastException}. At creation time the types in {@code m} are 2537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not checked for correct type. 2538f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param m 2540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the sorted map to be wrapped in a typesafe sorted map. 2541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param keyType 2542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the keys permitted to insert. 2543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param valueType 2544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the values permitted to insert. 2545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a typesafe sorted map. 2546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <K, V> SortedMap<K, V> checkedSortedMap(SortedMap<K, V> m, 2548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<K> keyType, Class<V> valueType) { 2549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedSortedMap<K, V>(m, keyType, valueType); 2550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a dynamically typesafe view of the specified sorted set. Trying 2554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to insert an element of the wrong type into this sorted set throws a 2555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ClassCastException}. At creation time the types in {@code s} are 2556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not checked for correct type. 2557f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param s 2559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the sorted set to be wrapped in a typesafe sorted set. 2560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type 2561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the elements permitted to insert. 2562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a typesafe sorted set. 2563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s, 2565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<E> type) { 2566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedSortedSet<E>(s, type); 2567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Adds all the specified elements to the specified collection. 2571f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param c 2573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the collection the elements are to be inserted into. 2574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param a 2575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the elements to insert. 2576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return true if the collection changed during insertion. 2577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnsupportedOperationException 2578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when the method is not supported. 2579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 2580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when {@code c} or {@code a} is {@code null}, or {@code a} 2581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contains one or more {@code null} elements and {@code c} 2582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * doesn't support {@code null} elements. 2583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 2584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if at least one of the elements can't be inserted into the 2585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * collection. 2586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static <T> boolean addAll(Collection<? super T> c, T... a) { 2588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean modified = false; 2589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < a.length; i++) { 2590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project modified |= c.add(a[i]); 2591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return modified; 2593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether the specified collections have no elements in common. 2597f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param c1 2599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the first collection. 2600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param c2 2601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the second collection. 2602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the collections have no elements in common, 2603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 2604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 2605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if one of the collections is {@code null}. 2606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static boolean disjoint(Collection<?> c1, Collection<?> c2) { 2608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((c1 instanceof Set) && !(c2 instanceof Set) 2609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project || (c2.size()) > c1.size()) { 2610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Collection<?> tmp = c1; 2611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c1 = c2; 2612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c2 = tmp; 2613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<?> it = c1.iterator(); 2615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (it.hasNext()) { 2616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c2.contains(it.next())) { 2617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 2618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 2621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Checks if specified object is instance of specified class. Used for a 2625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * dynamically typesafe view of the collections. 2626f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param obj - 2628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * object is to be checked 2629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type - 2630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class of object that should be 2631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return specified object 2632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 263355392539fea537abfb6581b474918f9d611fba27Jesse Wilson static <E> E checkType(E obj, Class<? extends E> type) { 263455392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (obj != null && !type.isInstance(obj)) { 263503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes throw new ClassCastException("Attempt to insert element of type " + obj.getClass() + 263603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes " into collection of type " + type); 2637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return obj; 2639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2642286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson * Returns a set backed by {@code map}. 2643286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson * 2644286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson * @throws IllegalArgumentException if the map is not empty 2645286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson * @since 1.6 2646286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson */ 2647286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) { 2648286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson if (map.isEmpty()) { 2649286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return new SetFromMap<E>(map); 2650286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2651286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson throw new IllegalArgumentException(); 2652286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2653286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2654286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson /** 2655286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson * Returns a last-in, first-out queue as a view of {@code deque}. 2656286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson * 2657286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson * @since 1.6 2658286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson */ 2659286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson public static <T> Queue<T> asLifoQueue(Deque<T> deque) { 2660286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return new AsLIFOQueue<T>(deque); 2661286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2662286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2663e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static class SetFromMap<E> extends AbstractSet<E> implements Serializable { 2664286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson private static final long serialVersionUID = 2454657854757543876L; 2665286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2666286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson // must named as it, to pass serialization compatibility test. 2667286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson private Map<E, Boolean> m; 2668286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2669286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson private transient Set<E> backingSet; 2670286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2671286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson SetFromMap(final Map<E, Boolean> map) { 2672286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson m = map; 2673286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson backingSet = map.keySet(); 2674286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2675286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2676e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean equals(Object object) { 2677286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return backingSet.equals(object); 2678286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2679286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2680e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int hashCode() { 2681286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return backingSet.hashCode(); 2682286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2683286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2684e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean add(E object) { 2685286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return m.put(object, Boolean.TRUE) == null; 2686286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2687286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2688e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void clear() { 2689286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson m.clear(); 2690286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2691286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2692e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public String toString() { 2693286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return backingSet.toString(); 2694286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2695286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2696e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean contains(Object object) { 2697286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return backingSet.contains(object); 2698286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2699286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2700e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsAll(Collection<?> collection) { 2701286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return backingSet.containsAll(collection); 2702286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2703286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2704e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean isEmpty() { 2705286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return m.isEmpty(); 2706286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2707286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2708e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean remove(Object object) { 2709286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return m.remove(object) != null; 2710286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2711286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2712e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean retainAll(Collection<?> collection) { 2713286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return backingSet.retainAll(collection); 2714286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2715286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2716e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Object[] toArray() { 2717286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return backingSet.toArray(); 2718286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2719286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2720286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson @Override 2721286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson public <T> T[] toArray(T[] contents) { 2722286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return backingSet.toArray(contents); 2723286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2724286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2725e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Iterator<E> iterator() { 2726286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return backingSet.iterator(); 2727286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2728286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2729e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 2730286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return m.size(); 2731286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2732286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2733286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson @SuppressWarnings("unchecked") 2734286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson private void readObject(ObjectInputStream stream) 2735286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson throws IOException, ClassNotFoundException { 2736286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson stream.defaultReadObject(); 2737286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson backingSet = m.keySet(); 2738286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2739286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2740286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 274132c2297a959b72abdb18743f0519e1d8b7c7ea88Elliott Hughes private static class AsLIFOQueue<E> extends AbstractQueue<E> implements Serializable { 2742286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson private static final long serialVersionUID = 1802017725587941708L; 2743286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2744286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson // must named as it, to pass serialization compatibility test. 2745286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson private final Deque<E> q; 2746286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2747286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson AsLIFOQueue(final Deque<E> deque) { 2748286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson this.q = deque; 2749286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2750286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2751e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Iterator<E> iterator() { 2752286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.iterator(); 2753286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2754286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2755e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 2756286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.size(); 2757286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2758286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2759e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean offer(E o) { 2760286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.offerFirst(o); 2761286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2762286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2763e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E peek() { 2764286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.peekFirst(); 2765286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2766286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2767e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E poll() { 2768286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.pollFirst(); 2769286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2770286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2771e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean add(E o) { 2772286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson q.push(o); 2773286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return true; 2774286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2775286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2776e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void clear() { 2777286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson q.clear(); 2778286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2779286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2780e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E element() { 2781286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.getFirst(); 2782286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2783286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2784e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E remove() { 2785286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.pop(); 2786286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2787286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2788e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean contains(Object object) { 2789286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.contains(object); 2790286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2791286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2792e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsAll(Collection<?> collection) { 2793286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.containsAll(collection); 2794286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2795286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2796e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean isEmpty() { 2797286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.isEmpty(); 2798286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2799286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2800e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean remove(Object object) { 2801286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.remove(object); 2802286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2803286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2804e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean removeAll(Collection<?> collection) { 2805286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.removeAll(collection); 2806286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2807286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2808e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean retainAll(Collection<?> collection) { 2809286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.retainAll(collection); 2810286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2811286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2812e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Object[] toArray() { 2813286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.toArray(); 2814286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2815286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2816e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public <T> T[] toArray(T[] contents) { 2817286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.toArray(contents); 2818286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2819286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2820e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public String toString() { 2821286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson return q.toString(); 2822286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2823286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson } 2824286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson 2825286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson /** 2826e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * A dynamically typesafe view of a Collection. 2827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2828e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static class CheckedCollection<E> implements Collection<E>, Serializable { 2829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 1578914078182001775L; 2831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Collection<E> c; 2833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<E> type; 2835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CheckedCollection(Collection<E> c, Class<E> type) { 283786acc043d3334651ee26c65467d78d6cefedd397Kenny Root if (c == null) { 283886acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("c == null"); 283986acc043d3334651ee26c65467d78d6cefedd397Kenny Root } else if (type == null) { 284086acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("type == null"); 2841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.c = c; 2843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.type = type; 2844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2846e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 2847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.size(); 2848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2850e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean isEmpty() { 2851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.isEmpty(); 2852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2854e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean contains(Object obj) { 2855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.contains(obj); 2856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2858e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Iterator<E> iterator() { 2859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<E> i = c.iterator(); 2860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (i instanceof ListIterator) { 2861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i = new CheckedListIterator<E>((ListIterator<E>) i, type); 2862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i; 2864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2866e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Object[] toArray() { 2867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.toArray(); 2868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2870e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public <T> T[] toArray(T[] arr) { 2871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.toArray(arr); 2872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2874e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean add(E obj) { 2875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.add(checkType(obj, type)); 2876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2878e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean remove(Object obj) { 2879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.remove(obj); 2880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2882e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsAll(Collection<?> c1) { 2883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.containsAll(c1); 2884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 2887e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean addAll(Collection<? extends E> c1) { 288855392539fea537abfb6581b474918f9d611fba27Jesse Wilson Object[] array = c1.toArray(); 288955392539fea537abfb6581b474918f9d611fba27Jesse Wilson for (Object o : array) { 289055392539fea537abfb6581b474918f9d611fba27Jesse Wilson checkType(o, type); 2891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 289255392539fea537abfb6581b474918f9d611fba27Jesse Wilson return c.addAll((List<E>) Arrays.asList(array)); 2893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2895e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean removeAll(Collection<?> c1) { 2896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.removeAll(c1); 2897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2899e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean retainAll(Collection<?> c1) { 2900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.retainAll(c1); 2901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2903e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void clear() { 2904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c.clear(); 2905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2907e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public String toString() { 2908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.toString(); 2909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Class represents a dynamically typesafe view of the specified 2914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ListIterator. 2915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class CheckedListIterator<E> implements ListIterator<E> { 2917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private ListIterator<E> i; 2919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Class<E> type; 2921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a dynamically typesafe view of the specified ListIterator. 2924f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param i - 2926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the listIterator for which a dynamically typesafe view to 2927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be constructed. 2928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CheckedListIterator(ListIterator<E> i, Class<E> type) { 2930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.i = i; 2931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.type = type; 2932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2934e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean hasNext() { 2935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i.hasNext(); 2936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2938e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E next() { 2939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i.next(); 2940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2942e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void remove() { 2943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i.remove(); 2944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2946e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean hasPrevious() { 2947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i.hasPrevious(); 2948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2950e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E previous() { 2951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i.previous(); 2952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2954e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int nextIndex() { 2955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i.nextIndex(); 2956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2958e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int previousIndex() { 2959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i.previousIndex(); 2960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2962e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void set(E obj) { 2963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i.set(checkType(obj, type)); 2964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2966e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void add(E obj) { 2967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i.add(checkType(obj, type)); 2968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2972e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * Class represents a dynamically typesafe view of a List. 2973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2974e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static class CheckedList<E> extends CheckedCollection<E> implements List<E> { 2975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 65247728283967356L; 2977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project List<E> l; 2979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CheckedList(List<E> l, Class<E> type) { 2981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(l, type); 2982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.l = l; 2983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 2986e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean addAll(int index, Collection<? extends E> c1) { 298755392539fea537abfb6581b474918f9d611fba27Jesse Wilson Object[] array = c1.toArray(); 298855392539fea537abfb6581b474918f9d611fba27Jesse Wilson for (Object o : array) { 298955392539fea537abfb6581b474918f9d611fba27Jesse Wilson checkType(o, type); 2990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 299155392539fea537abfb6581b474918f9d611fba27Jesse Wilson return l.addAll(index, (List<E>) Arrays.asList(array)); 2992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2994e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E get(int index) { 2995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return l.get(index); 2996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2998e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E set(int index, E obj) { 2999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return l.set(index, checkType(obj, type)); 3000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3002e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void add(int index, E obj) { 3003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project l.add(index, checkType(obj, type)); 3004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3006e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E remove(int index) { 3007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return l.remove(index); 3008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3010e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int indexOf(Object obj) { 3011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return l.indexOf(obj); 3012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3014e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int lastIndexOf(Object obj) { 3015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return l.lastIndexOf(obj); 3016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3018e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public ListIterator<E> listIterator() { 3019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedListIterator<E>(l.listIterator(), type); 3020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3022e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public ListIterator<E> listIterator(int index) { 3023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedListIterator<E>(l.listIterator(index), type); 3024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3026e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public List<E> subList(int fromIndex, int toIndex) { 3027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return checkedList(l.subList(fromIndex, toIndex), type); 3028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3030e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean equals(Object obj) { 3031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return l.equals(obj); 3032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3034e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int hashCode() { 3035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return l.hashCode(); 3036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3040e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * A dynamically typesafe view of a RandomAccessList. 3041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 3042e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static class CheckedRandomAccessList<E> extends CheckedList<E> implements RandomAccess { 3043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 1638200125423088369L; 3045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CheckedRandomAccessList(List<E> l, Class<E> type) { 3047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(l, type); 3048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3052e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * A dynamically typesafe view of a Set. 3053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 3054e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static class CheckedSet<E> extends CheckedCollection<E> implements Set<E> { 3055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 4694047833775013803L; 3057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CheckedSet(Set<E> s, Class<E> type) { 3059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(s, type); 3060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3062e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean equals(Object obj) { 3063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.equals(obj); 3064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3066e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int hashCode() { 3067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return c.hashCode(); 3068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3073e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * A dynamically typesafe view of a Map. 3074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 3075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class CheckedMap<K, V> implements Map<K, V>, Serializable { 3076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3077adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 5742860141034234728L; 3078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Map<K, V> m; 3080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<K> keyType; 3081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<V> valueType; 3082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private CheckedMap(Map<K, V> m, Class<K> keyType, Class<V> valueType) { 308486acc043d3334651ee26c65467d78d6cefedd397Kenny Root if (m == null) { 308586acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("m == null"); 308686acc043d3334651ee26c65467d78d6cefedd397Kenny Root } else if (keyType == null) { 308786acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("keyType == null"); 308886acc043d3334651ee26c65467d78d6cefedd397Kenny Root } else if (valueType == null) { 308986acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("valueType == null"); 3090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.m = m; 3092adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.keyType = keyType; 3093adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.valueType = valueType; 3094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3096e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 3097adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.size(); 3098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3100e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean isEmpty() { 3101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.isEmpty(); 3102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3104e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsKey(Object key) { 3105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.containsKey(key); 3106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3108e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsValue(Object value) { 3109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.containsValue(value); 3110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3112e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V get(Object key) { 3113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.get(key); 3114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3116e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V put(K key, V value) { 3117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.put(checkType(key, keyType), checkType(value, valueType)); 3118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3120e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V remove(Object key) { 3121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.remove(key); 3122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 3125e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void putAll(Map<? extends K, ? extends V> map) { 3126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int size = map.size(); 3127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (size == 0) { 3128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 3129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Map.Entry<? extends K, ? extends V>[] entries = new Map.Entry[size]; 3131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<? extends Map.Entry<? extends K, ? extends V>> it = map 3132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .entrySet().iterator(); 3133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size; i++) { 3134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Map.Entry<? extends K, ? extends V> e = it.next(); 3135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkType(e.getKey(), keyType); 3136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkType(e.getValue(), valueType); 3137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project entries[i] = e; 3138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size; i++) { 3140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project m.put(entries[i].getKey(), entries[i].getValue()); 3141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3144e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void clear() { 3145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project m.clear(); 3146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3148e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Set<K> keySet() { 3149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.keySet(); 3150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3152e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Collection<V> values() { 3153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.values(); 3154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3156e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Set<Map.Entry<K, V>> entrySet() { 3157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedEntrySet<K, V>(m.entrySet(), valueType); 3158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3160e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean equals(Object obj) { 3161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.equals(obj); 3162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3164e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int hashCode() { 3165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.hashCode(); 3166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3168e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public String toString() { 3169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return m.toString(); 3170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3173e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * A dynamically typesafe view of a Map.Entry. 3174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 3175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class CheckedEntry<K, V> implements Map.Entry<K, V> { 3176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Map.Entry<K, V> e; 3177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<V> valueType; 3178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CheckedEntry(Map.Entry<K, V> e, Class<V> valueType) { 3180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (e == null) { 318186acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("e == null"); 3182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.e = e; 3184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.valueType = valueType; 3185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3187e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public K getKey() { 3188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.getKey(); 3189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3191e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V getValue() { 3192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.getValue(); 3193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3195e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public V setValue(V obj) { 3196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.setValue(checkType(obj, valueType)); 3197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3199e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean equals(Object obj) { 3200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.equals(obj); 3201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3203e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int hashCode() { 3204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return e.hashCode(); 3205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3209e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * A dynamically typesafe view of an entry set. 3210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 3211e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static class CheckedEntrySet<K, V> implements Set<Map.Entry<K, V>> { 3212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Set<Map.Entry<K, V>> s; 3213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<V> valueType; 3214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CheckedEntrySet(Set<Map.Entry<K, V>> s, Class<V> valueType) { 3216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.s = s; 3217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.valueType = valueType; 3218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3220e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Iterator<Map.Entry<K, V>> iterator() { 3221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedEntryIterator<K, V>(s.iterator(), valueType); 3222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3224e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Object[] toArray() { 3225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int thisSize = size(); 3226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object[] array = new Object[thisSize]; 3227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<?> it = iterator(); 3228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < thisSize; i++) { 3229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project array[i] = it.next(); 3230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return array; 3232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 3235e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public <T> T[] toArray(T[] array) { 3236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int thisSize = size(); 3237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (array.length < thisSize) { 3238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?> ct = array.getClass().getComponentType(); 3239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project array = (T[]) Array.newInstance(ct, thisSize); 3240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<?> it = iterator(); 3242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < thisSize; i++) { 3243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project array[i] = (T) it.next(); 3244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (thisSize < array.length) { 3246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project array[thisSize] = null; 3247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return array; 3249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3251e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean retainAll(Collection<?> c) { 3252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s.retainAll(c); 3253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3255e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean removeAll(Collection<?> c) { 3256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s.removeAll(c); 3257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3259e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean containsAll(Collection<?> c) { 3260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s.containsAll(c); 3261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3263e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean addAll(Collection<? extends Map.Entry<K, V>> c) { 3264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 3265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3267e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean remove(Object o) { 3268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s.remove(o); 3269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3271e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean contains(Object o) { 3272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s.contains(o); 3273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3275e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean add(Map.Entry<K, V> o) { 3276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 3277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3279e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean isEmpty() { 3280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s.isEmpty(); 3281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3283e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void clear() { 3284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.clear(); 3285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3287e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int size() { 3288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s.size(); 3289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3291e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public int hashCode() { 3292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s.hashCode(); 3293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3295e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean equals(Object object) { 3296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s.equals(object); 3297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3300e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * A dynamically typesafe view of an entry iterator. 3301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 3302e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static class CheckedEntryIterator<K, V> implements Iterator<Map.Entry<K, V>> { 3303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Iterator<Map.Entry<K, V>> i; 3304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<V> valueType; 3305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CheckedEntryIterator(Iterator<Map.Entry<K, V>> i, 3307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<V> valueType) { 3308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.i = i; 3309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.valueType = valueType; 3310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3312e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public boolean hasNext() { 3313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i.hasNext(); 3314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3316e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public void remove() { 3317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i.remove(); 3318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3320e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Map.Entry<K, V> next() { 3321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedEntry<K, V>(i.next(), valueType); 3322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3328e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * A dynamically typesafe view of a SortedSet. 3329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 3330e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson private static class CheckedSortedSet<E> extends CheckedSet<E> implements SortedSet<E> { 3331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 1599911165492914959L; 3332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private SortedSet<E> ss; 3333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CheckedSortedSet(SortedSet<E> s, Class<E> type) { 3335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(s, type); 3336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.ss = s; 3337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3339e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Comparator<? super E> comparator() { 3340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ss.comparator(); 3341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3343e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedSet<E> subSet(E fromElement, E toElement) { 3344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedSortedSet<E>(ss.subSet(fromElement, toElement), 3345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project type); 3346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3348e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedSet<E> headSet(E toElement) { 3349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedSortedSet<E>(ss.headSet(toElement), type); 3350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3352e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedSet<E> tailSet(E fromElement) { 3353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CheckedSortedSet<E>(ss.tailSet(fromElement), type); 3354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3356e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E first() { 3357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ss.first(); 3358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3360e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public E last() { 3361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ss.last(); 3362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3366e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson * A dynamically typesafe view of a SortedMap. 3367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 3368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class CheckedSortedMap<K, V> extends CheckedMap<K, V> 3369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implements SortedMap<K, V> { 3370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 1599671320688067438L; 3371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SortedMap<K, V> sm; 3372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CheckedSortedMap(SortedMap<K, V> m, Class<K> keyType, Class<V> valueType) { 3374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(m, keyType, valueType); 3375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.sm = m; 3376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3378e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public Comparator<? super K> comparator() { 3379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sm.comparator(); 3380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3382e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedMap<K, V> subMap(K fromKey, K toKey) { 3383e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson return new CheckedSortedMap<K, V>(sm.subMap(fromKey, toKey), keyType, valueType); 3384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3386e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedMap<K, V> headMap(K toKey) { 3387e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson return new CheckedSortedMap<K, V>(sm.headMap(toKey), keyType, valueType); 3388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3390e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public SortedMap<K, V> tailMap(K fromKey) { 3391e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson return new CheckedSortedMap<K, V>(sm.tailMap(fromKey), keyType, valueType); 3392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3394e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public K firstKey() { 3395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sm.firstKey(); 3396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3398e3cd663de1c5fa4651500289e6df9150667e2db9Jesse Wilson @Override public K lastKey() { 3399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sm.lastKey(); 3400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 3402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 3403