BUG-7464: Optimize LNode.removed()
[yangtools.git] / third-party / triemap / src / main / java / org / opendaylight / yangtools / triemap / LNode.java
index 2f2c96c0e594d72ce7a1e23ea4d01c5a65649115..7d55a7442cc109a3c10bb1401f18a8f73b62fcf0 100644 (file)
@@ -17,8 +17,9 @@ package org.opendaylight.yangtools.triemap;
 
 import java.util.Iterator;
 import java.util.Map.Entry;
+import java.util.Optional;
 
-final class LNode<K, V> extends MainNode<K, V> implements Iterable<Entry<K, V>> {
+final class LNode<K, V> extends MainNode<K, V> {
     private final ListMap<K, V> listmap;
 
     private LNode(final ListMap<K, V> listmap) {
@@ -33,18 +34,22 @@ final class LNode<K, V> extends MainNode<K, V> implements Iterable<Entry<K, V>>
         return new LNode<>(listmap.add(k, v));
     }
 
+    // FIXME: can we also get the hashcode ?
     MainNode<K, V> removed(final K k, final TrieMap<K, V> ct) {
-        final ListMap<K, V> updmap = listmap.remove(k);
-        if (updmap.size() > 1) {
-            return new LNode<>(updmap);
+        // 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 ListMap<K, V> map = listmap.remove(k);
+        final Optional<Entry<K, V>> maybeKv = map.maybeSingleton();
+        if (maybeKv.isPresent()) {
+            final Entry<K, V> kv = maybeKv.get();
+            // create it tombed so that it gets compressed on subsequent accesses
+            return new TNode<>(kv.getKey(), kv.getValue(), ct.computeHash(kv.getKey()));
         }
 
-        final Entry<K, V> kv = updmap.iterator().next();
-        // create it tombed so that it gets compressed on subsequent accesses
-        return new TNode<>(kv.getKey(), kv.getValue(), ct.computeHash(kv.getKey()));
+        return new LNode<>(map);
     }
 
-    Option<V> get(final K k) {
+    Optional<V> get(final K k) {
         return listmap.get(k);
     }
 
@@ -59,8 +64,7 @@ final class LNode<K, V> extends MainNode<K, V> implements Iterable<Entry<K, V>>
         return "LNode";
     }
 
-    @Override
-    public Iterator<Entry<K, V>> iterator() {
+    Iterator<Entry<K, V>> iterator() {
         return listmap.iterator();
     }
 }
\ No newline at end of file