boolean isBeforeEnd(ConcurrentSkipListMap.Node<K,V> n) { return (n != null && (fence == null || n.key == null || // pass by markers and headers m.compare(fence, n.key) > 0)); }
/** * Return true if given key greater than or equal to least and less * or equal to fence. Needed mainly in submap operations. */ boolean inOpenRange(K key, K least, K fence) { if (key == null) throw new NullPointerException(); return ((least == null || compare(key, least) >= 0) && (fence == null || compare(key, fence) <= 0)); }
/** * Return true if given key greater than or equal to least and * strictly less than fence, bypassing either test if least or * fence oare null. Needed mainly in submap operations. */ boolean inHalfOpenRange(K key, K least, K fence) { if (key == null) throw new NullPointerException(); return ((least == null || compare(key, least) >= 0) && (fence == null || compare(key, fence) < 0)); }
/** * Creates a new submap. * @param least inclusive least value, or <tt>null</tt> if from start * @param fence exclusive upper bound or <tt>null</tt> if to end * @throws IllegalArgumentException if least and fence nonnull * and least greater than fence */ ConcurrentSkipListSubMap(ConcurrentSkipListMap<K,V> map, K least, K fence) { if (least != null && fence != null && map.compare(least, fence) > 0) throw new IllegalArgumentException("inconsistent range"); this.m = map; this.least = least; this.fence = fence; }
/** * Find and remove least element of subrange. * @param least minimum allowed key value * @param fence key greater than maximum allowed key value * @param keyOnly if true return key, else return SnapshotEntry * @return least Key or Entry, or <tt>null</tt> if no such */ Object removeFirstEntryOfSubrange(K least, K fence, boolean keyOnly) { for (;;) { Node<K,V> n = findCeiling(least); if (n == null) return null; K k = n.key; if (fence != null && compare(k, fence) >= 0) return null; V v = doRemove(k, null); if (v != null) return (keyOnly)? k : new SnapshotEntry<K,V>(k, v); } }
/** * Find and remove greatest element of subrange. * @param least minimum allowed key value * @param fence key greater than maximum allowed key value * @param keyOnly if true return key, else return SnapshotEntry * @return least Key or Entry, or <tt>null</tt> if no such */ Object removeLastEntryOfSubrange(K least, K fence, boolean keyOnly) { for (;;) { Node<K,V> n = findLower(fence); if (n == null) return null; K k = n.key; if (least != null && compare(k, least) < 0) return null; V v = doRemove(k, null); if (v != null) return (keyOnly)? k : new SnapshotEntry<K,V>(k, v); } }
/** * Return SnapshotEntry or key for results of findNear ofter screening * to ensure result is in given range. Needed by submaps. * @param kkey the key * @param rel the relation -- OR'ed combination of EQ, LT, GT * @param least minimum allowed key value * @param fence key greater than maximum allowed key value * @param keyOnly if true return key, else return SnapshotEntry * @return Key or Entry fitting relation, or <tt>null</tt> if no such */ Object getNear(K kkey, int rel, K least, K fence, boolean keyOnly) { K key = kkey; // Don't return keys less than least if ((rel & LT) == 0) { if (compare(key, least) < 0) { key = least; rel = rel | EQ; } } for (;;) { Node<K,V> n = findNear(key, rel); if (n == null || !inHalfOpenRange(n.key, least, fence)) return null; K k = n.key; V v = n.getValidValue(); if (v != null) return keyOnly? k : new SnapshotEntry<K,V>(k, v); } }