103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta/* 203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Copyright (C) 2013 The Android Open Source Project 303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * 403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * you may not use this file except in compliance with the License. 603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * You may obtain a copy of the License at 703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * 803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * http://www.apache.org/licenses/LICENSE-2.0 903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * 1003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Unless required by applicable law or agreed to in writing, software 1103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * distributed under the License is distributed on an "AS IS" BASIS, 1203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * See the License for the specific language governing permissions and 1403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * limitations under the License. 1503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 1603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 1703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptapackage com.android.tools.layoutlib.java; 1803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 1903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptaimport java.util.Arrays; 2003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptaimport java.util.Comparator; 2103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 2203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta/** 2303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Defines the same class as the java.util.Objects which is added in Java 7. 2403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * This hack makes it possible to run the Android code which uses Java 7 features 2503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * (API 18 and beyond) to run on Java 6. 2603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * <p/> 2703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Extracted from API level 19, file: 2803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * platform/libcore/luni/src/main/java/java/util/Objects.java 2903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 3003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Guptapublic final class Objects { 3103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta private Objects() {} 3203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 3303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 3403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Returns 0 if {@code a == b}, or {@code c.compare(a, b)} otherwise. 3503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * That is, this makes {@code c} null-safe. 3603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 3703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public static <T> int compare(T a, T b, Comparator<? super T> c) { 3803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (a == b) { 3903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return 0; 4003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 4103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return c.compare(a, b); 4203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 4303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 4403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 4503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Returns true if both arguments are null, 4603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * the result of {@link Arrays#equals} if both arguments are primitive arrays, 4703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * the result of {@link Arrays#deepEquals} if both arguments are arrays of reference types, 4803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * and the result of {@link #equals} otherwise. 4903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 5003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public static boolean deepEquals(Object a, Object b) { 5103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (a == null || b == null) { 5203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return a == b; 5303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } else if (a instanceof Object[] && b instanceof Object[]) { 5403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return Arrays.deepEquals((Object[]) a, (Object[]) b); 5503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } else if (a instanceof boolean[] && b instanceof boolean[]) { 5603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return Arrays.equals((boolean[]) a, (boolean[]) b); 5703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } else if (a instanceof byte[] && b instanceof byte[]) { 5803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return Arrays.equals((byte[]) a, (byte[]) b); 5903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } else if (a instanceof char[] && b instanceof char[]) { 6003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return Arrays.equals((char[]) a, (char[]) b); 6103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } else if (a instanceof double[] && b instanceof double[]) { 6203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return Arrays.equals((double[]) a, (double[]) b); 6303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } else if (a instanceof float[] && b instanceof float[]) { 6403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return Arrays.equals((float[]) a, (float[]) b); 6503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } else if (a instanceof int[] && b instanceof int[]) { 6603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return Arrays.equals((int[]) a, (int[]) b); 6703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } else if (a instanceof long[] && b instanceof long[]) { 6803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return Arrays.equals((long[]) a, (long[]) b); 6903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } else if (a instanceof short[] && b instanceof short[]) { 7003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return Arrays.equals((short[]) a, (short[]) b); 7103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 7203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return a.equals(b); 7303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 7403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 7503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 7603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Null-safe equivalent of {@code a.equals(b)}. 7703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 7803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public static boolean equals(Object a, Object b) { 7903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return (a == null) ? (b == null) : a.equals(b); 8003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 8103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 8203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 8303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Convenience wrapper for {@link Arrays#hashCode}, adding varargs. 8403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * This can be used to compute a hash code for an object's fields as follows: 8503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * {@code Objects.hash(a, b, c)}. 8603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 8703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public static int hash(Object... values) { 8803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return Arrays.hashCode(values); 8903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 9003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 9103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 9203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Returns 0 for null or {@code o.hashCode()}. 9303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 9403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public static int hashCode(Object o) { 9503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return (o == null) ? 0 : o.hashCode(); 9603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 9703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 9803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 9903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Returns {@code o} if non-null, or throws {@code NullPointerException}. 10003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 10103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public static <T> T requireNonNull(T o) { 10203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (o == null) { 10303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta throw new NullPointerException(); 10403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 10503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return o; 10603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 10703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 10803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 10903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Returns {@code o} if non-null, or throws {@code NullPointerException} 11003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * with the given detail message. 11103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 11203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public static <T> T requireNonNull(T o, String message) { 11303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta if (o == null) { 11403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta throw new NullPointerException(message); 11503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 11603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return o; 11703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 11803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 11903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 12003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Returns "null" for null or {@code o.toString()}. 12103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 12203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public static String toString(Object o) { 12303a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return (o == null) ? "null" : o.toString(); 12403a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 12503a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta 12603a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta /** 12703a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta * Returns {@code nullString} for null or {@code o.toString()}. 12803a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta */ 12903a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta public static String toString(Object o, String nullString) { 13003a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta return (o == null) ? nullString : o.toString(); 13103a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta } 13203a057c1af9ca3f125c7924bf0b78da52223d8d3Deepanshu Gupta}