Add EntrySet/KeySet spliterators 44/63144/4
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 14 Sep 2017 15:20:19 +0000 (17:20 +0200)
committerRobert Varga <nite@hq.sk>
Fri, 6 Oct 2017 15:23:49 +0000 (15:23 +0000)
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 <robert.varga@pantheon.tech>
third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/AbstractEntrySet.java
third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/AbstractKeySet.java

index 4eb05ba1ab13f44f121e2a30502a0bf2d601d251..6ccee5a33f6c047c5d2273db96dc7a315360b84d 100644 (file)
@@ -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<K, V> extends AbstractSet<Entry<K, V>> {
     public final int size() {
         return map.size();
     }
+
+    @Override
+    public final Spliterator<Entry<K, V>> 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);
+    }
 }
index 869a15dbd38a1ac844606bfd9d05030d7b68f597..e04dc46c88b77429ba2f5e3ea9b7ab0b43dbf76b 100644 (file)
@@ -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<K> extends AbstractSet<K> {
     public final int size() {
         return map.size();
     }
+
+    @Override
+    public final Spliterator<K> 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);
+    }
 }