From a93f1fb12c8e56cfb6bfdca2400e764e7eba3e67 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 30 Dec 2016 14:36:36 +0100 Subject: [PATCH 1/1] BUG-7464: Cleanup CNode instantiation Reorder arguments being passed in so we can use variadic arguments for nodes. This allows us to make the code more concise by leaving array allocation up to the compiler. For root nodes reuse an empty array instance, hosted in CNode instead of allocating a new one for each new TrieMap. Change-Id: Ic0574917d5d38c62b94594d1bce27a731c90838c Signed-off-by: Robert Varga --- .../opendaylight/yangtools/triemap/CNode.java | 23 +++++++++++-------- .../yangtools/triemap/TrieMap.java | 4 +--- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/CNode.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/CNode.java index 581594346e..489a6ef109 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/CNode.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/CNode.java @@ -16,12 +16,17 @@ package org.opendaylight.yangtools.triemap; final class CNode extends CNodeBase { + private static final BasicNode[] EMPTY_ARRAY = new BasicNode[0]; final int bitmap; final BasicNode[] array; final Gen gen; - CNode(final int bitmap, final BasicNode[] array, final Gen gen) { + CNode(final Gen gen) { + this(gen, 0, EMPTY_ARRAY); + } + + private CNode(final Gen gen, final int bitmap, final BasicNode... array) { this.bitmap = bitmap; this.array = array; this.gen = gen; @@ -76,7 +81,7 @@ final class CNode extends CNodeBase { BasicNode[] narr = new BasicNode[len]; System.arraycopy(array, 0, narr, 0, len); narr[pos] = nn; - return new CNode<>(bitmap, narr, gen); + return new CNode<>(gen, bitmap, narr); } CNode removedAt(final int pos, final int flag, final Gen gen) { @@ -85,7 +90,7 @@ final class CNode extends CNodeBase { BasicNode[] narr = new BasicNode[len - 1]; System.arraycopy(arr, 0, narr, 0, pos); System.arraycopy(arr, pos + 1, narr, pos, len - pos - 1); - return new CNode<>(bitmap ^ flag, narr, gen); + return new CNode<>(gen, bitmap ^ flag, narr); } CNode insertedAt(final int pos, final int flag, final BasicNode nn, final Gen gen) { @@ -95,7 +100,7 @@ final class CNode extends CNodeBase { System.arraycopy(array, 0, narr, 0, pos); narr [pos] = nn; System.arraycopy(array, pos, narr, pos + 1, len - pos); - return new CNode<>(bmp | flag, narr, gen); + return new CNode<>(gen, bmp | flag, narr); } /** @@ -117,7 +122,7 @@ final class CNode extends CNodeBase { } i += 1; } - return new CNode<>(bitmap, narr, ngen); + return new CNode<>(ngen, bitmap, narr); } private BasicNode resurrect(final INode inode, final Object inodemain) { @@ -166,7 +171,7 @@ final class CNode extends CNodeBase { i += 1; } - return new CNode (bmp, tmparray, gen).toContracted (lev); + return new CNode(gen, bmp, tmparray).toContracted(lev); } @Override @@ -217,12 +222,12 @@ final class CNode extends CNodeBase { if (xidx == yidx) { INode subinode = new INode<>(gen, dual(x, xhc, y, yhc, lev + 5, gen)); - return new CNode<>(bmp, new BasicNode[] { subinode }, gen); + return new CNode<>(gen, bmp, subinode); } else { if (xidx < yidx) { - return new CNode<>(bmp, new BasicNode[] { x, y }, gen); + return new CNode<>(gen, bmp, x, y); } else { - return new CNode<>(bmp, new BasicNode[] { y, x }, gen); + return new CNode<>(gen, bmp, y, x); } } } else { diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TrieMap.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TrieMap.java index 881090e7b3..311f763491 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TrieMap.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TrieMap.java @@ -155,11 +155,9 @@ public class TrieMap extends AbstractMap implements ConcurrentMap INode newRootNode() { final Gen gen = new Gen(); - final CNode cn = new CNode<>(0, new BasicNode[] {}, gen); - return new INode<>(gen, cn); + return new INode<>(gen, new CNode<>(gen)); } final boolean CAS_ROOT (final Object ov, final Object nv) { -- 2.36.6