| // Copyright (c) 2019, 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.ir.desugar.backports; |
| |
| import java.util.Arrays; |
| import java.util.Comparator; |
| import java.util.Objects; |
| import java.util.function.Supplier; |
| |
| public final class ObjectsMethods { |
| |
| public static <T> int compare(T a, T b, Comparator<? super T> c) { |
| return a == b ? 0 : c.compare(a, b); |
| } |
| |
| public static boolean deepEquals(Object a, Object b) { |
| if (a == b) return true; |
| if (a == null) return false; |
| if (a instanceof boolean[]) { |
| return b instanceof boolean[] && Arrays.equals((boolean[]) a, (boolean[]) b); |
| } |
| if (a instanceof byte[]) { |
| return b instanceof byte[] && Arrays.equals((byte[]) a, (byte[]) b); |
| } |
| if (a instanceof char[]) { |
| return b instanceof char[] && Arrays.equals((char[]) a, (char[]) b); |
| } |
| if (a instanceof double[]) { |
| return b instanceof double[] && Arrays.equals((double[]) a, (double[]) b); |
| } |
| if (a instanceof float[]) { |
| return b instanceof float[] && Arrays.equals((float[]) a, (float[]) b); |
| } |
| if (a instanceof int[]) { |
| return b instanceof int[] && Arrays.equals((int[]) a, (int[]) b); |
| } |
| if (a instanceof long[]) { |
| return b instanceof long[] && Arrays.equals((long[]) a, (long[]) b); |
| } |
| if (a instanceof short[]) { |
| return b instanceof short[] && Arrays.equals((short[]) a, (short[]) b); |
| } |
| if (a instanceof Object[]) { |
| return b instanceof Object[] && Arrays.deepEquals((Object[]) a, (Object[]) b); |
| } |
| return a.equals(b); |
| } |
| |
| public static boolean equals(Object a, Object b) { |
| return a == b || (a != null && a.equals(b)); |
| } |
| |
| public static int hashCode(Object o) { |
| return o == null ? 0 : o.hashCode(); |
| } |
| |
| public static boolean isNull(Object o) { |
| return o == null; |
| } |
| |
| public static boolean nonNull(Object o) { |
| return o != null; |
| } |
| |
| public static <T> T requireNonNullMessage(T obj, String message) { |
| if (obj == null) { |
| throw new NullPointerException(message); |
| } |
| return obj; |
| } |
| |
| public static <T> T requireNonNullElse(T obj, T defaultObj) { |
| if (obj != null) return obj; |
| return Objects.requireNonNull(defaultObj, "defaultObj"); |
| } |
| |
| public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier) { |
| if (obj != null) return obj; |
| T defaultObj = Objects.requireNonNull(supplier, "supplier").get(); |
| return Objects.requireNonNull(defaultObj, "supplier.get()"); |
| } |
| |
| public static String toString(Object o) { |
| return Objects.toString(o, "null"); |
| } |
| |
| public static String toStringDefault(Object o, String nullDefault) { |
| return o == null ? nullDefault : o.toString(); |
| } |
| |
| public static int checkIndex(int index, int length) { |
| if (index < 0 || index >= length) { |
| throw new IndexOutOfBoundsException("Index " + index + " out of bounds for length " + length); |
| } |
| return index; |
| } |
| |
| public static int checkFromToIndex(int fromIndex, int toIndex, int length) { |
| if (fromIndex < 0 || fromIndex > toIndex || toIndex > length) { |
| throw new IndexOutOfBoundsException( |
| "Range [" + fromIndex + ", " + toIndex + ") out of bounds for length " + length); |
| } |
| return fromIndex; |
| } |
| |
| public static int checkFromIndexSize(int fromIndex, int size, int length) { |
| if (fromIndex < 0 || size < 0 || length < 0 || fromIndex > length - size) { |
| throw new IndexOutOfBoundsException( |
| "Range [" |
| + fromIndex |
| + ", " |
| + fromIndex |
| + " + " |
| + size |
| + ") out of bounds for length " |
| + length); |
| } |
| return fromIndex; |
| } |
| } |