X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=third-party%2Ftriemap%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Ftriemap%2FLNode.java;h=b4a32244466042debb13ed32e0a9019ed5747601;hb=fa324c628d5bf5753b22c9c54224a9b885dc2227;hp=ca28a06216a9962971da57e3e77a35146e170ac1;hpb=ff3a186d75711a020e19f10088df06e7ac95759c;p=yangtools.git diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/LNode.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/LNode.java index ca28a06216..b4a3224446 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/LNode.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/LNode.java @@ -15,47 +15,54 @@ */ package org.opendaylight.yangtools.triemap; -import java.util.Iterator; -import java.util.Map.Entry; - final class LNode extends MainNode { - private final LNodeEntries listmap; + // Internally-linked single list of of entries + private final LNodeEntries entries; + private final int size; - private LNode(final LNodeEntries listmap) { - this.listmap = listmap; + private LNode(final LNodeEntries 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 insertChild( final K k, final V v) { - return new LNode<>(listmap.insert(k, v)); + return new LNode<>(entries.insert(k, v), size + 1); } MainNode removeChild(final LNodeEntry 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 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 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 replaceChild(final LNodeEntry entry, final V v) { - return new LNode<>(listmap.replace(entry, v)); + return new LNode<>(entries.replace(entry, v), size); } LNodeEntry get(final Equivalence equiv, final K k) { - return listmap.findEntry(equiv, k); + return entries.findEntry(equiv, k); + } + + LNodeEntries entries() { + return entries; } @Override int cachedSize(final TrieMap ct) { - return listmap.size(); + return size; } @Override @@ -63,8 +70,4 @@ final class LNode extends MainNode { // (" " * lev) + "LNode(%s)".format(listmap.mkString(", ")) return "LNode"; } - - Iterator> iterator() { - return listmap.iterator(); - } -} \ No newline at end of file +}