Skip to content

Commit

Permalink
Use MultimapBuilder instead of a custom Multimap subclass in Immutabl…
Browse files Browse the repository at this point in the history
…eMultimap builders.

(Retry of CL 100504590, which was rolled back in CL 100578593. The problematic target has been fixed.)
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=101478691
  • Loading branch information
cpovirk committed Aug 25, 2015
1 parent 07a277b commit f952844
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 84 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
Expand Down Expand Up @@ -125,24 +124,6 @@ public static <K, V> Builder<K, V> builder() {
return new Builder<K, V>();
}

/**
* Multimap for {@link ImmutableMultimap.Builder} that maintains key and
* value orderings, allows duplicate values, and performs better than
* {@link LinkedListMultimap}.
*/
private static class BuilderMultimap<K, V> extends AbstractMapBasedMultimap<K, V> {
BuilderMultimap() {
super(new LinkedHashMap<K, Collection<V>>());
}

@Override
Collection<V> createCollection() {
return Lists.newArrayList();
}

private static final long serialVersionUID = 0;
}

/**
* A builder for creating immutable multimap instances, especially
* {@code public static final} multimaps ("constant multimaps"). Example:
Expand All @@ -162,15 +143,21 @@ Collection<V> createCollection() {
* @since 2.0
*/
public static class Builder<K, V> {
Multimap<K, V> builderMultimap = new BuilderMultimap<K, V>();
Multimap<K, V> builderMultimap;
Comparator<? super K> keyComparator;
Comparator<? super V> valueComparator;

/**
* Creates a new builder. The returned builder is equivalent to the builder
* generated by {@link ImmutableMultimap#builder}.
*/
public Builder() {}
public Builder() {
this(MultimapBuilder.linkedHashKeys().arrayListValues().<K, V>build());
}

Builder(Multimap<K, V> builderMultimap) {
this.builderMultimap = builderMultimap;
}

/**
* Adds a key-value mapping to the built multimap.
Expand Down Expand Up @@ -280,7 +267,8 @@ public ImmutableMultimap<K, V> build() {
}
}
if (keyComparator != null) {
Multimap<K, V> sortedCopy = new BuilderMultimap<K, V>();
Multimap<K, V> sortedCopy =
MultimapBuilder.linkedHashKeys().arrayListValues().<K, V>build();
List<Map.Entry<K, Collection<V>>> entries =
Ordering.from(keyComparator)
.<K>onKeys()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
Expand Down Expand Up @@ -129,23 +128,6 @@ public static <K, V> Builder<K, V> builder() {
return new Builder<K, V>();
}

/**
* Multimap for {@link ImmutableSetMultimap.Builder} that maintains key
* and value orderings and performs better than {@link LinkedHashMultimap}.
*/
private static class BuilderMultimap<K, V> extends AbstractMapBasedMultimap<K, V> {
BuilderMultimap() {
super(new LinkedHashMap<K, Collection<V>>());
}

@Override
Collection<V> createCollection() {
return Sets.newLinkedHashSet();
}

private static final long serialVersionUID = 0;
}

/**
* A builder for creating immutable {@code SetMultimap} instances, especially
* {@code public static final} multimaps ("constant multimaps"). Example:
Expand All @@ -170,7 +152,7 @@ public static final class Builder<K, V> extends ImmutableMultimap.Builder<K, V>
* generated by {@link ImmutableSetMultimap#builder}.
*/
public Builder() {
builderMultimap = new BuilderMultimap<K, V>();
super(MultimapBuilder.linkedHashKeys().linkedHashSetValues().<K, V>build());
}

/**
Expand Down Expand Up @@ -264,7 +246,8 @@ public Builder<K, V> orderValuesBy(Comparator<? super V> valueComparator) {
@Override
public ImmutableSetMultimap<K, V> build() {
if (keyComparator != null) {
Multimap<K, V> sortedCopy = new BuilderMultimap<K, V>();
Multimap<K, V> sortedCopy =
MultimapBuilder.linkedHashKeys().linkedHashSetValues().<K, V>build();
List<Map.Entry<K, Collection<V>>> entries =
Ordering.from(keyComparator)
.<K>onKeys()
Expand Down
32 changes: 10 additions & 22 deletions guava/src/com/google/common/collect/ImmutableMultimap.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
Expand Down Expand Up @@ -126,24 +125,6 @@ public static <K, V> Builder<K, V> builder() {
return new Builder<K, V>();
}

/**
* Multimap for {@link ImmutableMultimap.Builder} that maintains key and
* value orderings, allows duplicate values, and performs better than
* {@link LinkedListMultimap}.
*/
private static class BuilderMultimap<K, V> extends AbstractMapBasedMultimap<K, V> {
BuilderMultimap() {
super(new LinkedHashMap<K, Collection<V>>());
}

@Override
Collection<V> createCollection() {
return Lists.newArrayList();
}

private static final long serialVersionUID = 0;
}

/**
* A builder for creating immutable multimap instances, especially
* {@code public static final} multimaps ("constant multimaps"). Example:
Expand All @@ -163,15 +144,21 @@ Collection<V> createCollection() {
* @since 2.0
*/
public static class Builder<K, V> {
Multimap<K, V> builderMultimap = new BuilderMultimap<K, V>();
Multimap<K, V> builderMultimap;
Comparator<? super K> keyComparator;
Comparator<? super V> valueComparator;

/**
* Creates a new builder. The returned builder is equivalent to the builder
* generated by {@link ImmutableMultimap#builder}.
*/
public Builder() {}
public Builder() {
this(MultimapBuilder.linkedHashKeys().arrayListValues().<K, V>build());
}

Builder(Multimap<K, V> builderMultimap) {
this.builderMultimap = builderMultimap;
}

/**
* Adds a key-value mapping to the built multimap.
Expand Down Expand Up @@ -281,7 +268,8 @@ public ImmutableMultimap<K, V> build() {
}
}
if (keyComparator != null) {
Multimap<K, V> sortedCopy = new BuilderMultimap<K, V>();
Multimap<K, V> sortedCopy =
MultimapBuilder.linkedHashKeys().arrayListValues().<K, V>build();
List<Map.Entry<K, Collection<V>>> entries =
Ordering.from(keyComparator)
.<K>onKeys()
Expand Down
23 changes: 3 additions & 20 deletions guava/src/com/google/common/collect/ImmutableSetMultimap.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
Expand Down Expand Up @@ -134,23 +133,6 @@ public static <K, V> Builder<K, V> builder() {
return new Builder<K, V>();
}

/**
* Multimap for {@link ImmutableSetMultimap.Builder} that maintains key
* and value orderings and performs better than {@link LinkedHashMultimap}.
*/
private static class BuilderMultimap<K, V> extends AbstractMapBasedMultimap<K, V> {
BuilderMultimap() {
super(new LinkedHashMap<K, Collection<V>>());
}

@Override
Collection<V> createCollection() {
return Sets.newLinkedHashSet();
}

private static final long serialVersionUID = 0;
}

/**
* A builder for creating immutable {@code SetMultimap} instances, especially
* {@code public static final} multimaps ("constant multimaps"). Example:
Expand All @@ -175,7 +157,7 @@ public static final class Builder<K, V> extends ImmutableMultimap.Builder<K, V>
* generated by {@link ImmutableSetMultimap#builder}.
*/
public Builder() {
builderMultimap = new BuilderMultimap<K, V>();
super(MultimapBuilder.linkedHashKeys().linkedHashSetValues().<K, V>build());
}

/**
Expand Down Expand Up @@ -269,7 +251,8 @@ public Builder<K, V> orderValuesBy(Comparator<? super V> valueComparator) {
@Override
public ImmutableSetMultimap<K, V> build() {
if (keyComparator != null) {
Multimap<K, V> sortedCopy = new BuilderMultimap<K, V>();
Multimap<K, V> sortedCopy =
MultimapBuilder.linkedHashKeys().linkedHashSetValues().<K, V>build();
List<Map.Entry<K, Collection<V>>> entries =
Ordering.from(keyComparator)
.<K>onKeys()
Expand Down

0 comments on commit f952844

Please sign in to comment.