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