10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file. 40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochpackage org.chromium.mojo.system; 60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch/** 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * A pair of object. 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * @param <F> Type of the first element. 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * @param <S> Type of the second element. 130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch */ 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochpublic class Pair<F, S> { 150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public final F first; 170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public final S second; 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch /** 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * Dedicated constructor. 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * @param first the first element of the pair. 230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * @param second the second element of the pair. 240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch */ 250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public Pair(F first, S second) { 260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch this.first = first; 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch this.second = second; 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch /** 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * equals() that handles null values. 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu */ 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private boolean equals(Object o1, Object o2) { 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return o1 == null ? o2 == null : o1.equals(o2); 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu /** 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * @see Object#equals(Object) 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch */ 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch @Override 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public boolean equals(Object o) { 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!(o instanceof Pair)) { 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Pair<?, ?> p = (Pair<?, ?>) o; 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return equals(first, p.first) && equals(second, p.second); 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch /** 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * @see Object#hashCode() 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch */ 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch @Override 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public int hashCode() { 540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return (first == null ? 0 : first.hashCode()) ^ (second == null ? 0 : second.hashCode()); 550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch /** 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * Helper method for creating a pair. 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * @param a the first element of the pair. 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * @param b the second element of the pair. 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * @return the pair containing a and b. 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch */ 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public static <A, B> Pair<A, B> create(A a, B b) { 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return new Pair<A, B>(a, b); 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 68