summaryrefslogtreecommitdiffstats
path: root/guava/src/com/google/common/collect/ExplicitOrdering.java
diff options
context:
space:
mode:
authorYohann Roussel <yroussel@google.com>2014-03-19 16:25:37 +0100
committerYohann Roussel <yroussel@google.com>2014-03-20 15:13:33 +0100
commit4eceb95409e844fdc33c9c706e1dc307bfd40303 (patch)
treeee9f4f3fc79f757c79081c336bce4f1782c6ccd8 /guava/src/com/google/common/collect/ExplicitOrdering.java
parent3d2402901b1a6462e2cf47a6fd09711f327961c3 (diff)
downloadtoolchain_jack-4eceb95409e844fdc33c9c706e1dc307bfd40303.zip
toolchain_jack-4eceb95409e844fdc33c9c706e1dc307bfd40303.tar.gz
toolchain_jack-4eceb95409e844fdc33c9c706e1dc307bfd40303.tar.bz2
Initial Jack import.
Change-Id: I953cf0a520195a7187d791b2885848ad0d5a9b43
Diffstat (limited to 'guava/src/com/google/common/collect/ExplicitOrdering.java')
-rw-r--r--guava/src/com/google/common/collect/ExplicitOrdering.java78
1 files changed, 78 insertions, 0 deletions
diff --git a/guava/src/com/google/common/collect/ExplicitOrdering.java b/guava/src/com/google/common/collect/ExplicitOrdering.java
new file mode 100644
index 0000000..0a2e181
--- /dev/null
+++ b/guava/src/com/google/common/collect/ExplicitOrdering.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2007 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.collect;
+
+import com.google.common.annotations.GwtCompatible;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+/** An ordering that compares objects according to a given order. */
+@GwtCompatible(serializable = true)
+final class ExplicitOrdering<T> extends Ordering<T> implements Serializable {
+ final ImmutableMap<T, Integer> rankMap;
+
+ ExplicitOrdering(List<T> valuesInOrder) {
+ this(buildRankMap(valuesInOrder));
+ }
+
+ ExplicitOrdering(ImmutableMap<T, Integer> rankMap) {
+ this.rankMap = rankMap;
+ }
+
+ @Override public int compare(T left, T right) {
+ return rank(left) - rank(right); // safe because both are nonnegative
+ }
+
+ private int rank(T value) {
+ Integer rank = rankMap.get(value);
+ if (rank == null) {
+ throw new IncomparableValueException(value);
+ }
+ return rank;
+ }
+
+ private static <T> ImmutableMap<T, Integer> buildRankMap(
+ List<T> valuesInOrder) {
+ ImmutableMap.Builder<T, Integer> builder = ImmutableMap.builder();
+ int rank = 0;
+ for (T value : valuesInOrder) {
+ builder.put(value, rank++);
+ }
+ return builder.build();
+ }
+
+ @Override public boolean equals(@Nullable Object object) {
+ if (object instanceof ExplicitOrdering) {
+ ExplicitOrdering<?> that = (ExplicitOrdering<?>) object;
+ return this.rankMap.equals(that.rankMap);
+ }
+ return false;
+ }
+
+ @Override public int hashCode() {
+ return rankMap.hashCode();
+ }
+
+ @Override public String toString() {
+ return "Ordering.explicit(" + rankMap.keySet() + ")";
+ }
+
+ private static final long serialVersionUID = 0;
+}