From: Robert Varga Date: Thu, 14 Sep 2017 15:20:19 +0000 (+0200) Subject: Add EntrySet/KeySet spliterators X-Git-Tag: v2.0.0~210 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F44%2F63144%2F4;p=yangtools.git Add EntrySet/KeySet spliterators Spliterators do not allow modification of underlying map, hence we can always instantiate an immutable iterator and flag appropriate characteristics. This is an initial cut, which is not perfect: we still should create dedicated spliterators, which do not instantie entries nor perform lookahead and have optimized trySplit(). Change-Id: Iad1a8f4b30d5a996484b21c9be589bf80ee7d584 Signed-off-by: Robert Varga --- diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/AbstractEntrySet.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/AbstractEntrySet.java index 4eb05ba1ab..6ccee5a33f 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/AbstractEntrySet.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/AbstractEntrySet.java @@ -19,6 +19,8 @@ import static java.util.Objects.requireNonNull; import java.util.AbstractSet; import java.util.Map.Entry; +import java.util.Spliterator; +import java.util.Spliterators; /** * Abstract base class for implementing {@link TrieMap} entry sets. @@ -60,4 +62,12 @@ abstract class AbstractEntrySet extends AbstractSet> { public final int size() { return map.size(); } + + @Override + public final Spliterator> spliterator() { + // TODO: this is backed by an Iterator, we should be able to do better + return Spliterators.spliterator(map.immutableIterator(), Long.MAX_VALUE, + // XXX: Distinct as far as associated Equivalence allows + Spliterator.DISTINCT | Spliterator.IMMUTABLE | Spliterator.NONNULL); + } } diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/AbstractKeySet.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/AbstractKeySet.java index 869a15dbd3..e04dc46c88 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/AbstractKeySet.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/AbstractKeySet.java @@ -17,8 +17,12 @@ package org.opendaylight.yangtools.triemap; import static java.util.Objects.requireNonNull; +import com.google.common.collect.Iterators; import java.util.AbstractSet; import java.util.Collection; +import java.util.Map.Entry; +import java.util.Spliterator; +import java.util.Spliterators; /** * Abstract base class for key set views of a TrieMap. @@ -65,4 +69,12 @@ abstract class AbstractKeySet extends AbstractSet { public final int size() { return map.size(); } + + @Override + public final Spliterator spliterator() { + // TODO: this is backed by an Iterator, we should be able to do better + return Spliterators.spliterator(Iterators.transform(map().immutableIterator(), Entry::getKey), Long.MAX_VALUE, + // XXX: Distinct as far as associated Equivalence allows + Spliterator.DISTINCT | Spliterator.IMMUTABLE | Spliterator.NONNULL); + } }