1 49 50 package org.ozoneDB.collections; 51 52 import java.util.Collection ; 53 import java.util.Comparator ; 54 import java.util.Iterator ; 55 import java.util.Map ; 56 import java.util.NoSuchElementException ; 57 import java.util.Set ; 58 import java.util.SortedMap ; 59 import java.util.TreeMap ; 60 61 72 public class _BaseTreeMap_SubMapImpl extends AbstractOzoneMap implements _BaseTreeMap_SubMap { 73 74 private static final long serialVersionUID = 1L; 75 76 79 protected BaseTreeMap owner; 80 81 85 final Object minKey; 86 87 91 final Object maxKey; 92 93 96 private OzoneSet entries; 97 98 107 public _BaseTreeMap_SubMapImpl(BaseTreeMap owner, Object minKey, Object maxKey) { 108 this.owner = owner; 109 if ((minKey instanceof BaseTreeMap.Node) && (maxKey instanceof BaseTreeMap.Node) && 110 !((BaseTreeMap.Node) minKey).isNil() && !((BaseTreeMap.Node) maxKey).isNil() && 111 owner._org_ozoneDB_compare(minKey, maxKey) > 0) 112 throw new IllegalArgumentException ("fromKey > toKey"); 113 this.minKey = minKey; 114 this.maxKey = maxKey; 115 } 116 117 125 public final boolean keyInRange(Object key) { 126 return (((minKey instanceof BaseTreeMap.Node && ((BaseTreeMap.Node) minKey).isNil()) || owner._org_ozoneDB_compare(key, minKey) >= 0) 127 && ((maxKey instanceof BaseTreeMap.Node && ((BaseTreeMap.Node) maxKey).isNil()) || owner._org_ozoneDB_compare(key, maxKey) < 0)); 128 } 129 130 public void clear() { 131 BaseTreeMap.Node next = owner._org_ozoneDB_lowestGreaterThan(minKey, true); 132 BaseTreeMap.Node max = owner._org_ozoneDB_lowestGreaterThan(maxKey, false); 133 while (!next.equals(max)) { 134 BaseTreeMap.Node current = next; 135 next = owner._org_ozoneDB_successor(current); 136 owner._org_ozoneDB_removeNode(current); 137 } 138 } 139 140 public Comparator comparator() { 141 return owner.comparator(); 142 } 143 144 public boolean containsKey(Object key) { 145 return keyInRange(key) && owner.containsKey(key); 146 } 147 148 public boolean containsValue(Object value) { 149 BaseTreeMap.Node node = owner._org_ozoneDB_lowestGreaterThan(minKey, true); 150 BaseTreeMap.Node max = owner._org_ozoneDB_lowestGreaterThan(maxKey, false); 151 while (node != max) { 152 if (equals(value, node.getValue())) 153 return true; 154 node = owner._org_ozoneDB_successor(node); 155 } 156 return false; 157 } 158 159 public Set entrySet() { 160 if (entries == null) { 161 entries = (OzoneSet) database().createObject( 164 _BaseTreeMap_SubMap_entrySet.class, 165 new Class [] {_BaseTreeMap_SubMap.class}, 166 new Object [] {self()}); 167 } 168 return entries; 169 } 170 171 public Object firstKey() { 172 BaseTreeMap.Node node = owner._org_ozoneDB_lowestGreaterThan(minKey, true); 173 if (node.isNil() || ! keyInRange(node.getKey())) 174 throw new NoSuchElementException (); 175 return node.getKey(); 176 } 177 178 public Object get(Object key) { 179 if (keyInRange(key)) 180 return owner.get(key); 181 return null; 182 } 183 184 public SortedMap headMap(Object toKey) { 185 if (! keyInRange(toKey)) 186 throw new IllegalArgumentException ("key outside range"); 187 return (SortedMap ) database().createObject( 190 _BaseTreeMap_SubMap.class, 191 new Class [] {BaseTreeMap.class, Object .class, Object .class}, 192 new Object [] {owner, minKey, toKey} 193 ); 194 } 195 196 public Set keySet() { 197 if (keys == null) { 198 keys = (Set ) database().createObject( 201 _BaseTreeMap_SubMap_keySet.class, 202 new Class [] {_BaseTreeMap_SubMap.class}, 203 new Object [] {self()} 204 ); 205 } 206 return keys; 207 } 208 209 public Object lastKey() { 210 BaseTreeMap.Node node = owner._org_ozoneDB_highestLessThan(maxKey); 211 if (node.isNil() || ! keyInRange(node.getKey())) 212 throw new NoSuchElementException (); 213 return node.getKey(); 214 } 215 216 public Object put(Object key, Object value) { 217 if (! keyInRange(key)) 218 throw new IllegalArgumentException ("Key outside range"); 219 return owner.put(key, value); 220 } 221 222 public Object remove(Object key) { 223 if (keyInRange(key)) 224 return owner.remove(key); 225 return null; 226 } 227 228 public int size() { 229 BaseTreeMap.Node node = owner._org_ozoneDB_lowestGreaterThan(minKey, true); 230 BaseTreeMap.Node max = owner._org_ozoneDB_lowestGreaterThan(maxKey, false); 231 int count = 0; 232 while (!node.equals(max)) { 233 count++; 234 node = owner._org_ozoneDB_successor(node); 235 } 236 return count; 237 } 238 239 public SortedMap subMap(Object fromKey, Object toKey) { 240 if (! keyInRange(fromKey) || ! keyInRange(toKey)) 241 throw new IllegalArgumentException ("key outside range"); 242 return (SortedMap ) database().createObject( 245 _BaseTreeMap_SubMap.class, 246 new Class [] {BaseTreeMap.class, Object .class, Object .class}, 247 new Object [] {owner, fromKey, toKey} 248 ); 249 } 250 251 public SortedMap tailMap(Object fromKey) { 252 if (! keyInRange(fromKey)) 253 throw new IllegalArgumentException ("key outside range"); 254 return (SortedMap ) database().createObject( 257 _BaseTreeMap_SubMap.class, 258 new Class [] {BaseTreeMap.class, Object .class, Object .class}, 259 new Object [] {owner, fromKey, maxKey} 260 ); 261 } 262 263 public Collection values() { 264 if (values == null) { 265 values = (OzoneCollection) database().createObject( 268 _BaseTreeMap_SubMap_values.class, 269 new Class [] {_BaseTreeMap_SubMap.class}, 270 new Object [] {self()} 271 ); 272 } 273 return values; 274 } 275 276 283 public Map getClientMap() { 284 return getClientSortedMap(); 285 } 286 287 294 public SortedMap getClientSortedMap() { 295 TreeMap result = comparator() == null ? new TreeMap () : new TreeMap (comparator()); 296 for (Iterator i = ((OzoneSet) entrySet())._org_ozoneDB_internalIterator(); i.hasNext(); ) { 297 Map.Entry entry = (Map.Entry ) i.next(); 298 result.put(entry.getKey(), entry.getValue()); 299 } 300 return result; 301 } 302 303 public Object getMinKey() { 304 return minKey; 305 } 306 307 public Object getMaxKey() { 308 return maxKey; 309 } 310 311 public BaseTreeMap getOwner() { 312 return owner; 313 } 314 315 320 public OzoneSortedMap ozoneHeadMap(Object toKey) { 321 return (OzoneSortedMap) headMap(toKey); 322 } 323 324 329 public OzoneSortedMap ozoneSubMap(Object fromKey, Object toKey) { 330 return (OzoneSortedMap) subMap(fromKey, toKey); 331 } 332 333 338 public OzoneSortedMap ozoneTailMap(Object toKey) { 339 return (OzoneSortedMap) tailMap(toKey); 340 } 341 342 } | Popular Tags |