blob: 59cac4251437b87498d152af2083131437e79eb2 [file] [log] [blame]
// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.utils;
import com.android.tools.r8.errors.Unreachable;
import java.util.Comparator;
import java.util.List;
public class ComparatorUtils {
public static <T extends Comparable<T>> Comparator<List<T>> listComparator() {
return listComparator(T::compareTo);
}
public static <T> Comparator<List<T>> listComparator(Comparator<T> comparator) {
return (List<T> xs, List<T> ys) -> {
int diff = Integer.compare(xs.size(), ys.size());
for (int i = 0; i < xs.size() && diff == 0; i++) {
diff = comparator.compare(xs.get(i), ys.get(i));
}
return diff;
};
}
// Compare pair-wise integers in sequenced order, i.e., (A1, A2), (B1, B2), (C1, C2), ...
public static int compareInts(int... ints) {
assert ints.length % 2 == 0;
int diff = 0;
for (int i = 0; i < ints.length && diff == 0; ) {
diff = Integer.compare(ints[i++], ints[i++]);
}
return diff;
}
public static int compareIntArray(int[] xs, int[] ys) {
int diff = Integer.compare(xs.length, ys.length);
for (int i = 0; i < xs.length && diff == 0; i++) {
diff = Integer.compare(xs[i], ys[i]);
}
return diff;
}
public static int compareShortArray(short[] xs, short[] ys) {
int diff = Integer.compare(xs.length, ys.length);
for (int i = 0; i < xs.length && diff == 0; i++) {
diff = Short.compare(xs[i], ys[i]);
}
return diff;
}
public static <T extends Comparable<T>> Comparator<T[]> arrayComparator() {
return arrayComparator(T::compareTo);
}
public static <T> Comparator<T[]> arrayComparator(Comparator<T> comparator) {
return (T[] xs, T[] ys) -> {
int diff = Integer.compare(xs.length, ys.length);
for (int i = 0; i < xs.length && diff == 0; i++) {
diff = comparator.compare(xs[i], ys[i]);
}
return diff;
};
}
public static <T> Comparator<T> unreachableComparator() {
return (t1, t2) -> {
throw new Unreachable();
};
}
}