BUG-7464: Refactor TrieMapIterator
[yangtools.git] / third-party / triemap / src / main / java / org / opendaylight / yangtools / triemap / LNode.java
index ca28a06216a9962971da57e3e77a35146e170ac1..b4a32244466042debb13ed32e0a9019ed5747601 100644 (file)
  */
 package org.opendaylight.yangtools.triemap;
 
-import java.util.Iterator;
-import java.util.Map.Entry;
-
 final class LNode<K, V> extends MainNode<K, V> {
-    private final LNodeEntries<K, V> listmap;
+    // Internally-linked single list of of entries
+    private final LNodeEntries<K, V> entries;
+    private final int size;
 
-    private LNode(final LNodeEntries<K, V> listmap) {
-        this.listmap = listmap;
+    private LNode(final LNodeEntries<K, V> entries, final int size) {
+        this.entries = entries;
+        this.size = size;
     }
 
     LNode(final K k1, final V v1, final K k2, final V v2) {
-        this(LNodeEntries.map(k1, v1, k2, v2));
+        this(LNodeEntries.map(k1, v1, k2, v2), 2);
     }
 
     LNode<K, V> insertChild( final K k, final V v) {
-        return new LNode<>(listmap.insert(k, v));
+        return new LNode<>(entries.insert(k, v), size + 1);
     }
 
     MainNode<K, V> removeChild(final LNodeEntry<K, V> entry, final int hc) {
-        // We only ever create ListMaps with two or more entries,  and remove them as soon as they reach one element
-        // (below), so we cannot observe a null return here.
-        final LNodeEntries<K, V> map = listmap.remove(entry);
-        if (map.isSingle()) {
+        // While remove() can return null, that case will never happen here, as we are starting off with two entries
+        // so we cannot observe a null return here.
+        final LNodeEntries<K, V> map = entries.remove(entry);
+
+        // If the returned LNode would have only one element, we turn it into a TNode, hence above null return from
+        // remove() can never happen.
+        if (size == 2) {
             // create it tombed so that it gets compressed on subsequent accesses
             return new TNode<>(map.getKey(), map.getValue(), hc);
         }
 
-        return new LNode<>(map);
+        return new LNode<>(map, size - 1);
     }
 
     MainNode<K, V> replaceChild(final LNodeEntry<K, V> entry, final V v) {
-        return new LNode<>(listmap.replace(entry, v));
+        return new LNode<>(entries.replace(entry, v), size);
     }
 
     LNodeEntry<K, V> get(final Equivalence<? super K> equiv, final K k) {
-        return listmap.findEntry(equiv, k);
+        return entries.findEntry(equiv, k);
+    }
+
+    LNodeEntries<K, V> entries() {
+        return entries;
     }
 
     @Override
     int cachedSize(final TrieMap<?, ?> ct) {
-        return listmap.size();
+        return size;
     }
 
     @Override
@@ -63,8 +70,4 @@ final class LNode<K, V> extends MainNode<K, V> {
         // (" " * lev) + "LNode(%s)".format(listmap.mkString(", "))
         return "LNode";
     }
-
-    Iterator<Entry<K, V>> iterator() {
-        return listmap.iterator();
-    }
-}
\ No newline at end of file
+}