1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.util;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ObjectOutputStream;
2272e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilsonimport java.io.ObjectStreamException;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.Serializable;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.Array;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.luni.internal.nls.Messages;
2709133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilsonimport org.apache.harmony.luni.util.Msg;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code Collections} contains static methods which operate on
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@code Collection} classes.
323819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson *
333819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson * @since 1.2
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Collections {
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final class CopiesList<E> extends AbstractList<E> implements
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Serializable {
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 2739099268398711800L;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final int n;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final E element;
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CopiesList(int length, E object) {
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (length < 0) {
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new IllegalArgumentException();
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            n = length;
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            element = object;
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean contains(Object object) {
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return element == null ? object == null : element.equals(object);
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int size() {
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return n;
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E get(int location) {
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (0 <= location && location < n) {
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return element;
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final class EmptyList extends AbstractList implements
743819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            RandomAccess, Serializable {
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 8842843931221139166L;
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean contains(Object object) {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int size() {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 0;
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Object get(int location) {
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private Object readResolve() {
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return Collections.EMPTY_LIST;
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final class EmptySet extends AbstractSet implements
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Serializable {
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 1582296315990362920L;
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean contains(Object object) {
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int size() {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 0;
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Iterator iterator() {
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new Iterator() {
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public boolean hasNext() {
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return false;
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public Object next() {
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new NoSuchElementException();
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public void remove() {
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new UnsupportedOperationException();
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private Object readResolve() {
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return Collections.EMPTY_SET;
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final class EmptyMap extends AbstractMap implements
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Serializable {
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 6428348081105594320L;
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean containsKey(Object key) {
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean containsValue(Object value) {
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Set entrySet() {
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return EMPTY_SET;
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Object get(Object key) {
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Set keySet() {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return EMPTY_SET;
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Collection values() {
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return EMPTY_LIST;
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private Object readResolve() {
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return Collections.EMPTY_MAP;
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * An empty immutable instance of {@link List}.
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final List EMPTY_LIST = new EmptyList();
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * An empty immutable instance of {@link Set}.
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final Set EMPTY_SET = new EmptySet();
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * An empty immutable instance of {@link Map}.
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final Map EMPTY_MAP = new EmptyMap();
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19272e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson    /**
19372e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson     * This class is a singleton so that equals() and hashCode() work properly.
19472e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson     */
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final class ReverseComparator<T> implements Comparator<T>,
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Serializable {
19772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
19872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        private static final ReverseComparator<Object> INSTANCE
19972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                = new ReverseComparator<Object>();
20072e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 7207038068494060240L;
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @SuppressWarnings("unchecked")
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int compare(T o1, T o2) {
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Comparable<T> c2 = (Comparable<T>) o2;
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c2.compareTo(o1);
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
20872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
20972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        private Object readResolve() throws ObjectStreamException {
21072e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            return INSTANCE;
21172e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        }
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final class ReverseComparatorWithComparator<T> implements
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Comparator<T>, Serializable {
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 4374092139857L;
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final Comparator<T> comparator;
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ReverseComparatorWithComparator(Comparator<T> comparator) {
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super();
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.comparator = comparator;
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int compare(T o1, T o2) {
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return comparator.compare(o2, o1);
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
22872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
22972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        @Override
23072e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        public boolean equals(Object o) {
23172e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            return o instanceof ReverseComparatorWithComparator
23272e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                    && ((ReverseComparatorWithComparator) o).comparator
23372e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                            .equals(comparator);
23472e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        }
23572e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
23672e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        @Override
23772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        public int hashCode() {
23872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            return ~comparator.hashCode();
23972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        }
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final class SingletonSet<E> extends AbstractSet<E> implements
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Serializable {
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 3193687207550431679L;
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final E element;
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SingletonSet(E object) {
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            element = object;
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean contains(Object object) {
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return element == null ? object == null : element.equals(object);
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int size() {
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 1;
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Iterator<E> iterator() {
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new Iterator<E>() {
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                boolean hasNext = true;
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public boolean hasNext() {
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return hasNext;
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public E next() {
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (hasNext) {
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        hasNext = false;
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return element;
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new NoSuchElementException();
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public void remove() {
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new UnsupportedOperationException();
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final class SingletonList<E> extends AbstractList<E>
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            implements Serializable {
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 3093736618740652951L;
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final E element;
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SingletonList(E object) {
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            element = object;
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean contains(Object object) {
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return element == null ? object == null : element.equals(object);
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E get(int location) {
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (location == 0) {
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return element;
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int size() {
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 1;
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final class SingletonMap<K, V> extends AbstractMap<K, V>
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            implements Serializable {
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = -6979724477215052911L;
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final K k;
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final V v;
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SingletonMap(K key, V value) {
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            k = key;
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            v = value;
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean containsKey(Object key) {
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return k == null ? key == null : k.equals(key);
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean containsValue(Object value) {
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return v == null ? value == null : v.equals(value);
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public V get(Object key) {
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (containsKey(key)) {
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return v;
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int size() {
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 1;
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Set<Map.Entry<K, V>> entrySet() {
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new AbstractSet<Map.Entry<K, V>>() {
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public boolean contains(Object object) {
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (object instanceof Map.Entry) {
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        Map.Entry<?, ?> entry = (Map.Entry<?, ?>) object;
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return containsKey(entry.getKey())
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                && containsValue(entry.getValue());
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return false;
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public int size() {
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return 1;
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public Iterator<Map.Entry<K, V>> iterator() {
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return new Iterator<Map.Entry<K, V>>() {
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        boolean hasNext = true;
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public boolean hasNext() {
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            return hasNext;
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public Map.Entry<K, V> next() {
37972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                            if (!hasNext) {
38072e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                                throw new NoSuchElementException();
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            }
38272e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
38372e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                            hasNext = false;
38472e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                            return new MapEntry<K, V>(k, v) {
38572e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                                @Override
38672e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                                public V setValue(V value) {
38772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                                    throw new UnsupportedOperationException();
38872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                                }
38972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                            };
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        public void remove() {
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            throw new UnsupportedOperationException();
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    };
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class SynchronizedCollection<E> implements Collection<E>,
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Serializable {
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 3053995032091335093L;
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final Collection<E> c;
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final Object mutex;
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedCollection(Collection<E> collection) {
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c = collection;
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mutex = this;
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedCollection(Collection<E> collection, Object mutex) {
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c = collection;
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.mutex = mutex;
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean add(E object) {
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.add(object);
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean addAll(Collection<? extends E> collection) {
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.addAll(collection);
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void clear() {
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                c.clear();
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean contains(Object object) {
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.contains(object);
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean containsAll(Collection<?> collection) {
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.containsAll(collection);
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean isEmpty() {
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.isEmpty();
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Iterator<E> iterator() {
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.iterator();
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean remove(Object object) {
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.remove(object);
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean removeAll(Collection<?> collection) {
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.removeAll(collection);
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean retainAll(Collection<?> collection) {
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.retainAll(collection);
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int size() {
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.size();
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public java.lang.Object[] toArray() {
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.toArray();
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String toString() {
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.toString();
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public <T> T[] toArray(T[] array) {
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.toArray(array);
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private void writeObject(ObjectOutputStream stream) throws IOException {
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stream.defaultWriteObject();
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class SynchronizedRandomAccessList<E> extends SynchronizedList<E>
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            implements RandomAccess {
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 1530674583602358482L;
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedRandomAccessList(List<E> l) {
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(l);
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedRandomAccessList(List<E> l, Object mutex) {
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(l, mutex);
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public List<E> subList(int start, int end) {
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new SynchronizedRandomAccessList<E>(list.subList(start,
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        end), mutex);
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Replaces this SynchronizedRandomAccessList with a SynchronizedList so
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * that JREs before 1.4 can deserialize this object without any
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * problems. This is necessary since RandomAccess API was introduced
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * only in 1.4.
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * <p>
5373819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @return SynchronizedList
5393819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see SynchronizedList#readResolve()
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private Object writeReplace() {
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new SynchronizedList<E>(list);
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class SynchronizedList<E> extends SynchronizedCollection<E>
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            implements List<E> {
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = -7754090372962971524L;
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final List<E> list;
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedList(List<E> l) {
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(l);
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            list = l;
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedList(List<E> l, Object mutex) {
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(l, mutex);
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            list = l;
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void add(int location, E object) {
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                list.add(location, object);
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean addAll(int location, Collection<? extends E> collection) {
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return list.addAll(location, collection);
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean equals(Object object) {
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return list.equals(object);
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E get(int location) {
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return list.get(location);
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int hashCode() {
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return list.hashCode();
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int indexOf(Object object) {
5963819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            final int size;
5973819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            final Object[] array;
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
5993819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                size = list.size();
6003819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                array = new Object[size];
6013819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                list.toArray(array);
6023819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            }
6033819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            if (null != object)
6043819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                for (int i = 0; i < size; i++) {
6053819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                    if (object.equals(array[i])) {
6063819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                        return i;
6073819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                    }
6083819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                }
6093819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            else {
6103819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                for (int i = 0; i < size; i++) {
6113819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                    if (null == array[i]) {
6123819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                        return i;
6133819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                    }
6143819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                }
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
6163819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            return -1;
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int lastIndexOf(Object object) {
6203819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            final int size;
6213819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            final Object[] array;
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
6233819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                size = list.size();
6243819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                array = new Object[size];
6253819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                list.toArray(array);
6263819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            }
6273819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            if (null != object)
6283819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                for (int i = size - 1; i >= 0; i--) {
6293819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                    if (object.equals(array[i])) {
6303819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                        return i;
6313819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                    }
6323819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                }
6333819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            else {
6343819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                for (int i = size - 1; i >= 0; i--) {
6353819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                    if (null == array[i]) {
6363819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                        return i;
6373819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                    }
6383819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                }
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
6403819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            return -1;
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public ListIterator<E> listIterator() {
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return list.listIterator();
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public ListIterator<E> listIterator(int location) {
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return list.listIterator(location);
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E remove(int location) {
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return list.remove(location);
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E set(int location, E object) {
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return list.set(location, object);
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public List<E> subList(int start, int end) {
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new SynchronizedList<E>(list.subList(start, end), mutex);
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private void writeObject(ObjectOutputStream stream) throws IOException {
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stream.defaultWriteObject();
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Resolves SynchronizedList instances to SynchronizedRandomAccessList
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * instances if the underlying list is a Random Access list.
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * <p>
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * This is necessary since SynchronizedRandomAccessList instances are
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * replaced with SynchronizedList instances during serialization for
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * compliance with JREs before 1.4.
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * <p>
6873819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @return a SynchronizedList instance if the underlying list implements
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *         RandomAccess interface, or this same object if not.
6903819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see SynchronizedRandomAccessList#writeReplace()
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private Object readResolve() {
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (list instanceof RandomAccess) {
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new SynchronizedRandomAccessList<E>(list, mutex);
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return this;
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class SynchronizedMap<K, V> implements Map<K, V>, Serializable {
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 1978198479659022715L;
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final Map<K, V> m;
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final Object mutex;
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedMap(Map<K, V> map) {
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            m = map;
710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mutex = this;
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedMap(Map<K, V> map, Object mutex) {
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            m = map;
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.mutex = mutex;
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void clear() {
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                m.clear();
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean containsKey(Object key) {
725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return m.containsKey(key);
727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean containsValue(Object value) {
731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return m.containsValue(value);
733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Set<Map.Entry<K, V>> entrySet() {
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new SynchronizedSet<Map.Entry<K, V>>(m.entrySet(), mutex);
739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean equals(Object object) {
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return m.equals(object);
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public V get(Object key) {
750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return m.get(key);
752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int hashCode() {
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return m.hashCode();
759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean isEmpty() {
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return m.isEmpty();
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Set<K> keySet() {
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new SynchronizedSet<K>(m.keySet(), mutex);
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public V put(K key, V value) {
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return m.put(key, value);
777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void putAll(Map<? extends K, ? extends V> map) {
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                m.putAll(map);
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public V remove(Object key) {
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return m.remove(key);
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int size() {
793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return m.size();
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Collection<V> values() {
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new SynchronizedCollection<V>(m.values(), mutex);
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String toString() {
806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return m.toString();
808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private void writeObject(ObjectOutputStream stream) throws IOException {
812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stream.defaultWriteObject();
814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class SynchronizedSet<E> extends SynchronizedCollection<E> implements
819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Set<E> {
820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 487447009682186044L;
821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedSet(Set<E> set) {
823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(set);
824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedSet(Set<E> set, Object mutex) {
827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(set, mutex);
828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean equals(Object object) {
832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.equals(object);
834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int hashCode() {
839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return c.hashCode();
841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private void writeObject(ObjectOutputStream stream) throws IOException {
845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stream.defaultWriteObject();
847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class SynchronizedSortedMap<K, V> extends SynchronizedMap<K, V>
852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            implements SortedMap<K, V> {
853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = -8798146769416483793L;
854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final SortedMap<K, V> sm;
856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedSortedMap(SortedMap<K, V> map) {
858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(map);
859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sm = map;
860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedSortedMap(SortedMap<K, V> map, Object mutex) {
863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(map, mutex);
864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sm = map;
865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Comparator<? super K> comparator() {
868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return sm.comparator();
870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public K firstKey() {
874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return sm.firstKey();
876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedMap<K, V> headMap(K endKey) {
880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new SynchronizedSortedMap<K, V>(sm.headMap(endKey),
882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        mutex);
883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public K lastKey() {
887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return sm.lastKey();
889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedMap<K, V> subMap(K startKey, K endKey) {
893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new SynchronizedSortedMap<K, V>(sm.subMap(startKey,
895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        endKey), mutex);
896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedMap<K, V> tailMap(K startKey) {
900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new SynchronizedSortedMap<K, V>(sm.tailMap(startKey),
902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        mutex);
903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private void writeObject(ObjectOutputStream stream) throws IOException {
907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stream.defaultWriteObject();
909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class SynchronizedSortedSet<E> extends SynchronizedSet<E> implements
914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            SortedSet<E> {
915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 8695801310862127406L;
916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final SortedSet<E> ss;
918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedSortedSet(SortedSet<E> set) {
920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(set);
921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ss = set;
922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SynchronizedSortedSet(SortedSet<E> set, Object mutex) {
925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(set, mutex);
926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ss = set;
927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Comparator<? super E> comparator() {
930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return ss.comparator();
932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E first() {
936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return ss.first();
938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedSet<E> headSet(E end) {
942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new SynchronizedSortedSet<E>(ss.headSet(end), mutex);
944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E last() {
948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return ss.last();
950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedSet<E> subSet(E start, E end) {
954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new SynchronizedSortedSet<E>(ss.subSet(start, end),
956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        mutex);
957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedSet<E> tailSet(E start) {
961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new SynchronizedSortedSet<E>(ss.tailSet(start), mutex);
963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private void writeObject(ObjectOutputStream stream) throws IOException {
967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            synchronized (mutex) {
968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stream.defaultWriteObject();
969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class UnmodifiableCollection<E> implements Collection<E>,
974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Serializable {
975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 1820017752578914078L;
976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final Collection<E> c;
978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        UnmodifiableCollection(Collection<E> collection) {
980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c = collection;
981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean add(E object) {
984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean addAll(Collection<? extends E> collection) {
988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void clear() {
992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean contains(Object object) {
996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.contains(object);
997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean containsAll(Collection<?> collection) {
1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.containsAll(collection);
1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean isEmpty() {
1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.isEmpty();
1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Iterator<E> iterator() {
1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new Iterator<E>() {
1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Iterator<E> iterator = c.iterator();
1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public boolean hasNext() {
1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return iterator.hasNext();
1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public E next() {
1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return iterator.next();
1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public void remove() {
1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new UnsupportedOperationException();
1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean remove(Object object) {
1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean removeAll(Collection<?> collection) {
1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean retainAll(Collection<?> collection) {
1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int size() {
1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.size();
1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Object[] toArray() {
1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.toArray();
1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public <T> T[] toArray(T[] array) {
1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.toArray(array);
1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String toString() {
1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.toString();
1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class UnmodifiableRandomAccessList<E> extends
1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            UnmodifiableList<E> implements RandomAccess {
1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = -2542308836966382001L;
1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        UnmodifiableRandomAccessList(List<E> l) {
1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(l);
1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public List<E> subList(int start, int end) {
1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new UnmodifiableRandomAccessList<E>(list.subList(start, end));
1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Replaces this UnmodifiableRandomAccessList with an UnmodifiableList
1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * so that JREs before 1.4 can deserialize this object without any
1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * problems. This is necessary since RandomAccess API was introduced
1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * only in 1.4.
1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * <p>
10743819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @return UnmodifiableList
10763819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see UnmodifiableList#readResolve()
1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private Object writeReplace() {
1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new UnmodifiableList<E>(list);
1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class UnmodifiableList<E> extends UnmodifiableCollection<E>
1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            implements List<E> {
1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = -283967356065247728L;
1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final List<E> list;
1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        UnmodifiableList(List<E> l) {
1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(l);
1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            list = l;
1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void add(int location, E object) {
1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean addAll(int location, Collection<? extends E> collection) {
1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean equals(Object object) {
1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return list.equals(object);
1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E get(int location) {
1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return list.get(location);
1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int hashCode() {
1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return list.hashCode();
1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int indexOf(Object object) {
1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return list.indexOf(object);
1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int lastIndexOf(Object object) {
1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return list.lastIndexOf(object);
1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public ListIterator<E> listIterator() {
1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return listIterator(0);
1127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public ListIterator<E> listIterator(final int location) {
1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new ListIterator<E>() {
1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ListIterator<E> iterator = list.listIterator(location);
1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public void add(E object) {
1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new UnsupportedOperationException();
1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public boolean hasNext() {
1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return iterator.hasNext();
1139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public boolean hasPrevious() {
1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return iterator.hasPrevious();
1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public E next() {
1146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return iterator.next();
1147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public int nextIndex() {
1150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return iterator.nextIndex();
1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public E previous() {
1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return iterator.previous();
1155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public int previousIndex() {
1158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return iterator.previousIndex();
1159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public void remove() {
1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new UnsupportedOperationException();
1163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public void set(E object) {
1166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new UnsupportedOperationException();
1167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
1169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E remove(int location) {
1172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
1173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E set(int location, E object) {
1176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
1177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public List<E> subList(int start, int end) {
1180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new UnmodifiableList<E>(list.subList(start, end));
1181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
1184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Resolves UnmodifiableList instances to UnmodifiableRandomAccessList
1185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * instances if the underlying list is a Random Access list.
1186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * <p>
1187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * This is necessary since UnmodifiableRandomAccessList instances are
1188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * replaced with UnmodifiableList instances during serialization for
1189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * compliance with JREs before 1.4.
1190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * <p>
11913819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
1192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @return an UnmodifiableList instance if the underlying list
1193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *         implements RandomAccess interface, or this same object if
1194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *         not.
11953819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
1196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see UnmodifiableRandomAccessList#writeReplace()
1197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
1198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private Object readResolve() {
1199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (list instanceof RandomAccess) {
1200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new UnmodifiableRandomAccessList<E>(list);
1201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return this;
1203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class UnmodifiableMap<K, V> implements Map<K, V>,
1207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Serializable {
1208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = -1034234728574286014L;
1209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final Map<K, V> m;
1211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static class UnmodifiableEntrySet<K, V> extends
1213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                UnmodifiableSet<Map.Entry<K, V>> {
1214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            private static final long serialVersionUID = 7854390611657943733L;
1215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            private static class UnmodifiableMapEntry<K, V> implements
1217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Map.Entry<K, V> {
1218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Map.Entry<K, V> mapEntry;
1219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                UnmodifiableMapEntry(Map.Entry<K, V> entry) {
1221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    mapEntry = entry;
1222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
1225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public boolean equals(Object object) {
1226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return mapEntry.equals(object);
1227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public K getKey() {
1230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return mapEntry.getKey();
1231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public V getValue() {
1234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return mapEntry.getValue();
1235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
1238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public int hashCode() {
1239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return mapEntry.hashCode();
1240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public V setValue(V object) {
1243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new UnsupportedOperationException();
1244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                @Override
1247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public String toString() {
1248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return mapEntry.toString();
1249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            UnmodifiableEntrySet(Set<Map.Entry<K, V>> set) {
1253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                super(set);
1254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            @Override
1257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public Iterator<Map.Entry<K, V>> iterator() {
1258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new Iterator<Map.Entry<K, V>>() {
1259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Iterator<Map.Entry<K, V>> iterator = c.iterator();
1260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    public boolean hasNext() {
1262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return iterator.hasNext();
1263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
1264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    public Map.Entry<K, V> next() {
1266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return new UnmodifiableMapEntry<K, V>(iterator.next());
1267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
1268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    public void remove() {
1270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        throw new UnsupportedOperationException();
1271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
1272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                };
1273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            @Override
1276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public Object[] toArray() {
1277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int length = c.size();
1278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Object[] result = new Object[length];
1279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Iterator<?> it = iterator();
1280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (int i = length; --i >= 0;) {
1281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    result[i] = it.next();
1282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return result;
1284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            @Override
1287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            @SuppressWarnings("unchecked")
1288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public <T> T[] toArray(T[] contents) {
1289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int size = c.size(), index = 0;
1290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Iterator<Map.Entry<K, V>> it = iterator();
1291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (size > contents.length) {
1292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Class<?> ct = contents.getClass().getComponentType();
129372e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                    contents = (T[]) java.lang.reflect.Array.newInstance(ct, size);
1294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                while (index < size) {
1296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    contents[index++] = (T) it.next();
1297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (index < contents.length) {
1299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    contents[index] = null;
1300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return contents;
1302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        UnmodifiableMap(Map<K, V> map) {
1306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            m = map;
1307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void clear() {
1310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
1311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean containsKey(Object key) {
1314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.containsKey(key);
1315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean containsValue(Object value) {
1318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.containsValue(value);
1319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Set<Map.Entry<K, V>> entrySet() {
1322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new UnmodifiableEntrySet<K, V>(m.entrySet());
1323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
1326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean equals(Object object) {
1327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.equals(object);
1328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public V get(Object key) {
1331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.get(key);
1332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
1335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int hashCode() {
1336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.hashCode();
1337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean isEmpty() {
1340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.isEmpty();
1341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Set<K> keySet() {
1344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new UnmodifiableSet<K>(m.keySet());
1345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public V put(K key, V value) {
1348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
1349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void putAll(Map<? extends K, ? extends V> map) {
1352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
1353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public V remove(Object key) {
1356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new UnsupportedOperationException();
1357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int size() {
1360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.size();
1361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Collection<V> values() {
1364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new UnmodifiableCollection<V>(m.values());
1365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
1368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String toString() {
1369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.toString();
1370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
1374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            implements Set<E> {
1375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = -9215047833775013803L;
1376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        UnmodifiableSet(Set<E> set) {
1378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(set);
1379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
1382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean equals(Object object) {
1383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.equals(object);
1384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
1387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int hashCode() {
1388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.hashCode();
1389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class UnmodifiableSortedMap<K, V> extends
1393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            UnmodifiableMap<K, V> implements SortedMap<K, V> {
1394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = -8806743815996713206L;
1395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final SortedMap<K, V> sm;
1397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        UnmodifiableSortedMap(SortedMap<K, V> map) {
1399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(map);
1400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sm = map;
1401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Comparator<? super K> comparator() {
1404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return sm.comparator();
1405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public K firstKey() {
1408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return sm.firstKey();
1409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedMap<K, V> headMap(K before) {
1412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new UnmodifiableSortedMap<K, V>(sm.headMap(before));
1413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public K lastKey() {
1416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return sm.lastKey();
1417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedMap<K, V> subMap(K start, K end) {
1420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new UnmodifiableSortedMap<K, V>(sm.subMap(start, end));
1421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedMap<K, V> tailMap(K after) {
1424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new UnmodifiableSortedMap<K, V>(sm.tailMap(after));
1425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class UnmodifiableSortedSet<E> extends UnmodifiableSet<E>
1429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            implements SortedSet<E> {
1430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = -4929149591599911165L;
1431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final SortedSet<E> ss;
1433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        UnmodifiableSortedSet(SortedSet<E> set) {
1435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(set);
1436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ss = set;
1437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Comparator<? super E> comparator() {
1440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return ss.comparator();
1441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E first() {
1444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return ss.first();
1445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedSet<E> headSet(E before) {
1448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new UnmodifiableSortedSet<E>(ss.headSet(before));
1449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E last() {
1452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return ss.last();
1453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedSet<E> subSet(E start, E end) {
1456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new UnmodifiableSortedSet<E>(ss.subSet(start, end));
1457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedSet<E> tailSet(E after) {
1460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new UnmodifiableSortedSet<E>(ss.tailSet(after));
1461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private Collections() {
1465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /* empty */
1466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Performs a binary search for the specified element in the specified
14703819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * sorted list. The list needs to be already sorted in natural sorting
1471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * order. Searching in an unsorted array has an undefined result. It's also
1472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * undefined which element is found if there are multiple occurrences of the
1473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * same element.
14743819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
14763819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the sorted list to search.
1477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param object
1478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the element to find.
1479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the non-negative index of the element, or a negative index which
1480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         is the {@code -index - 1} where the element would be inserted
1481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ClassCastException
1482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if an element in the List or the search element does not
1483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             implement Comparable, or cannot be compared to each other.
1484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
1486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> int binarySearch(
1487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            List<? extends Comparable<? super T>> list, T object) {
1488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (list == null) {
1489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
1490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (list.isEmpty()) {
1492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -1;
1493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
14953819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson
1496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!(list instanceof RandomAccess)) {
14973819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            ListIterator<? extends Comparable<? super T>> it = list.listIterator();
1498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
1499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int result;
15003819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                if ((result = -it.next().compareTo(object)) <= 0) {
1501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (result == 0) {
1502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return it.previousIndex();
1503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
1504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return -it.previousIndex() - 1;
1505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -list.size() - 1;
1508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int low = 0, mid = list.size(), high = mid - 1, result = -1;
1511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (low <= high) {
1512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mid = (low + high) >> 1;
15133819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            if ((result = -list.get(mid).compareTo(object)) > 0) {
1514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                low = mid + 1;
1515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (result == 0) {
1516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return mid;
1517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
1518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                high = mid - 1;
1519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return -mid - (result < 0 ? 1 : 2);
1522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Performs a binary search for the specified element in the specified
15263819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * sorted list using the specified comparator. The list needs to be already
1527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * sorted according to the comparator passed. Searching in an unsorted array
1528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * has an undefined result. It's also undefined which element is found if
1529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * there are multiple occurrences of the same element.
15303819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
1532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the sorted List to search.
1533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param object
1534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the element to find.
1535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param comparator
15363819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the comparator. If the comparator is {@code null} then the
1537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            search uses the objects' natural ordering.
1538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the non-negative index of the element, or a negative index which
1539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         is the {@code -index - 1} where the element would be inserted.
1540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ClassCastException
1541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             when an element in the list and the searched element cannot
15423819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             be compared to each other using the comparator.
1543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
15453819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson    // BEGIN android-note
15463819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson    // removed "@param <T> The element type", which is rejected by apicheck
15473819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson    // END android-note
1548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> int binarySearch(List<? extends T> list, T object,
1549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Comparator<? super T> comparator) {
1550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (comparator == null) {
1551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return Collections.binarySearch(
1552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    (List<? extends Comparable<? super T>>) list, object);
1553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!(list instanceof RandomAccess)) {
1555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ListIterator<? extends T> it = list.listIterator();
1556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
1557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int result;
15583819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                if ((result = -comparator.compare(it.next(), object)) <= 0) {
1559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (result == 0) {
1560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return it.previousIndex();
1561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
1562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return -it.previousIndex() - 1;
1563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
1564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -list.size() - 1;
1566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int low = 0, mid = list.size(), high = mid - 1, result = -1;
1569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (low <= high) {
1570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mid = (low + high) >> 1;
15713819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            if ((result = -comparator.compare(list.get(mid),object)) > 0) {
1572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                low = mid + 1;
1573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (result == 0) {
1574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return mid;
1575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
1576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                high = mid - 1;
1577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return -mid - (result < 0 ? 1 : 2);
1580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Copies the elements from the source list to the destination list. At the
1584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * end both lists will have the same objects at the same index. If the
1585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination array is larger than the source list, the elements in the
1586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination list with {@code index >= source.size()} will be unchanged.
15873819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param destination
1589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the list whose elements are set from the source list.
1590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param source
1591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the list with the elements to be copied into the destination.
1592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IndexOutOfBoundsException
15933819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             when the destination list is smaller than the source list.
1594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
1595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             when replacing an element in the destination list is not
1596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             supported.
1597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> void copy(List<? super T> destination,
1599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            List<? extends T> source) {
1600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (destination.size() < source.size()) {
160109133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson            // K0032=Source size {0} does not fit into destination
160209133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson            throw new ArrayIndexOutOfBoundsException(Msg.getString("K0032", source.size())); //$NON-NLS-1$
1603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<? extends T> srcIt = source.iterator();
1605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ListIterator<? super T> destIt = destination.listIterator();
1606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (srcIt.hasNext()) {
1607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
1608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                destIt.next();
1609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchElementException e) {
161009133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson                // K0032=Source size {0} does not fit into destination
161109133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson                throw new ArrayIndexOutOfBoundsException(Msg.getString("K0032", source.size())); //$NON-NLS-1$
1612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            destIt.set(srcIt.next());
1614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an {@code Enumeration} on the specified collection.
16193819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param collection
1621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the collection to enumerate.
1622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return an Enumeration.
1623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> Enumeration<T> enumeration(Collection<T> collection) {
1625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final Collection<T> c = collection;
1626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new Enumeration<T>() {
1627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Iterator<T> it = c.iterator();
1628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public boolean hasMoreElements() {
1630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return it.hasNext();
1631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public T nextElement() {
1634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return it.next();
1635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
1637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
16403819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Fills the specified list with the specified element.
16413819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
16433819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the list to fill.
1644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param object
1645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the element to fill the list with.
1646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
1647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             when replacing an element in the List is not supported.
1648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> void fill(List<? super T> list, T object) {
1650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ListIterator<? super T> it = list.listIterator();
1651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (it.hasNext()) {
1652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            it.next();
1653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            it.set(object);
1654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
16583819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Searches the specified collection for the maximum element.
16593819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param collection
16613819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the collection to search.
1662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the maximum element in the Collection.
1663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ClassCastException
16643819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             when an element in the collection does not implement
1665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             {@code Comparable} or elements cannot be compared to each
1666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             other.
1667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T extends Object & Comparable<? super T>> T max(
1669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Collection<? extends T> collection) {
1670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<? extends T> it = collection.iterator();
1671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        T max = it.next();
1672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (it.hasNext()) {
1673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            T next = it.next();
1674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (max.compareTo(next) < 0) {
1675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                max = next;
1676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return max;
1679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
16823819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Searches the specified collection for the maximum element using the
16833819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * specified comparator.
16843819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param collection
16863819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the collection to search.
1687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param comparator
16883819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the comparator.
1689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the maximum element in the Collection.
1690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ClassCastException
16913819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             when elements in the collection cannot be compared to each
1692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             other using the {@code Comparator}.
1693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> T max(Collection<? extends T> collection,
1695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Comparator<? super T> comparator) {
169672e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        if (comparator == null) {
169772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            @SuppressWarnings("unchecked") // null comparator? T is comparable
169872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            T result = (T) max((Collection<Comparable>) collection);
169972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            return result;
170072e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        }
170172e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
1702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<? extends T> it = collection.iterator();
1703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        T max = it.next();
1704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (it.hasNext()) {
1705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            T next = it.next();
1706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (comparator.compare(max, next) < 0) {
1707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                max = next;
1708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return max;
1711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
17143819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Searches the specified collection for the minimum element.
17153819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param collection
17173819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the collection to search.
17183819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return the minimum element in the collection.
1719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ClassCastException
17203819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             when an element in the collection does not implement
1721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             {@code Comparable} or elements cannot be compared to each
1722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             other.
1723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T extends Object & Comparable<? super T>> T min(
1725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Collection<? extends T> collection) {
1726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<? extends T> it = collection.iterator();
1727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        T min = it.next();
1728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (it.hasNext()) {
1729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            T next = it.next();
1730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (min.compareTo(next) > 0) {
1731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                min = next;
1732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return min;
1735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
17383819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Searches the specified collection for the minimum element using the
17393819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * specified comparator.
17403819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param collection
17423819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the collection to search.
1743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param comparator
17443819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the comparator.
17453819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return the minimum element in the collection.
1746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ClassCastException
17473819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             when elements in the collection cannot be compared to each
1748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             other using the {@code Comparator}.
1749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> T min(Collection<? extends T> collection,
1751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Comparator<? super T> comparator) {
175272e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        if (comparator == null) {
175372e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            @SuppressWarnings("unchecked") // null comparator? T is comparable
175472e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            T result = (T) min((Collection<Comparable>) collection);
175572e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            return result;
175672e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        }
175772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson
1758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<? extends T> it = collection.iterator();
1759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        T min = it.next();
1760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (it.hasNext()) {
1761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            T next = it.next();
1762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (comparator.compare(min, next) > 0) {
1763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                min = next;
1764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return min;
1767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
17703819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a list containing the specified number of the specified element.
1771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The list cannot be modified. The list is serializable.
17723819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param length
1774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the size of the returned list.
1775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param object
1776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the element to be added {@code length} times to a list.
17773819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return a list containing {@code length} copies of the element.
1778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
1779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             when {@code length < 0}.
1780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> List<T> nCopies(final int length, T object) {
1782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new CopiesList<T>(length, object);
1783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Modifies the specified {@code List} by reversing the order of the
1787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * elements.
17883819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
17903819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the list to reverse.
1791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
1792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             when replacing an element in the List is not supported.
1793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
1795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void reverse(List<?> list) {
1796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int size = list.size();
1797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ListIterator<Object> front = (ListIterator<Object>) list.listIterator();
1798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ListIterator<Object> back = (ListIterator<Object>) list
1799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                .listIterator(size);
1800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < size / 2; i++) {
1801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object frontNext = front.next();
1802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object backPrev = back.previous();
1803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            front.set(backPrev);
1804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            back.set(frontNext);
1805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
18093819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * A comparator which reverses the natural order of the elements. The
1810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code Comparator} that's returned is {@link Serializable}.
18113819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a {@code Comparator} instance.
1813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see Comparator
1814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see Comparable
1815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see Serializable
1816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
181772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson    @SuppressWarnings("unchecked")
1818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> Comparator<T> reverseOrder() {
181972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        return (Comparator) ReverseComparator.INSTANCE;
1820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a {@link Comparator} that reverses the order of the
1824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code Comparator} passed. If the {@code Comparator} passed is
1825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code null}, then this method is equivalent to {@link #reverseOrder()}.
1826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
1827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The {@code Comparator} that's returned is {@link Serializable} if the
1828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code Comparator} passed is serializable or {@code null}.
18293819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param c
1831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the {@code Comparator} to reverse or {@code null}.
1832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a {@code Comparator} instance.
1833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see Comparator
18343819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @since 1.5
1835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> Comparator<T> reverseOrder(Comparator<T> c) {
1837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (c == null) {
1838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return reverseOrder();
1839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
184072e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        if (c instanceof ReverseComparatorWithComparator) {
184172e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            return ((ReverseComparatorWithComparator<T>) c).comparator;
184272e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        }
1843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new ReverseComparatorWithComparator<T>(c);
1844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
18473819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Moves every element of the list to a random new position in the list.
18483819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
1850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the List to shuffle.
18513819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
1853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             when replacing an element in the List is not supported.
1854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void shuffle(List<?> list) {
1856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        shuffle(list, new Random());
1857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
18603819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Moves every element of the list to a random new position in the list
1861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * using the specified random number generator.
18623819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
18643819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the list to shuffle.
1865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param random
1866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the random number generator.
1867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
18683819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             when replacing an element in the list is not supported.
1869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void shuffle(List<?> list, Random random) {
187109133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson        @SuppressWarnings("unchecked") // we won't put foreign objects in
187209133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson        final List<Object> objectList = (List<Object>) list;
187309133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson
187409133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson        if (list instanceof RandomAccess) {
187509133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson            for (int i = objectList.size() - 1; i > 0; i--) {
187609133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson                int index = random.nextInt(i + 1);
187709133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson                objectList.set(index, objectList.set(i, objectList.get(index)));
187809133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson            }
187909133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson        } else {
188009133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson            Object[] array = objectList.toArray();
1881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = array.length - 1; i > 0; i--) {
18823819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson                int index = random.nextInt(i + 1);
1883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Object temp = array[i];
1884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                array[i] = array[index];
1885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                array[index] = temp;
1886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int i = 0;
188909133811f94298bf72a3bf6ee605f60e7b1b2c81Jesse Wilson            ListIterator<Object> it = objectList.listIterator();
1890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (it.hasNext()) {
1891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                it.next();
1892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                it.set(array[i++]);
1893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
18983819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a set containing the specified element. The set cannot be
1899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * modified. The set is serializable.
19003819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param object
1902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the element.
19033819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return a set containing the element.
1904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <E> Set<E> singleton(E object) {
1906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new SingletonSet<E>(object);
1907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
19103819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a list containing the specified element. The list cannot be
1911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * modified. The list is serializable.
19123819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param object
1914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the element.
19153819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return a list containing the element.
1916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <E> List<E> singletonList(E object) {
1918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new SingletonList<E>(object);
1919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a Map containing the specified key and value. The map cannot be
1923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * modified. The map is serializable.
19243819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key
1926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the key.
1927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
1928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the value.
1929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a Map containing the key and value.
1930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <K, V> Map<K, V> singletonMap(K key, V value) {
1932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new SingletonMap<K, V>(key, value);
1933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
19363819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Sorts the specified list in ascending natural order. The algorithm is
1937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * stable which means equal elements don't get reordered.
19383819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
19403819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the list to be sorted.
1941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ClassCastException
1942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             when an element in the List does not implement Comparable or
1943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             elements cannot be compared to each other.
1944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
1946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T extends Comparable<? super T>> void sort(List<T> list) {
1947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object[] array = list.toArray();
1948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Arrays.sort(array);
1949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int i = 0;
1950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ListIterator<T> it = list.listIterator();
1951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (it.hasNext()) {
1952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            it.next();
1953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            it.set((T) array[i++]);
1954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
19583819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Sorts the specified list using the specified comparator. The algorithm is
1959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * stable which means equal elements don't get reordered.
19603819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
19623819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the list to be sorted.
1963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param comparator
19643819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the comparator.
1965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ClassCastException
19663819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             when elements in the list cannot be compared to each other
19673819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             using the comparator.
1968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
1970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> void sort(List<T> list, Comparator<? super T> comparator) {
1971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        T[] array = list.toArray((T[]) new Object[list.size()]);
1972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Arrays.sort(array, comparator);
1973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int i = 0;
1974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ListIterator<T> it = list.listIterator();
1975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (it.hasNext()) {
1976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            it.next();
1977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            it.set(array[i++]);
1978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
19823819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Swaps the elements of list {@code list} at indices {@code index1} and
1983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code index2}.
19843819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
19863819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the list to manipulate.
1987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index1
1988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            position of the first element to swap with the element in
1989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            index2.
1990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index2
1991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            position of the other element.
19923819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
1993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IndexOutOfBoundsException
1994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if index1 or index2 is out of range of this list.
19953819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @since 1.4
1996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
1998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void swap(List<?> list, int index1, int index2) {
1999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (list == null) {
2000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
20023819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        final int size = list.size();
20033819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        if (index1 < 0 || index1 >= size || index2 < 0 || index2 >= size) {
20043819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson            throw new IndexOutOfBoundsException();
20053819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson        }
2006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (index1 == index2) {
2007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
2008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<Object> rawList = (List<Object>) list;
2010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        rawList.set(index2, rawList.set(index1, rawList.get(index2)));
2011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Replaces all occurrences of Object {@code obj} in {@code list} with
2015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code newObj}. If the {@code obj} is {@code null}, then all
2016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * occurrences of {@code null} are replaced with {@code newObj}.
20173819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
20193819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the list to modify.
2020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param obj
20213819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the object to find and replace occurrences of.
2022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param obj2
20233819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the object to replace all occurrences of {@code obj} in
2024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            {@code list}.
2025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return true, if at least one occurrence of {@code obj} has been found in
2026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         {@code list}.
2027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
2028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the list does not support setting elements.
2029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> boolean replaceAll(List<T> list, T obj, T obj2) {
2031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int index;
2032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean found = false;
2033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while ((index = list.indexOf(obj)) > -1) {
2035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            found = true;
2036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            list.set(index, obj2);
2037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return found;
2039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
20423819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Rotates the elements in {@code list} by the distance {@code dist}
2043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
2044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * e.g. for a given list with elements [1, 2, 3, 4, 5, 6, 7, 8, 9, 0],
2045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calling rotate(list, 3) or rotate(list, -7) would modify the list to look
2046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * like this: [8, 9, 0, 1, 2, 3, 4, 5, 6, 7]
20473819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param lst
2049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the list whose elements are to be rotated.
2050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param dist
2051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            is the distance the list is rotated. This can be any valid
2052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            integer. Negative values rotate the list backwards.
2053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
2055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void rotate(List<?> lst, int dist) {
2056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<Object> list = (List<Object>) lst;
2057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int size = list.size();
2058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Can't sensibly rotate an empty collection
2060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (size == 0) {
2061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
2062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // normalize the distance
2065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int normdist;
2066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (dist > 0) {
2067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            normdist = dist % size;
2068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
2069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            normdist = size - ((dist % size) * (-1));
2070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (normdist == 0 || normdist == size) {
2073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
2074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (list instanceof RandomAccess) {
2077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // make sure each element gets juggled
2078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // with the element in the position it is supposed to go to
2079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object temp = list.get(0);
2080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int index = 0, beginIndex = 0;
2081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < size; i++) {
2082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                index = (index + normdist) % size;
2083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                temp = list.set(index, temp);
2084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (index == beginIndex) {
2085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    index = ++beginIndex;
2086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    temp = list.get(beginIndex);
2087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
2088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
2089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
2090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int divideIndex = (size - normdist) % size;
2091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            List<Object> sublist1 = list.subList(0, divideIndex);
2092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            List<Object> sublist2 = list.subList(divideIndex, size);
2093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            reverse(sublist1);
2094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            reverse(sublist2);
2095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            reverse(list);
2096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Searches the {@code list} for {@code sublist} and returns the beginning
2101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * index of the first occurrence.
2102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
2103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * -1 is returned if the {@code sublist} does not exist in {@code list}.
21043819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
2106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the List to search {@code sublist} in.
2107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param sublist
2108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the List to search in {@code list}.
2109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the beginning index of the first occurrence of {@code sublist} in
2110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         {@code list}, or -1.
2111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static int indexOfSubList(List<?> list, List<?> sublist) {
2113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int size = list.size();
2114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int sublistSize = sublist.size();
2115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sublistSize > size) {
2117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -1;
2118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sublistSize == 0) {
2121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 0;
2122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // find the first element of sublist in the list to get a head start
2125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object firstObj = sublist.get(0);
2126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int index = list.indexOf(firstObj);
2127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (index == -1) {
2128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -1;
2129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (index < size && (size - index >= sublistSize)) {
2132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ListIterator<?> listIt = list.listIterator(index);
2133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if ((firstObj == null) ? listIt.next() == null : firstObj
2135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    .equals(listIt.next())) {
2136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // iterate through the elements in sublist to see
2138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // if they are included in the same order in the list
2139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ListIterator<?> sublistIt = sublist.listIterator(1);
2140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                boolean difFound = false;
2141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                while (sublistIt.hasNext()) {
2142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Object element = sublistIt.next();
2143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (!listIt.hasNext()) {
2144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return -1;
2145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
2146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if ((element == null) ? listIt.next() != null : !element
2147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            .equals(listIt.next())) {
2148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        difFound = true;
2149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        break;
2150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
2151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
2152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // All elements of sublist are found in main list
2153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // starting from index.
2154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (!difFound) {
2155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return index;
2156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
2157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
2158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // This was not the sequence we were looking for,
2159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // continue search for the firstObj in main list
2160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // at the position after index.
2161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            index++;
2162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return -1;
2164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Searches the {@code list} for {@code sublist} and returns the beginning
2168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * index of the last occurrence.
2169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
2170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * -1 is returned if the {@code sublist} does not exist in {@code list}.
21713819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
21733819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the list to search {@code sublist} in.
2174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param sublist
21753819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the list to search in {@code list}.
2176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the beginning index of the last occurrence of {@code sublist} in
2177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         {@code list}, or -1.
2178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static int lastIndexOfSubList(List<?> list, List<?> sublist) {
2180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int sublistSize = sublist.size();
2181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int size = list.size();
2182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sublistSize > size) {
2184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -1;
2185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sublistSize == 0) {
2188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return size;
2189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // find the last element of sublist in the list to get a head start
2192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object lastObj = sublist.get(sublistSize - 1);
2193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int index = list.lastIndexOf(lastObj);
2194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while ((index > -1) && (index + 1 >= sublistSize)) {
2196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ListIterator<?> listIt = list.listIterator(index + 1);
2197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if ((lastObj == null) ? listIt.previous() == null : lastObj
2199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    .equals(listIt.previous())) {
2200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // iterate through the elements in sublist to see
2201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // if they are included in the same order in the list
2202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ListIterator<?> sublistIt = sublist
2203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .listIterator(sublistSize - 1);
2204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                boolean difFound = false;
2205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                while (sublistIt.hasPrevious()) {
2206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Object element = sublistIt.previous();
2207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (!listIt.hasPrevious()) {
2208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return -1;
2209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
2210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if ((element == null) ? listIt.previous() != null
2211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            : !element.equals(listIt.previous())) {
2212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        difFound = true;
2213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        break;
2214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
2215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
2216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // All elements of sublist are found in main list
2217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // starting from listIt.nextIndex().
2218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (!difFound) {
2219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return listIt.nextIndex();
2220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
2221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
2222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // This was not the sequence we were looking for,
2223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // continue search for the lastObj in main list
2224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // at the position before index.
2225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            index--;
2226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return -1;
2228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
22313819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns an {@code ArrayList} with all the elements in the {@code
22323819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * enumeration}. The elements in the returned {@code ArrayList} are in the
2233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * same order as in the {@code enumeration}.
22343819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param enumeration
2236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the source {@link Enumeration}.
2237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return an {@code ArrayList} from {@code enumeration}.
2238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> ArrayList<T> list(Enumeration<T> enumeration) {
2240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ArrayList<T> list = new ArrayList<T>();
2241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (enumeration.hasMoreElements()) {
2242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            list.add(enumeration.nextElement());
2243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return list;
2245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
22483819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a wrapper on the specified collection which synchronizes all
22493819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * access to the collection.
22503819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param collection
2252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the Collection to wrap in a synchronized collection.
2253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a synchronized Collection.
2254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> Collection<T> synchronizedCollection(
2256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Collection<T> collection) {
2257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (collection == null) {
2258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new SynchronizedCollection<T>(collection);
2261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a wrapper on the specified List which synchronizes all access to
2265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the List.
22663819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
2268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the List to wrap in a synchronized list.
2269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a synchronized List.
2270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> List<T> synchronizedList(List<T> list) {
2272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (list == null) {
2273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (list instanceof RandomAccess) {
2276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new SynchronizedRandomAccessList<T>(list);
2277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new SynchronizedList<T>(list);
2279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
22823819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a wrapper on the specified map which synchronizes all access to
22833819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * the map.
22843819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param map
22863819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the map to wrap in a synchronized map.
2287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a synchronized Map.
2288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <K, V> Map<K, V> synchronizedMap(Map<K, V> map) {
2290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (map == null) {
2291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new SynchronizedMap<K, V>(map);
2294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
22973819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a wrapper on the specified set which synchronizes all access to
22983819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * the set.
22993819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param set
23013819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the set to wrap in a synchronized set.
23023819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return a synchronized set.
2303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <E> Set<E> synchronizedSet(Set<E> set) {
2305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (set == null) {
2306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new SynchronizedSet<E>(set);
2309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
23123819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a wrapper on the specified sorted map which synchronizes all
23133819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * access to the sorted map.
23143819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param map
23163819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the sorted map to wrap in a synchronized sorted map.
23173819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return a synchronized sorted map.
2318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <K, V> SortedMap<K, V> synchronizedSortedMap(
2320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            SortedMap<K, V> map) {
2321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (map == null) {
2322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new SynchronizedSortedMap<K, V>(map);
2325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
23283819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a wrapper on the specified sorted set which synchronizes all
23293819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * access to the sorted set.
23303819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param set
23323819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the sorted set to wrap in a synchronized sorted set.
23333819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return a synchronized sorted set.
2334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <E> SortedSet<E> synchronizedSortedSet(SortedSet<E> set) {
2336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (set == null) {
2337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new SynchronizedSortedSet<E>(set);
2340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
23433819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a wrapper on the specified collection which throws an
2344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code UnsupportedOperationException} whenever an attempt is made to
23453819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * modify the collection.
23463819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param collection
23483819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the collection to wrap in an unmodifiable collection.
23493819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return an unmodifiable collection.
2350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
2352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <E> Collection<E> unmodifiableCollection(
2353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Collection<? extends E> collection) {
2354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (collection == null) {
2355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new UnmodifiableCollection<E>((Collection<E>) collection);
2358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
23613819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a wrapper on the specified list which throws an
2362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code UnsupportedOperationException} whenever an attempt is made to
23633819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * modify the list.
23643819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
23663819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the list to wrap in an unmodifiable list.
2367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return an unmodifiable List.
2368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
2370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <E> List<E> unmodifiableList(List<? extends E> list) {
2371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (list == null) {
2372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (list instanceof RandomAccess) {
2375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new UnmodifiableRandomAccessList<E>((List<E>) list);
2376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new UnmodifiableList<E>((List<E>) list);
2378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
23813819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a wrapper on the specified map which throws an
2382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code UnsupportedOperationException} whenever an attempt is made to
23833819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * modify the map.
23843819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param map
23863819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the map to wrap in an unmodifiable map.
23873819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return a unmodifiable map.
2388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
2390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <K, V> Map<K, V> unmodifiableMap(
2391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Map<? extends K, ? extends V> map) {
2392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (map == null) {
2393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new UnmodifiableMap<K, V>((Map<K, V>) map);
2396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
23993819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a wrapper on the specified set which throws an
2400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code UnsupportedOperationException} whenever an attempt is made to
24013819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * modify the set.
24023819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param set
24043819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the set to wrap in an unmodifiable set.
24053819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return a unmodifiable set
2406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
2408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <E> Set<E> unmodifiableSet(Set<? extends E> set) {
2409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (set == null) {
2410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new UnmodifiableSet<E>((Set<E>) set);
2413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
24163819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a wrapper on the specified sorted map which throws an
2417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code UnsupportedOperationException} whenever an attempt is made to
24183819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * modify the sorted map.
24193819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param map
24213819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the sorted map to wrap in an unmodifiable sorted map.
24223819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return a unmodifiable sorted map
2423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
2425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <K, V> SortedMap<K, V> unmodifiableSortedMap(
2426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            SortedMap<K, ? extends V> map) {
2427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (map == null) {
2428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new UnmodifiableSortedMap<K, V>((SortedMap<K, V>) map);
2431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
24343819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns a wrapper on the specified sorted set which throws an
2435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code UnsupportedOperationException} whenever an attempt is made to
24363819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * modify the sorted set.
24373819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param set
24393819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the sorted set to wrap in an unmodifiable sorted set.
24403819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return a unmodifiable sorted set.
2441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <E> SortedSet<E> unmodifiableSortedSet(SortedSet<E> set) {
2443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (set == null) {
2444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new UnmodifiableSortedSet<E>(set);
2447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the number of elements in the {@code Collection} that match the
2451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code Object} passed. If the {@code Object} is {@code null}, then the
2452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * number of {@code null} elements is returned.
24533819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param c
2455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the {@code Collection} to search.
2456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param o
2457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the {@code Object} to search for.
2458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the number of matching elements.
2459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException
2460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the {@code Collection} parameter is {@code null}.
24613819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @since 1.5
2462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static int frequency(Collection<?> c, Object o) {
2464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (c == null) {
2465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
2466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (c.isEmpty()) {
2468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 0;
2469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int result = 0;
2471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<?> itr = c.iterator();
2472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (itr.hasNext()) {
2473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object e = itr.next();
2474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (o == null ? e == null : o.equals(e)) {
2475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                result++;
2476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
2477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
2479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a type-safe empty, immutable {@link List}.
24833819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return an empty {@link List}.
24853819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @since 1.5
2486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #EMPTY_LIST
2487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
2489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final <T> List<T> emptyList() {
2490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return EMPTY_LIST;
2491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a type-safe empty, immutable {@link Set}.
24953819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return an empty {@link Set}.
24973819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @since 1.5
2498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #EMPTY_SET
2499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
2501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final <T> Set<T> emptySet() {
2502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return EMPTY_SET;
2503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a type-safe empty, immutable {@link Map}.
25073819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return an empty {@link Map}.
25093819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @since 1.5
2510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #EMPTY_MAP
2511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
2513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final <K, V> Map<K, V> emptyMap() {
2514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return EMPTY_MAP;
2515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a dynamically typesafe view of the specified collection. Trying
2519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to insert an element of the wrong type into this collection throws a
2520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code ClassCastException}. At creation time the types in {@code c} are
2521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * not checked for correct type.
25223819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param c
2524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the collection to be wrapped in a typesafe collection.
2525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param type
2526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the type of the elements permitted to insert.
2527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a typesafe collection.
2528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <E> Collection<E> checkedCollection(Collection<E> c,
2530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class<E> type) {
2531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new CheckedCollection<E>(c, type);
2532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a dynamically typesafe view of the specified map. Trying to
2536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * insert an element of the wrong type into this map throws a
2537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code ClassCastException}. At creation time the types in {@code m} are
2538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * not checked for correct type.
25393819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param m
2541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the map to be wrapped in a typesafe map.
2542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param keyType
2543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the type of the keys permitted to insert.
2544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param valueType
2545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the type of the values permitted to insert.
2546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a typesafe map.
2547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <K, V> Map<K, V> checkedMap(Map<K, V> m, Class<K> keyType,
2549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class<V> valueType) {
2550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new CheckedMap<K, V>(m, keyType, valueType);
2551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a dynamically typesafe view of the specified list. Trying to
2555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * insert an element of the wrong type into this list throws a
2556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code ClassCastException}. At creation time the types in {@code list}
2557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * are not checked for correct type.
25583819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param list
2560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the list to be wrapped in a typesafe list.
2561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param type
2562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the type of the elements permitted to insert.
2563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a typesafe list.
2564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <E> List<E> checkedList(List<E> list, Class<E> type) {
2566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (list instanceof RandomAccess) {
2567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new CheckedRandomAccessList<E>(list, type);
2568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new CheckedList<E>(list, type);
2570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a dynamically typesafe view of the specified set. Trying to
2574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * insert an element of the wrong type into this set throws a
2575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code ClassCastException}. At creation time the types in {@code s} are
2576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * not checked for correct type.
25773819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param s
2579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the set to be wrapped in a typesafe set.
2580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param type
2581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the type of the elements permitted to insert.
2582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a typesafe set.
2583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <E> Set<E> checkedSet(Set<E> s, Class<E> type) {
2585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new CheckedSet<E>(s, type);
2586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a dynamically typesafe view of the specified sorted map. Trying
2590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to insert an element of the wrong type into this sorted map throws a
2591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code ClassCastException}. At creation time the types in {@code m} are
2592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * not checked for correct type.
25933819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param m
2595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the sorted map to be wrapped in a typesafe sorted map.
2596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param keyType
2597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the type of the keys permitted to insert.
2598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param valueType
2599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the type of the values permitted to insert.
2600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a typesafe sorted map.
2601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <K, V> SortedMap<K, V> checkedSortedMap(SortedMap<K, V> m,
2603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class<K> keyType, Class<V> valueType) {
2604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new CheckedSortedMap<K, V>(m, keyType, valueType);
2605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a dynamically typesafe view of the specified sorted set. Trying
2609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to insert an element of the wrong type into this sorted set throws a
2610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code ClassCastException}. At creation time the types in {@code s} are
2611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * not checked for correct type.
26123819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param s
2614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the sorted set to be wrapped in a typesafe sorted set.
2615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param type
2616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the type of the elements permitted to insert.
2617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a typesafe sorted set.
2618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s,
2620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class<E> type) {
2621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new CheckedSortedSet<E>(s, type);
2622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Adds all the specified elements to the specified collection.
26263819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param c
2628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the collection the elements are to be inserted into.
2629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param a
2630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the elements to insert.
2631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return true if the collection changed during insertion.
2632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws UnsupportedOperationException
2633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             when the method is not supported.
2634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException
2635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             when {@code c} or {@code a} is {@code null}, or {@code a}
2636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             contains one or more {@code null} elements and {@code c}
2637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             doesn't support {@code null} elements.
2638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
2639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if at least one of the elements can't be inserted into the
2640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             collection.
2641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static <T> boolean addAll(Collection<? super T> c, T... a) {
2643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean modified = false;
2644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < a.length; i++) {
2645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            modified |= c.add(a[i]);
2646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return modified;
2648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns whether the specified collections have no elements in common.
26523819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param c1
2654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the first collection.
2655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param c2
2656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the second collection.
2657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if the collections have no elements in common,
2658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         {@code false} otherwise.
2659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NullPointerException
2660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if one of the collections is {@code null}.
2661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static boolean disjoint(Collection<?> c1, Collection<?> c2) {
2663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ((c1 instanceof Set) && !(c2 instanceof Set)
2664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                || (c2.size()) > c1.size()) {
2665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Collection<?> tmp = c1;
2666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c1 = c2;
2667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c2 = tmp;
2668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<?> it = c1.iterator();
2670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (it.hasNext()) {
2671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (c2.contains(it.next())) {
2672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return false;
2673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
2674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return true;
2676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Checks if specified object is instance of specified class. Used for a
2680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * dynamically typesafe view of the collections.
26813819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *
2682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param obj -
2683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            object is to be checked
2684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param type -
2685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            class of object that should be
2686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return specified object
2687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
268872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson    static <E> E checkType(E obj, Class<? extends E> type) {
268972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson        if (obj != null && !type.isInstance(obj)) {
2690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // luni.05=Attempt to insert {0} element into collection with
2691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // element type {1}
2692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new ClassCastException(Messages.getString(
2693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "luni.05", obj.getClass(), type)); //$NON-NLS-1$
2694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return obj;
2696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class represents a dynamically typesafe view of the specified collection.
2700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class CheckedCollection<E> implements Collection<E>,
2702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Serializable {
2703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 1578914078182001775L;
2705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Collection<E> c;
2707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class<E> type;
2709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Constructs a dynamically typesafe view of the specified collection.
27123819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
2713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @param c -
2714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            the collection for which an unmodifiable view is to be
2715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            constructed.
2716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public CheckedCollection(Collection<E> c, Class<E> type) {
2718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (c == null || type == null) {
2719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new NullPointerException();
2720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
2721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.c = c;
2722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.type = type;
2723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Collection#size()
2727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int size() {
2729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.size();
2730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Collection#isEmpty()
2734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean isEmpty() {
2736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.isEmpty();
2737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Collection#contains(Object)
2741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean contains(Object obj) {
2743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.contains(obj);
2744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Collection#iterator()
2748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Iterator<E> iterator() {
2750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Iterator<E> i = c.iterator();
2751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (i instanceof ListIterator) {
2752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                i = new CheckedListIterator<E>((ListIterator<E>) i, type);
2753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
2754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return i;
2755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Collection#toArray()
2759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Object[] toArray() {
2761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.toArray();
2762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Collection#toArray(Object[])
2766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public <T> T[] toArray(T[] arr) {
2768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.toArray(arr);
2769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Collection#add(Object)
2773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean add(E obj) {
2775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.add(checkType(obj, type));
2776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Collection#remove(Object)
2780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean remove(Object obj) {
2782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.remove(obj);
2783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Collection#containsAll(Collection)
2787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean containsAll(Collection<?> c1) {
2789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.containsAll(c1);
2790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Collection#addAll(Collection)
2794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @SuppressWarnings("unchecked")
2796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean addAll(Collection<? extends E> c1) {
279772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            Object[] array = c1.toArray();
279872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            for (Object o : array) {
279972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                checkType(o, type);
2800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
280172e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            return c.addAll((List<E>) Arrays.asList(array));
2802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Collection#removeAll(Collection)
2806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean removeAll(Collection<?> c1) {
2808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.removeAll(c1);
2809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Collection#retainAll(Collection)
2813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean retainAll(Collection<?> c1) {
2815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.retainAll(c1);
2816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Collection#clear()
2820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void clear() {
2822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.clear();
2823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.lang.Object#toString()
2827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
2829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String toString() {
2830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.toString();
2831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class represents a dynamically typesafe view of the specified
2836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ListIterator.
2837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class CheckedListIterator<E> implements ListIterator<E> {
2839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private ListIterator<E> i;
2841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private Class<E> type;
2843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Constructs a dynamically typesafe view of the specified ListIterator.
28463819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
2847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @param i -
2848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            the listIterator for which a dynamically typesafe view to
2849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            be constructed.
2850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public CheckedListIterator(ListIterator<E> i, Class<E> type) {
2852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.i = i;
2853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.type = type;
2854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Iterator#hasNext()
2858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean hasNext() {
2860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return i.hasNext();
2861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Iterator#next()
2865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E next() {
2867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return i.next();
2868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Iterator#remove()
2872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void remove() {
2874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            i.remove();
2875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.ListIterator#hasPrevious()
2879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean hasPrevious() {
2881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return i.hasPrevious();
2882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.ListIterator#previous()
2886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E previous() {
2888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return i.previous();
2889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.ListIterator#nextIndex()
2893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int nextIndex() {
2895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return i.nextIndex();
2896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.ListIterator#previousIndex()
2900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int previousIndex() {
2902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return i.previousIndex();
2903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.ListIterator#set(Object)
2907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void set(E obj) {
2909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            i.set(checkType(obj, type));
2910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.ListIterator#add(Object)
2914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void add(E obj) {
2916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            i.add(checkType(obj, type));
2917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
2919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class represents a dynamically typesafe view of the specified list.
2922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class CheckedList<E> extends CheckedCollection<E> implements
2924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            List<E> {
2925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 65247728283967356L;
2927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<E> l;
2929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Constructs a dynamically typesafe view of the specified list.
29323819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
2933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @param l -
2934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            the list for which a dynamically typesafe view is to be
2935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            constructed.
2936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public CheckedList(List<E> l, Class<E> type) {
2938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(l, type);
2939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.l = l;
2940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.List#addAll(int, Collection)
2944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @SuppressWarnings("unchecked")
2946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean addAll(int index, Collection<? extends E> c1) {
294772e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            Object[] array = c1.toArray();
294872e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            for (Object o : array) {
294972e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson                checkType(o, type);
2950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
295172e7c5a8d32494c81206971d4c1077e3f2b88f00Jesse Wilson            return l.addAll(index, (List<E>) Arrays.asList(array));
2952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.List#get(int)
2956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E get(int index) {
2958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return l.get(index);
2959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.List#set(int, Object)
2963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E set(int index, E obj) {
2965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return l.set(index, checkType(obj, type));
2966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.List#add(int, Object)
2970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void add(int index, E obj) {
2972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            l.add(index, checkType(obj, type));
2973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.List#remove(int)
2977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E remove(int index) {
2979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return l.remove(index);
2980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.List#indexOf(Object)
2984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int indexOf(Object obj) {
2986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return l.indexOf(obj);
2987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.List#lastIndexOf(Object)
2991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int lastIndexOf(Object obj) {
2993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return l.lastIndexOf(obj);
2994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
2997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.List#listIterator()
2998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
2999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public ListIterator<E> listIterator() {
3000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new CheckedListIterator<E>(l.listIterator(), type);
3001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.List#listIterator(int)
3005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public ListIterator<E> listIterator(int index) {
3007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new CheckedListIterator<E>(l.listIterator(index), type);
3008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.List#subList(int, int)
3012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public List<E> subList(int fromIndex, int toIndex) {
3014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return checkedList(l.subList(fromIndex, toIndex), type);
3015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.List#equals(Object)
3019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
3021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean equals(Object obj) {
3022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return l.equals(obj);
3023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.List#hashCode()
3027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
3029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int hashCode() {
3030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return l.hashCode();
3031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
3033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
3035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class represents a dynamically typesafe view of the specified
3036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * randomAccessList.
3037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class CheckedRandomAccessList<E> extends CheckedList<E>
3039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            implements RandomAccess {
3040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 1638200125423088369L;
3042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Constructs a dynamically typesafe view of the specified
3045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * randomAccessList.
30463819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
3047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @param l -
3048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            the randomAccessList for which a dynamically typesafe view
3049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            is to be constructed.
3050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public CheckedRandomAccessList(List<E> l, Class<E> type) {
3052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(l, type);
3053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
3055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
3057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class represents a dynamically typesafe view of the specified set.
3058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class CheckedSet<E> extends CheckedCollection<E> implements
3060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Set<E> {
3061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 4694047833775013803L;
3063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Constructs a dynamically typesafe view of the specified set.
30663819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
3067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @param s -
3068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            the set for which a dynamically typesafe view is to be
3069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            constructed.
3070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public CheckedSet(Set<E> s, Class<E> type) {
3072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(s, type);
3073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Set#equals(Object)
3077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
3079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean equals(Object obj) {
3080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.equals(obj);
3081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Set#hashCode()
3085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
3087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int hashCode() {
3088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return c.hashCode();
3089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
3092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
3094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class represents a dynamically typesafe view of the specified map.
3095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class CheckedMap<K, V> implements Map<K, V>, Serializable {
3097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 5742860141034234728L;
3099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Map<K, V> m;
3101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class<K> keyType;
3103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class<V> valueType;
3105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Constructs a dynamically typesafe view of the specified map.
31083819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson         *
3109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @param m -
3110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            the map for which a dynamically typesafe view is to be
3111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            constructed.
3112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private CheckedMap(Map<K, V> m, Class<K> keyType, Class<V> valueType) {
3114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (m == null || keyType == null || valueType == null) {
3115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new NullPointerException();
3116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.m = m;
3118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.keyType = keyType;
3119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.valueType = valueType;
3120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#size()
3124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int size() {
3126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.size();
3127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#isEmpty()
3131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean isEmpty() {
3133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.isEmpty();
3134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#containsKey(Object)
3138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean containsKey(Object key) {
3140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.containsKey(key);
3141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#containsValue(Object)
3145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean containsValue(Object value) {
3147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.containsValue(value);
3148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#get(Object)
3152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public V get(Object key) {
3154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.get(key);
3155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#put(Object, Object)
3159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public V put(K key, V value) {
3161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.put(checkType(key, keyType), checkType(value, valueType));
3162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#remove(Object)
3166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public V remove(Object key) {
3168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.remove(key);
3169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#putAll(Map)
3173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @SuppressWarnings("unchecked")
3175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void putAll(Map<? extends K, ? extends V> map) {
3176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int size = map.size();
3177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (size == 0) {
3178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return;
3179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Map.Entry<? extends K, ? extends V>[] entries = new Map.Entry[size];
3181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Iterator<? extends Map.Entry<? extends K, ? extends V>> it = map
3182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    .entrySet().iterator();
3183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < size; i++) {
3184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Map.Entry<? extends K, ? extends V> e = it.next();
3185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                checkType(e.getKey(), keyType);
3186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                checkType(e.getValue(), valueType);
3187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                entries[i] = e;
3188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < size; i++) {
3190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                m.put(entries[i].getKey(), entries[i].getValue());
3191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#clear()
3196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void clear() {
3198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            m.clear();
3199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#keySet()
3203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Set<K> keySet() {
3205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.keySet();
3206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#values()
3210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Collection<V> values() {
3212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.values();
3213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#entrySet()
3217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Set<Map.Entry<K, V>> entrySet() {
3219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new CheckedEntrySet<K, V>(m.entrySet(), valueType);
3220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#equals(Object)
3224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
3226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean equals(Object obj) {
3227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.equals(obj);
3228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.Map#hashCode()
3232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
3234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int hashCode() {
3235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.hashCode();
3236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.lang.Object#toString()
3240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
3242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String toString() {
3243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m.toString();
3244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Class represents a dynamically typesafe view of the specified map
3248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * entry.
3249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static class CheckedEntry<K, V> implements Map.Entry<K, V> {
3251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Map.Entry<K, V> e;
3253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class<V> valueType;
3255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * Constructs a dynamically typesafe view of the specified map
3258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * entry.
32593819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson             *
32603819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson             * @param e
3261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             *            the map entry for which a dynamically typesafe view is
3262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             *            to be constructed.
32633819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson             * @param valueType
32643819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson             *            the type of the value
3265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public CheckedEntry(Map.Entry<K, V> e, Class<V> valueType) {
3267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (e == null) {
3268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    throw new NullPointerException();
3269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
3270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                this.e = e;
3271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                this.valueType = valueType;
3272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Map.Entry#getKey()
3276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public K getKey() {
3278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return e.getKey();
3279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Map.Entry#getValue()
3283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public V getValue() {
3285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return e.getValue();
3286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Map.Entry#setValue(Object)
3290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public V setValue(V obj) {
3292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return e.setValue(checkType(obj, valueType));
3293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Map.Entry#equals(Object)
3297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            @Override
3299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public boolean equals(Object obj) {
3300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return e.equals(obj);
3301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Map.Entry#hashCode()
3305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            @Override
3307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public int hashCode() {
3308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return e.hashCode();
3309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Class represents a dynamically typesafe view of the specified entry
3314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * set.
3315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static class CheckedEntrySet<K, V> implements
3317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Set<Map.Entry<K, V>> {
3318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Set<Map.Entry<K, V>> s;
3320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class<V> valueType;
3322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * Constructs a dynamically typesafe view of the specified entry
3325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * set.
3326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             *
3327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @param s -
3328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             *            the entry set for which a dynamically typesafe view is
3329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             *            to be constructed.
3330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public CheckedEntrySet(Set<Map.Entry<K, V>> s, Class<V> valueType) {
3332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                this.s = s;
3333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                this.valueType = valueType;
3334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#iterator()
3338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public Iterator<Map.Entry<K, V>> iterator() {
3340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return new CheckedEntryIterator<K, V>(s.iterator(), valueType);
3341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#toArray()
3345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public Object[] toArray() {
3347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int thisSize = size();
3348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Object[] array = new Object[thisSize];
3349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Iterator<?> it = iterator();
3350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (int i = 0; i < thisSize; i++) {
3351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    array[i] = it.next();
3352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
3353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return array;
3354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#toArray(Object[])
3358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            @SuppressWarnings("unchecked")
3360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public <T> T[] toArray(T[] array) {
3361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int thisSize = size();
3362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (array.length < thisSize) {
3363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Class<?> ct = array.getClass().getComponentType();
3364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    array = (T[]) Array.newInstance(ct, thisSize);
3365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
3366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Iterator<?> it = iterator();
3367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (int i = 0; i < thisSize; i++) {
3368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    array[i] = (T) it.next();
3369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
3370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (thisSize < array.length) {
3371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    array[thisSize] = null;
3372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
3373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return array;
3374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#retainAll(Collection)
3378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public boolean retainAll(Collection<?> c) {
3380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return s.retainAll(c);
3381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#removeAll(Collection)
3385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public boolean removeAll(Collection<?> c) {
3387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return s.removeAll(c);
3388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#containsAll(Collection)
3392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public boolean containsAll(Collection<?> c) {
3394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return s.containsAll(c);
3395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#addAll(Collection)
3399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public boolean addAll(Collection<? extends Map.Entry<K, V>> c) {
3401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new UnsupportedOperationException();
3402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#remove(Object)
3406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public boolean remove(Object o) {
3408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return s.remove(o);
3409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#contains(Object)
3413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public boolean contains(Object o) {
3415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return s.contains(o);
3416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#add(Object)
3420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public boolean add(Map.Entry<K, V> o) {
3422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new UnsupportedOperationException();
3423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#isEmpty()
3427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public boolean isEmpty() {
3429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return s.isEmpty();
3430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#clear()
3434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public void clear() {
3436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                s.clear();
3437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#size()
3441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public int size() {
3443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return s.size();
3444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#hashCode()
3448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            @Override
3450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public int hashCode() {
3451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return s.hashCode();
3452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * @see java.util.Set#equals(Object)
3456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            @Override
3458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public boolean equals(Object object) {
3459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return s.equals(object);
3460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /**
3463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * Class represents a dynamically typesafe view of the specified
3464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * entry iterator.
3465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
3466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            private static class CheckedEntryIterator<K, V> implements
3467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Iterator<Map.Entry<K, V>> {
3468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Iterator<Map.Entry<K, V>> i;
3470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Class<V> valueType;
3472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                /**
3474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 * Constructs a dynamically typesafe view of the specified entry
3475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 * iterator.
3476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 *
3477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 * @param i -
3478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 *            the entry iterator for which a dynamically
3479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 *            typesafe view is to be constructed.
3480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 */
3481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public CheckedEntryIterator(Iterator<Map.Entry<K, V>> i,
3482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        Class<V> valueType) {
3483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    this.i = i;
3484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    this.valueType = valueType;
3485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
3486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                /**
3488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 * @see java.util.Iterator#hasNext()
3489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 */
3490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public boolean hasNext() {
3491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return i.hasNext();
3492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
3493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                /**
3495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 * @see java.util.Iterator#remove()
3496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 */
3497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public void remove() {
3498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    i.remove();
3499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
3500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                /**
3502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 * @see java.util.Iterator#next()
3503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 */
3504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                public Map.Entry<K, V> next() {
3505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    return new CheckedEntry<K, V>(i.next(), valueType);
3506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
3507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
3508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
3512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
3514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class represents a dynamically typesafe view of the specified sortedSet.
3515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class CheckedSortedSet<E> extends CheckedSet<E> implements
3517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            SortedSet<E> {
3518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 1599911165492914959L;
3520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private SortedSet<E> ss;
3522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Constructs a dynamically typesafe view of the specified sortedSet.
3525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *
3526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @param s -
3527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            the sortedSet for which a dynamically typesafe view is to
3528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            be constructed.
3529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public CheckedSortedSet(SortedSet<E> s, Class<E> type) {
3531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(s, type);
3532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.ss = s;
3533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.SortedSet#comparator()
3537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Comparator<? super E> comparator() {
3539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return ss.comparator();
3540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.SortedSet#subSet(Object, Object)
3544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedSet<E> subSet(E fromElement, E toElement) {
3546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new CheckedSortedSet<E>(ss.subSet(fromElement, toElement),
3547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    type);
3548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.SortedSet#headSet(Object)
3552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedSet<E> headSet(E toElement) {
3554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new CheckedSortedSet<E>(ss.headSet(toElement), type);
3555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.SortedSet#tailSet(Object)
3559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedSet<E> tailSet(E fromElement) {
3561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new CheckedSortedSet<E>(ss.tailSet(fromElement), type);
3562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.SortedSet#first()
3566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E first() {
3568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return ss.first();
3569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.SortedSet#last()
3573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public E last() {
3575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return ss.last();
3576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
3578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
3580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class represents a dynamically typesafe view of the specified sortedMap.
3581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class CheckedSortedMap<K, V> extends CheckedMap<K, V>
3583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            implements SortedMap<K, V> {
3584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = 1599671320688067438L;
3586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SortedMap<K, V> sm;
3588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Constructs a dynamically typesafe view of the specified sortedMap.
3591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *
3592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @param m -
3593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            the sortedMap for which a dynamically typesafe view is to
3594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            be constructed.
3595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CheckedSortedMap(SortedMap<K, V> m, Class<K> keyType, Class<V> valueType) {
3597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(m, keyType, valueType);
3598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.sm = m;
3599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.SortedMap#comparator()
3603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Comparator<? super K> comparator() {
3605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return sm.comparator();
3606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.SortedMap#subMap(Object, Object)
3610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedMap<K, V> subMap(K fromKey, K toKey) {
3612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new CheckedSortedMap<K, V>(sm.subMap(fromKey, toKey),
3613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    keyType, valueType);
3614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.SortedMap#headMap(Object)
3618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedMap<K, V> headMap(K toKey) {
3620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new CheckedSortedMap<K, V>(sm.headMap(toKey), keyType,
3621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    valueType);
3622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.SortedMap#tailMap(Object)
3626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SortedMap<K, V> tailMap(K fromKey) {
3628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new CheckedSortedMap<K, V>(sm.tailMap(fromKey), keyType,
3629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    valueType);
3630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.SortedMap#firstKey()
3634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public K firstKey() {
3636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return sm.firstKey();
3637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
3640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @see java.util.SortedMap#lastKey()
3641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
3642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public K lastKey() {
3643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return sm.lastKey();
3644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
3645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
3646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
3647