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=1235323f99771d61fdf16baf29eb1cdc2c29d7b5;hb=95261f2acd835b1c2f8ef4da96bd8ad18eec30b3;hp=2f2c96c0e594d72ce7a1e23ea4d01c5a65649115;hpb=424b4b473d472d6a72e0e0bade7a4df475057fa9;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 2f2c96c0e5..1235323f99 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,52 +15,58 @@ */ package org.opendaylight.yangtools.triemap; -import java.util.Iterator; -import java.util.Map.Entry; +final class LNode extends MainNode { + // Internally-linked single list of of entries + private final LNodeEntries entries; + private final int size; -final class LNode extends MainNode implements Iterable> { - private final ListMap listmap; - - private LNode(final ListMap 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(ListMap.map(k1, v1, k2, v2)); + this(LNodeEntries.map(k1, v1, k2, v2), 2); } - LNode inserted(final K k, final V v) { - return new LNode<>(listmap.add(k, v)); + LNode insertChild(final K key, final V value) { + return new LNode<>(entries.insert(key, value), size + 1); } - MainNode removed(final K k, final TrieMap ct) { - final ListMap updmap = listmap.remove(k); - if (updmap.size() > 1) { - return new LNode<>(updmap); + MainNode removeChild(final LNodeEntry entry, final int hc) { + // 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); } - final Entry 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, size - 1); } - Option get(final K k) { - return listmap.get(k); + MainNode replaceChild(final LNodeEntry entry, final V value) { + return new LNode<>(entries.replace(entry, value), size); } - @Override - int cachedSize(final TrieMap ct) { - return listmap.size(); + LNodeEntry get(final Equivalence equiv, final K key) { + return entries.findEntry(equiv, key); + } + + LNodeEntries entries() { + return entries; } @Override - String string(final int lev) { - // (" " * lev) + "LNode(%s)".format(listmap.mkString(", ")) - return "LNode"; + int trySize() { + return size; } @Override - public Iterator> iterator() { - return listmap.iterator(); + int size(final ImmutableTrieMap ct) { + return size; } -} \ No newline at end of file +}