1d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana/* 2d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * Copyright (C) 2009 The Android Open Source Project 3d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * 4d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * Licensed under the Apache License, Version 2.0 (the "License"); 5d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * you may not use this file except in compliance with the License. 6d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * You may obtain a copy of the License at 7d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * 8d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * http://www.apache.org/licenses/LICENSE-2.0 9d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * 10d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * Unless required by applicable law or agreed to in writing, software 11d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * distributed under the License is distributed on an "AS IS" BASIS, 12d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * See the License for the specific language governing permissions and 14d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * limitations under the License. 15d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana */ 16d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana 17d4a1d2e14297a3387fdb5761090961e714370492Fred Quintanapackage android.util; 18d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana 19162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkeyimport libcore.util.Objects; 20162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey 21d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana/** 22d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * Container to ease passing around a tuple of two objects. This object provides a sensible 23d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * implementation of equals(), returning true if equals() is true on each of the contained 24d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * objects. 25d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana */ 26d4a1d2e14297a3387fdb5761090961e714370492Fred Quintanapublic class Pair<F, S> { 27d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana public final F first; 28d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana public final S second; 29d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana 30d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana /** 31162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey * Constructor for a Pair. 32162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey * 33d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * @param first the first object in the Pair 34d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * @param second the second object in the pair 35d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana */ 36d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana public Pair(F first, S second) { 37d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana this.first = first; 38d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana this.second = second; 39d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana } 40d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana 41d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana /** 42162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey * Checks the two objects for equality by delegating to their respective 43162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey * {@link Object#equals(Object)} methods. 44162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey * 45162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey * @param o the {@link Pair} to which this one is to be checked for equality 46162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey * @return true if the underlying objects of the Pair are both considered 47162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey * equal 48d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana */ 49162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey @Override 50d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana public boolean equals(Object o) { 51162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey if (!(o instanceof Pair)) { 52d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana return false; 53d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana } 54162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey Pair<?, ?> p = (Pair<?, ?>) o; 55162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey return Objects.equal(p.first, first) && Objects.equal(p.second, second); 56d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana } 57d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana 58d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana /** 59d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * Compute a hash code using the hash codes of the underlying objects 60162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey * 61d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * @return a hashcode of the Pair 62d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana */ 63162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey @Override 64d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana public int hashCode() { 65162fabbcf81157fddab1c38de09bdabaff8c068aJeff Sharkey return (first == null ? 0 : first.hashCode()) ^ (second == null ? 0 : second.hashCode()); 66d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana } 67d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana 68d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana /** 69d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * Convenience method for creating an appropriately typed pair. 70d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * @param a the first object in the Pair 71d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * @param b the second object in the pair 72d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * @return a Pair that is templatized with the types of a and b 73d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana */ 74d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana public static <A, B> Pair <A, B> create(A a, B b) { 75d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana return new Pair<A, B>(a, b); 76d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana } 77d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana} 78