Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.SortedSet;
import java.util.Spliterator;
import java.util.TreeSet;
import java.util.function.BiPredicate;
import java.util.stream.Collector;
Expand Down Expand Up @@ -1225,4 +1226,33 @@ public void testBuilderAsymptotics() {
assertThat(compares[0]).isAtMost(10000);
// hopefully something quadratic would have more digits
}

@GwtIncompatible // Spliterator
public void testSpliteratorComparator_naturalOrdering() {
// Per Spliterator.getComparator() contract, null indicates natural ordering
ImmutableSortedSet<Integer> set = ImmutableSortedSet.of(1, 2, 3);
Spliterator<Integer> spliterator = set.spliterator();
assertThat(spliterator.hasCharacteristics(Spliterator.SORTED)).isTrue();
assertThat(spliterator.getComparator()).isNull();
}

@GwtIncompatible // Spliterator
public void testSpliteratorComparator_customComparator() {
// Custom comparator should be returned from getComparator()
Comparator<Integer> comparator = Comparator.reverseOrder();
ImmutableSortedSet<Integer> set =
ImmutableSortedSet.orderedBy(comparator).add(1, 2, 3).build();
Spliterator<Integer> spliterator = set.spliterator();
assertThat(spliterator.hasCharacteristics(Spliterator.SORTED)).isTrue();
assertThat(spliterator.getComparator()).isEqualTo(comparator);
}

@GwtIncompatible // Spliterator
public void testAsListSpliteratorComparator_naturalOrdering() {
// asList().spliterator() should also return null for natural ordering
ImmutableSortedSet<Integer> set = ImmutableSortedSet.of(1, 2, 3);
Spliterator<Integer> spliterator = set.asList().spliterator();
assertThat(spliterator.hasCharacteristics(Spliterator.SORTED)).isTrue();
assertThat(spliterator.getComparator()).isNull();
}
}
7 changes: 6 additions & 1 deletion guava/src/com/google/common/collect/CollectSpliterators.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ private CollectSpliterators() {}
if (comparator != null) {
checkArgument((extraCharacteristics & Spliterator.SORTED) != 0);
}
// Per Spliterator.getComparator() contract, return null for natural ordering
@Nullable Comparator<? super T> spliteratorComparator =
(comparator == Ordering.natural() || comparator == Comparator.naturalOrder())
? null
: comparator;
final class WithCharacteristics implements Spliterator<T> {
private final Spliterator.OfInt delegate;

Expand Down Expand Up @@ -92,7 +97,7 @@ public int characteristics() {
@Override
public @Nullable Comparator<? super T> getComparator() {
if (hasCharacteristics(Spliterator.SORTED)) {
return comparator;
return spliteratorComparator;
} else {
throw new IllegalStateException();
}
Expand Down
3 changes: 3 additions & 0 deletions guava/src/com/google/common/collect/ImmutableSortedSet.java
Original file line number Diff line number Diff line change
Expand Up @@ -833,6 +833,9 @@ public boolean tryAdvance(Consumer<? super E> action) {

@Override
public Comparator<? super E> getComparator() {
if (comparator == Ordering.natural() || comparator == Comparator.naturalOrder()) {
return null;
}
return comparator;
}
};
Expand Down
Loading