From: Robert Varga Date: Mon, 8 Nov 2021 07:49:15 +0000 (+0100) Subject: Remove UnsignedLongSet.addImpl() X-Git-Tag: v4.0.7~43 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=ec1d15d2b52cb8f378ff685c2c3400b71c5ec360 Remove UnsignedLongSet.addImpl() We now do not share utilities in UnsignedLongSet, hence relocate implementation code to MutableUnsignedLongSet.add(). JIRA: CONTROLLER-2014 Change-Id: Id1578a8ea639ed512d55b2e6dca26de5abdf3ab0 Signed-off-by: Robert Varga --- diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/MutableUnsignedLongSet.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/MutableUnsignedLongSet.java index e455f90d89..6fdb04f1fe 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/MutableUnsignedLongSet.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/MutableUnsignedLongSet.java @@ -31,7 +31,45 @@ public final class MutableUnsignedLongSet extends UnsignedLongSet implements Mut } public void add(final long longBits) { - addImpl(longBits); + final var ranges = trustedRanges(); + final var range = Entry.of(longBits); + + // We need Iterator.remove() to perform efficient merge below + final var headIt = ranges.headSet(range, true).descendingIterator(); + if (headIt.hasNext()) { + final var head = headIt.next(); + if (head.contains(longBits)) { + return; + } + + // Merge into head entry if possible + if (head.upperBits + 1 == longBits) { + head.upperBits = longBits; + + // Potentially merge head entry and tail entry + final var tail = ranges.higher(range); + if (tail != null) { + if (tail.lowerBits - 1 == longBits) { + // Expand tail, remove head + tail.lowerBits = head.lowerBits; + headIt.remove(); + } + } + return; + } + } + + final var tail = ranges.higher(range); + if (tail != null) { + // Merge into tail entry if possible + if (tail.lowerBits - 1 == longBits) { + tail.lowerBits = longBits; + return; + } + } + + // No luck, store a new entry + ranges.add(range); } public ImmutableRangeSet toRangeSet() { diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/UnsignedLongSet.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/UnsignedLongSet.java index ca45a3c45f..daf958a987 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/UnsignedLongSet.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/UnsignedLongSet.java @@ -137,39 +137,6 @@ abstract class UnsignedLongSet { this.ranges = requireNonNull(ranges); } - final void addImpl(final long longBits) { - final var range = Entry.of(longBits); - - final var headIt = ranges.headSet(range, true).descendingIterator(); - if (headIt.hasNext()) { - final var head = headIt.next(); - if (head.contains(longBits)) { - return; - } - if (head.upperBits + 1 == longBits) { - head.upperBits = longBits; - final var tail = ranges.higher(range); - if (tail != null) { - if (tail.lowerBits - 1 == longBits) { - tail.lowerBits = head.lowerBits; - headIt.remove(); - } - } - return; - } - } - - final var tail = ranges.higher(range); - if (tail != null) { - if (tail.lowerBits - 1 == longBits) { - tail.lowerBits = longBits; - return; - } - } - - ranges.add(range); - } - public final boolean contains(final long longBits) { final var head = ranges.floor(Entry.of(longBits)); return head != null && head.contains(longBits);