From d454ec97e44021019de9c6fad4f09d447f7bfcb8 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 2 Jan 2017 13:21:01 +0100 Subject: [PATCH] BUG-7464: Deduplicate code in INode.rec_insertif() CPD complains about 11 lines being shared between the no-condition and absent cases. Move common code into a utility method, thus removing duplication. Change-Id: I5b5a22e54383caefc749954094e5294a3873d5bc Signed-off-by: Robert Varga --- .../opendaylight/yangtools/triemap/INode.java | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/INode.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/INode.java index b86d4c4152..74ef6236d0 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/INode.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/INode.java @@ -142,6 +142,7 @@ final class INode extends BasicNode { final int bmp = cn.bitmap; final int mask = flag - 1; final int pos = Integer.bitCount(bmp & mask); + if ((bmp & flag) != 0) { // 1a) insert below final BasicNode cnAtPos = cn.array[pos]; @@ -203,6 +204,14 @@ final class INode extends BasicNode { return rec_insertif(k, v, hc, cond, lev, parent, gen, ct); } + private Optional insertDual(final TrieMap ct, final CNode cn, final int pos, final SNode sn, + final K k, final V v, final int hc, final int lev) { + final CNode rn = (cn.gen == gen) ? cn : cn.renewed(gen, ct); + final MainNode nn = rn.updatedAt(pos, inode(CNode.dual(sn, sn.hc, new SNode<>(k, v, hc), + hc, lev + 5, gen)), gen); + return GCAS(cn, nn, ct) ? Optional.empty() : null; + } + private Optional rec_insertif(final K k, final V v, final int hc, final Object cond, final int lev, final INode parent, final Gen startgen, final TrieMap ct) { while (true) { @@ -243,27 +252,13 @@ final class INode extends BasicNode { return null; } - final CNode rn = (cn.gen == gen) ? cn : cn.renewed(gen, ct); - final MainNode nn = rn.updatedAt(pos, inode (CNode.dual(sn, sn.hc, - new SNode<>(k, v, hc), hc, lev + 5, gen)), gen); - if (GCAS(cn, nn, ct)) { - return Optional.empty(); - } - - return null; + return insertDual(ct, cn, pos, sn, k, v, hc, lev); } else if (cond == ABSENT) { if (sn.hc == hc && ct.equal(sn.k, k)) { return Optional.of(sn.v); } - final CNode rn = (cn.gen == gen) ? cn : cn.renewed(gen, ct); - final MainNode nn = rn.updatedAt(pos, inode (CNode.dual(sn, sn.hc, - new SNode<>(k, v, hc), hc, lev + 5, gen)), gen); - if (GCAS(cn, nn, ct)) { - return Optional.empty(); - } - - return null; + return insertDual(ct, cn, pos, sn, k, v, hc, lev); } else if (cond == PRESENT) { if (sn.hc == hc && ct.equal(sn.k, k)) { if (GCAS(cn, cn.updatedAt(pos, new SNode<>(k, v, hc), gen), ct)) { @@ -366,6 +361,7 @@ final class INode extends BasicNode { final int idx = (hc >>> lev) & 0x1f; final int flag = 1 << idx; final int bmp = cn.bitmap; + if ((bmp & flag) == 0) { // 1a) bitmap shows no binding return null; -- 2.36.6