10fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi/* 20fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi * Copyright (C) 2014 The Android Open Source Project 30fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi * 40fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License"); 50fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi * you may not use this file except in compliance with the License. 60fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi * You may obtain a copy of the License at 70fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi * 80fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi * http://www.apache.org/licenses/LICENSE-2.0 90fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi * 100fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software 110fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS, 120fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi * See the License for the specific language governing permissions and 140fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi * limitations under the License. 150fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi */ 160fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi 170fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagipackage android.util; 180fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi 19b498d2cf84942bcb697928b0e6176c5a03d31dbcJean Chalardimport java.util.Objects; 200fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi 210fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagipublic class Pair<T1, T2> { 220fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi public final T1 mFirst; 230fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi public final T2 mSecond; 240fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi 250fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi public Pair(final T1 first, final T2 second) { 260fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi mFirst = first; 270fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi mSecond = second; 280fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi } 290fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi 300fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi @Override 310fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi public int hashCode() { 32b498d2cf84942bcb697928b0e6176c5a03d31dbcJean Chalard return (mFirst == null ? 0 : mFirst.hashCode()) 33b498d2cf84942bcb697928b0e6176c5a03d31dbcJean Chalard ^ (mSecond == null ? 0 : mSecond.hashCode()); 340fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi } 350fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi 360fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi @Override 370fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi public boolean equals(Object o) { 380fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi if (o == this) return true; 390fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi if (!(o instanceof Pair)) return false; 400fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi Pair<?, ?> p = (Pair<?, ?>)o; 41b498d2cf84942bcb697928b0e6176c5a03d31dbcJean Chalard return Objects.equals(mFirst, p.mFirst) && Objects.equals(mSecond, p.mSecond); 420fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi } 430fc93fe4455f24809f6c9baf0d3b936519779cfbKeisuke Kuroyanagi} 44