• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.common.collect;
18 
19 import java.util.AbstractMap;
20 import java.util.Iterator;
21 import java.util.Map;
22 import java.util.NavigableMap;
23 import java.util.NavigableSet;
24 import java.util.NoSuchElementException;
25 import java.util.Set;
26 import java.util.SortedMap;
27 
28 import javax.annotation.Nullable;
29 
30 /**
31  * Skeletal implementation of {@link NavigableMap}.
32  *
33  * @author Louis Wasserman
34  */
35 abstract class AbstractNavigableMap<K, V> extends AbstractMap<K, V> implements NavigableMap<K, V> {
36 
37   @Override
38   @Nullable
get(@ullable Object key)39   public abstract V get(@Nullable Object key);
40 
41   @Override
42   @Nullable
firstEntry()43   public Entry<K, V> firstEntry() {
44     return Iterators.getNext(entryIterator(), null);
45   }
46 
47   @Override
48   @Nullable
lastEntry()49   public Entry<K, V> lastEntry() {
50     return Iterators.getNext(descendingEntryIterator(), null);
51   }
52 
53   @Override
54   @Nullable
pollFirstEntry()55   public Entry<K, V> pollFirstEntry() {
56     return Iterators.pollNext(entryIterator());
57   }
58 
59   @Override
60   @Nullable
pollLastEntry()61   public Entry<K, V> pollLastEntry() {
62     return Iterators.pollNext(descendingEntryIterator());
63   }
64 
65   @Override
firstKey()66   public K firstKey() {
67     Entry<K, V> entry = firstEntry();
68     if (entry == null) {
69       throw new NoSuchElementException();
70     } else {
71       return entry.getKey();
72     }
73   }
74 
75   @Override
lastKey()76   public K lastKey() {
77     Entry<K, V> entry = lastEntry();
78     if (entry == null) {
79       throw new NoSuchElementException();
80     } else {
81       return entry.getKey();
82     }
83   }
84 
85   @Override
86   @Nullable
lowerEntry(K key)87   public Entry<K, V> lowerEntry(K key) {
88     return headMap(key, false).lastEntry();
89   }
90 
91   @Override
92   @Nullable
floorEntry(K key)93   public Entry<K, V> floorEntry(K key) {
94     return headMap(key, true).lastEntry();
95   }
96 
97   @Override
98   @Nullable
ceilingEntry(K key)99   public Entry<K, V> ceilingEntry(K key) {
100     return tailMap(key, true).firstEntry();
101   }
102 
103   @Override
104   @Nullable
higherEntry(K key)105   public Entry<K, V> higherEntry(K key) {
106     return tailMap(key, false).firstEntry();
107   }
108 
109   @Override
lowerKey(K key)110   public K lowerKey(K key) {
111     return Maps.keyOrNull(lowerEntry(key));
112   }
113 
114   @Override
floorKey(K key)115   public K floorKey(K key) {
116     return Maps.keyOrNull(floorEntry(key));
117   }
118 
119   @Override
ceilingKey(K key)120   public K ceilingKey(K key) {
121     return Maps.keyOrNull(ceilingEntry(key));
122   }
123 
124   @Override
higherKey(K key)125   public K higherKey(K key) {
126     return Maps.keyOrNull(higherEntry(key));
127   }
128 
entryIterator()129   abstract Iterator<Entry<K, V>> entryIterator();
130 
descendingEntryIterator()131   abstract Iterator<Entry<K, V>> descendingEntryIterator();
132 
133   @Override
subMap(K fromKey, K toKey)134   public SortedMap<K, V> subMap(K fromKey, K toKey) {
135     return subMap(fromKey, true, toKey, false);
136   }
137 
138   @Override
headMap(K toKey)139   public SortedMap<K, V> headMap(K toKey) {
140     return headMap(toKey, false);
141   }
142 
143   @Override
tailMap(K fromKey)144   public SortedMap<K, V> tailMap(K fromKey) {
145     return tailMap(fromKey, true);
146   }
147 
148   @Override
navigableKeySet()149   public NavigableSet<K> navigableKeySet() {
150     return new Maps.NavigableKeySet<K, V>(this);
151   }
152 
153   @Override
keySet()154   public Set<K> keySet() {
155     return navigableKeySet();
156   }
157 
158   @Override
size()159   public abstract int size();
160 
161   @Override
entrySet()162   public Set<Entry<K, V>> entrySet() {
163     return new Maps.EntrySet<K, V>() {
164       @Override
165       Map<K, V> map() {
166         return AbstractNavigableMap.this;
167       }
168 
169       @Override
170       public Iterator<Entry<K, V>> iterator() {
171         return entryIterator();
172       }
173     };
174   }
175 
176   @Override
177   public NavigableSet<K> descendingKeySet() {
178     return descendingMap().navigableKeySet();
179   }
180 
181   @Override
182   public NavigableMap<K, V> descendingMap() {
183     return new DescendingMap();
184   }
185 
186   private final class DescendingMap extends Maps.DescendingMap<K, V> {
187     @Override
188     NavigableMap<K, V> forward() {
189       return AbstractNavigableMap.this;
190     }
191 
192     @Override
193     Iterator<Entry<K, V>> entryIterator() {
194       return descendingEntryIterator();
195     }
196   }
197 
198 }
199