Correct Spliterator characteristics 51/72451/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 29 May 2018 19:40:51 +0000 (21:40 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 29 May 2018 19:40:51 +0000 (21:40 +0200)
Mutable KeySet/EntrySet versions should report Spliterator.CONCURRENT
rather than Spliterator.IMMUTABLE. Fix that.

Change-Id: I592f79e7ac7b5d401f852ba6981efd490df5c36d
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
third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/ImmutableEntrySet.java
third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/ImmutableKeySet.java
third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/MutableEntrySet.java
third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/MutableKeySet.java

index 6ccee5a33f6c047c5d2273db96dc7a315360b84d..e82ba87a345b0febdc9d12372b5fecb82a16ee1e 100644 (file)
@@ -66,8 +66,8 @@ abstract class AbstractEntrySet<K, V> extends AbstractSet<Entry<K, V>> {
     @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);
+        return Spliterators.spliterator(map.immutableIterator(), Long.MAX_VALUE, characteristics());
     }
+
+    abstract int characteristics();
 }
index e04dc46c88b77429ba2f5e3ea9b7ab0b43dbf76b..6ed480777fe54a8c0b5286020a059f0a776303cd 100644 (file)
@@ -74,7 +74,8 @@ abstract class AbstractKeySet<K> extends AbstractSet<K> {
     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);
+            spliteratorCharacteristics());
     }
+
+    abstract int spliteratorCharacteristics();
 }
index 141f42c245db4ba0b6a187c2e132d8279c6651d3..e09e925e7183d2939956d3ee6610e4f02151d44f 100644 (file)
@@ -20,6 +20,7 @@ import static org.opendaylight.yangtools.triemap.ImmutableTrieMap.unsupported;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Map.Entry;
+import java.util.Spliterator;
 
 /**
  * {@link AbstractEntrySet} implementation guarding against attempts to mutate the underlying map.
@@ -61,4 +62,9 @@ final class ImmutableEntrySet<K, V> extends AbstractEntrySet<K, V> {
     public boolean retainAll(final Collection<?> c) {
         throw unsupported();
     }
+
+    @Override
+    int characteristics() {
+        return Spliterator.DISTINCT | Spliterator.IMMUTABLE | Spliterator.NONNULL;
+    }
 }
index 8cfbfecff2066e4316cecb8971f6673ac1ea9c44..bee8975e715ef1fa3ec9f1f5786b7083ff7bd7d6 100644 (file)
@@ -21,6 +21,7 @@ import com.google.common.collect.Iterators;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Map.Entry;
+import java.util.Spliterator;
 
 /**
  * An immutable view of a TrieMap's key set.
@@ -61,4 +62,9 @@ final class ImmutableKeySet<K> extends AbstractKeySet<K> {
     public boolean removeAll(final Collection<?> c) {
         throw unsupported();
     }
+
+    @Override
+    int spliteratorCharacteristics() {
+        return Spliterator.DISTINCT | Spliterator.IMMUTABLE | Spliterator.NONNULL;
+    }
 }
index 04ddb8818931e9a0b694696e7fca30329ea5b6d0..07f8310063b7a22f58ad92d04ac097252b00ad3c 100644 (file)
@@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkArgument;
 
 import java.util.Iterator;
 import java.util.Map.Entry;
+import java.util.Spliterator;
 
 /**
  * Support for EntrySet operations required by the Map interface.
@@ -72,4 +73,9 @@ final class MutableEntrySet<K, V> extends AbstractEntrySet<K, V> {
 
         return map().remove(key, value);
     }
+
+    @Override
+    int characteristics() {
+        return Spliterator.DISTINCT | Spliterator.CONCURRENT | Spliterator.NONNULL;
+    }
 }
index 9cb72b079f8374b11636c4feb6186f379a60cc4f..1910cb1ebf2b8e77f396e1115be12065c852e927 100644 (file)
@@ -16,6 +16,7 @@
 package org.opendaylight.yangtools.triemap;
 
 import java.util.Iterator;
+import java.util.Spliterator;
 
 /**
  * A mutable view of a TrieMap's key set.
@@ -60,4 +61,9 @@ final class MutableKeySet<K> extends AbstractKeySet<K> {
     public boolean remove(final Object o) {
         return map().remove(o) != null;
     }
+
+    @Override
+    int spliteratorCharacteristics() {
+        return Spliterator.DISTINCT | Spliterator.CONCURRENT | Spliterator.NONNULL;
+    }
 }