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>
import java.util.AbstractSet;
import java.util.Map.Entry;
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.
/**
* Abstract base class for implementing {@link TrieMap} entry sets.
public final int size() {
return map.size();
}
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);
+ }
import static java.util.Objects.requireNonNull;
import static java.util.Objects.requireNonNull;
+import com.google.common.collect.Iterators;
import java.util.AbstractSet;
import java.util.Collection;
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.
/**
* Abstract base class for key set views of a TrieMap.
public final int size() {
return map.size();
}
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);
+ }