1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * TreeSet is an implementation of SortedSet. All optional operations (adding
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and removing) are supported. The elements can be any objects which are
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * comparable to each other either using their natural order or a specified
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Comparator.
30f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
31f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.2
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
33286772eb30e454847a7000b001529fca9cb65e6dJesse Wilsonpublic class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>,
34f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        Cloneable, Serializable {
35f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = -2479143000061671589L;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
3855392539fea537abfb6581b474918f9d611fba27Jesse Wilson    /** Keys are this set's elements. Values are always Boolean.TRUE */
39286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    private transient NavigableMap<E, Object> backingMap;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    private transient NavigableSet<E> descendingSet;
42286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
43286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    TreeSet(NavigableMap<E, Object> map) {
44286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        backingMap = map;
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new empty instance of {@code TreeSet} which uses natural
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ordering.
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public TreeSet() {
5255392539fea537abfb6581b474918f9d611fba27Jesse Wilson        backingMap = new TreeMap<E, Object>();
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new instance of {@code TreeSet} which uses natural ordering
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and containing the unique elements in the specified collection.
58f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param collection
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the collection of elements to add.
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassCastException
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                when an element in the collection does not implement the
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                Comparable interface, or the elements in the collection
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                cannot be compared.
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public TreeSet(Collection<? extends E> collection) {
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this();
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        addAll(collection);
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new empty instance of {@code TreeSet} which uses the
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified comparator.
74f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param comparator
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the comparator to use.
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public TreeSet(Comparator<? super E> comparator) {
7955392539fea537abfb6581b474918f9d611fba27Jesse Wilson        backingMap = new TreeMap<E, Object>(comparator);
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new instance of {@code TreeSet} containing the elements of
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the specified SortedSet and using the same Comparator.
85f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param set
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the SortedSet of elements to add.
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public TreeSet(SortedSet<E> set) {
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(set.comparator());
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Iterator<E> it = set.iterator();
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (it.hasNext()) {
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            add(it.next());
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Adds the specified object to this {@code TreeSet}.
99f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to add.
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} when this {@code TreeSet} did not already contain
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         the object, {@code false} otherwise.
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassCastException
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             when the object cannot be compared with the elements in this
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             {@code TreeSet}.
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             when the object is null and the comparator cannot handle
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             null.
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean add(E object) {
11355392539fea537abfb6581b474918f9d611fba27Jesse Wilson        return backingMap.put(object, Boolean.TRUE) == null;
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Adds the objects in the specified collection to this {@code TreeSet}.
118f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param collection
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the collection of objects to add.
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this {@code TreeSet} was modified, {@code false}
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassCastException
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             when an object in the collection cannot be compared with the
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             elements in this {@code TreeSet}.
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             when an object in the collection is null and the comparator
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             cannot handle null.
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean addAll(Collection<? extends E> collection) {
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return super.addAll(collection);
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Removes all elements from this {@code TreeSet}, leaving it empty.
137f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #isEmpty
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #size
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void clear() {
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        backingMap.clear();
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new {@code TreeSet} with the same elements, size and comparator
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as this {@code TreeSet}.
149f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a shallow copy of this {@code TreeSet}.
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.Cloneable
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            TreeSet<E> clone = (TreeSet<E>) super.clone();
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (backingMap instanceof TreeMap) {
159286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson                clone.backingMap = (NavigableMap<E, Object>) ((TreeMap<E, Object>) backingMap)
160f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        .clone();
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
16255392539fea537abfb6581b474918f9d611fba27Jesse Wilson                clone.backingMap = new TreeMap<E, Object>(backingMap);
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return clone;
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (CloneNotSupportedException e) {
166fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes            throw new AssertionError(e);
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the comparator used to compare elements in this {@code TreeSet}.
172f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a Comparator or null if the natural ordering is used
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Comparator<? super E> comparator() {
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return backingMap.comparator();
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Searches this {@code TreeSet} for the specified object.
181f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to search for.
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if {@code object} is an element of this
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code TreeSet}, {@code false} otherwise.
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassCastException
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             when the object cannot be compared with the elements in this
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             {@code TreeSet}.
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             when the object is null and the comparator cannot handle
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             null.
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean contains(Object object) {
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return backingMap.containsKey(object);
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns true if this {@code TreeSet} has no element, otherwise false.
200f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return true if this {@code TreeSet} has no element.
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #size
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isEmpty() {
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return backingMap.isEmpty();
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns an Iterator on the elements of this {@code TreeSet}.
211f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an Iterator on the elements of this {@code TreeSet}.
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see Iterator
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Iterator<E> iterator() {
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return backingMap.keySet().iterator();
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
221286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * {@inheritDoc}
222f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
223286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @see java.util.NavigableSet#descendingIterator()
224286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @since 1.6
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
226286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public Iterator<E> descendingIterator() {
227286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        return descendingSet().iterator();
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Removes an occurrence of the specified object from this {@code TreeSet}.
232f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to remove.
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this {@code TreeSet} was modified, {@code false}
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassCastException
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             when the object cannot be compared with the elements in this
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             {@code TreeSet}.
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             when the object is null and the comparator cannot handle
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             null.
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean remove(Object object) {
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return backingMap.remove(object) != null;
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of elements in this {@code TreeSet}.
251f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of elements in this {@code TreeSet}.
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int size() {
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return backingMap.size();
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
260eeefcae2980c8db05ec08303b5b112afce232d26Elliott Hughes     * Returns the first element in this set.
26138f3983aed5a093c17d1f68c1517bbc72c2862eaElliott Hughes     * @throws NoSuchElementException when this TreeSet is empty
262286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     */
263286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public E first() {
264286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        return backingMap.firstKey();
265286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    }
266286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
267286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    /**
268eeefcae2980c8db05ec08303b5b112afce232d26Elliott Hughes     * Returns the last element in this set.
26938f3983aed5a093c17d1f68c1517bbc72c2862eaElliott Hughes     * @throws NoSuchElementException when this TreeSet is empty
270286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     */
271286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public E last() {
272286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        return backingMap.lastKey();
273286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    }
274286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
275286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    /**
276286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * {@inheritDoc}
277286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
278286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @see java.util.NavigableSet#pollFirst()
279286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @since 1.6
280286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     */
281286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public E pollFirst() {
282286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        Map.Entry<E, Object> entry = backingMap.pollFirstEntry();
283b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes        return (entry == null) ? null : entry.getKey();
284286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    }
285286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
286286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    /**
287286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * {@inheritDoc}
288286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
289286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @see java.util.NavigableSet#pollLast()
290286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @since 1.6
291286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     */
292286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public E pollLast() {
293286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        Map.Entry<E, Object> entry = backingMap.pollLastEntry();
294b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes        return (entry == null) ? null : entry.getKey();
295286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    }
296286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
297286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    /**
298286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * {@inheritDoc}
299286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
300286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @see java.util.NavigableSet#higher(java.lang.Object)
301286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @since 1.6
302286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     */
303286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public E higher(E e) {
304286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        return backingMap.higherKey(e);
305286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    }
306286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
307286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    /**
308286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * {@inheritDoc}
309286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
310286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @see java.util.NavigableSet#lower(java.lang.Object)
311286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @since 1.6
312286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     */
313286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public E lower(E e) {
314286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        return backingMap.lowerKey(e);
315286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    }
316286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
317286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    /**
318286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * {@inheritDoc}
319286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
320286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @see java.util.NavigableSet#ceiling(java.lang.Object)
321286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @since 1.6
322286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     */
323286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public E ceiling(E e) {
324286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        return backingMap.ceilingKey(e);
325286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    }
326286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
327286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    /**
328286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * {@inheritDoc}
329286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
330286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @see java.util.NavigableSet#floor(java.lang.Object)
331286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @since 1.6
332286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     */
333286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public E floor(E e) {
334286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        return backingMap.floorKey(e);
335286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    }
336286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
337286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    /**
338286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * {@inheritDoc}
339286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
340286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @see java.util.NavigableSet#descendingSet()
341286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @since 1.6
342286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     */
343286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public NavigableSet<E> descendingSet() {
344b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes        return (descendingSet != null) ? descendingSet
345286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson                : (descendingSet = new TreeSet<E>(backingMap.descendingMap()));
346286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    }
347286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
348286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    /**
349286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * {@inheritDoc}
350286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
351286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @see java.util.NavigableSet#subSet(Object, boolean, Object, boolean)
352286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @since 1.6
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
355286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public NavigableSet<E> subSet(E start, boolean startInclusive, E end,
356286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson            boolean endInclusive) {
357286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        Comparator<? super E> c = backingMap.comparator();
358286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        int compare = (c == null) ? ((Comparable<E>) start).compareTo(end) : c
359286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson                .compare(start, end);
360286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        if (compare <= 0) {
361286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson            return new TreeSet<E>(backingMap.subMap(start, startInclusive, end,
362286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson                    endInclusive));
363286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        }
364286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        throw new IllegalArgumentException();
365286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    }
366286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
367286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    /**
368286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * {@inheritDoc}
369286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
370286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @see java.util.NavigableSet#headSet(Object, boolean)
371286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @since 1.6
372286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     */
373286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    @SuppressWarnings("unchecked")
374286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public NavigableSet<E> headSet(E end, boolean endInclusive) {
375286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        // Check for errors
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Comparator<? super E> c = backingMap.comparator();
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (c == null) {
378286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson            ((Comparable<E>) end).compareTo(end);
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
380286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson            c.compare(end, end);
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
382286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        return new TreeSet<E>(backingMap.headMap(end, endInclusive));
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
386286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * {@inheritDoc}
387f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
388286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @see java.util.NavigableSet#tailSet(Object, boolean)
389286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @since 1.6
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
392286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public NavigableSet<E> tailSet(E start, boolean startInclusive) {
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Check for errors
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Comparator<? super E> c = backingMap.comparator();
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (c == null) {
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ((Comparable<E>) start).compareTo(start);
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.compare(start, start);
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
400286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        return new TreeSet<E>(backingMap.tailMap(start, startInclusive));
401286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    }
402286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
403286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    /**
404eeefcae2980c8db05ec08303b5b112afce232d26Elliott Hughes     * Returns a {@code SortedSet} of the specified portion of this {@code TreeSet} which
405286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * contains elements greater or equal to the start element but less than the
406286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * end element. The returned SortedSet is backed by this TreeSet so changes
407286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * to one are reflected by the other.
408286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
409286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @param start
410286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *            the start element
411286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @param end
412286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *            the end element
413286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @return a subset where the elements are greater or equal to
414286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *         <code>start</code> and less than <code>end</code>
415286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
41638f3983aed5a093c17d1f68c1517bbc72c2862eaElliott Hughes     * @throws ClassCastException
417286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *                when the start or end object cannot be compared with the
418286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *                elements in this TreeSet
41938f3983aed5a093c17d1f68c1517bbc72c2862eaElliott Hughes     * @throws NullPointerException
420286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *                when the start or end object is null and the comparator
421286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *                cannot handle null
422286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     */
423286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    @SuppressWarnings("unchecked")
424286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public SortedSet<E> subSet(E start, E end) {
425286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        return subSet(start, true, end, false);
426286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    }
427286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
428286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    /**
429eeefcae2980c8db05ec08303b5b112afce232d26Elliott Hughes     * Returns a {@code SortedSet} of the specified portion of this {@code TreeSet} which
430286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * contains elements less than the end element. The returned SortedSet is
431286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * backed by this TreeSet so changes to one are reflected by the other.
432286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
433286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @param end
434286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *            the end element
435286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @return a subset where the elements are less than <code>end</code>
436286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
43738f3983aed5a093c17d1f68c1517bbc72c2862eaElliott Hughes     * @throws ClassCastException
438286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *                when the end object cannot be compared with the elements
439286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *                in this TreeSet
44038f3983aed5a093c17d1f68c1517bbc72c2862eaElliott Hughes     * @throws NullPointerException
441286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *                when the end object is null and the comparator cannot
442286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *                handle null
443286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     */
444286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    @SuppressWarnings("unchecked")
445286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public SortedSet<E> headSet(E end) {
446286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        return headSet(end, false);
447286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    }
448286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson
449286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    /**
450eeefcae2980c8db05ec08303b5b112afce232d26Elliott Hughes     * Returns a {@code SortedSet} of the specified portion of this {@code TreeSet} which
451286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * contains elements greater or equal to the start element. The returned
452286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * SortedSet is backed by this TreeSet so changes to one are reflected by
453286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * the other.
454286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
455286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @param start
456286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *            the start element
457286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     * @return a subset where the elements are greater or equal to
458286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *         <code>start</code>
459286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *
46038f3983aed5a093c17d1f68c1517bbc72c2862eaElliott Hughes     * @throws ClassCastException
461286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *                when the start object cannot be compared with the elements
462286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *                in this TreeSet
46338f3983aed5a093c17d1f68c1517bbc72c2862eaElliott Hughes     * @throws NullPointerException
464286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *                when the start object is null and the comparator cannot
465286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     *                handle null
466286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson     */
467286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    @SuppressWarnings("unchecked")
468286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson    public SortedSet<E> tailSet(E start) {
469286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        return tailSet(start, true);
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void writeObject(ObjectOutputStream stream) throws IOException {
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        stream.defaultWriteObject();
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        stream.writeObject(backingMap.comparator());
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int size = backingMap.size();
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        stream.writeInt(size);
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (size > 0) {
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Iterator<E> it = backingMap.keySet().iterator();
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (it.hasNext()) {
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                stream.writeObject(it.next());
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void readObject(ObjectInputStream stream) throws IOException,
487f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            ClassNotFoundException {
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        stream.defaultReadObject();
48955392539fea537abfb6581b474918f9d611fba27Jesse Wilson        TreeMap<E, Object> map = new TreeMap<E, Object>(
49055392539fea537abfb6581b474918f9d611fba27Jesse Wilson                (Comparator<? super E>) stream.readObject());
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int size = stream.readInt();
492286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson        if (size > 0) {
4930d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes            for (int i=0; i<size; i++) {
494286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson                E elem = (E)stream.readObject();
495286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson                map.put(elem, Boolean.TRUE);
496286772eb30e454847a7000b001529fca9cb65e6dJesse Wilson            }
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        backingMap = map;
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
501