12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others. 22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License 3f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert/* 4f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert ******************************************************************************* 5f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * Copyright (C) 2014, International Business Machines Corporation and 6f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * others. All Rights Reserved. 7f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert ******************************************************************************* 8f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert */ 9f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubertpackage com.ibm.icu.impl; 10f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 11f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert/** 12f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * A pair of objects: first and second. 13f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * 14f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * @param <F> first object type 15f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * @param <S> second object type 16f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert */ 17f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubertpublic class Pair<F, S> { 18f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert public final F first; 19f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert public final S second; 20f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 21f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert protected Pair(F first, S second) { 22f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert this.first = first; 23f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert this.second = second; 24f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 25f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 26f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert /** 27f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * Creates a pair object 28f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * @param first must be non-null 29f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * @param second must be non-null 30f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * @return The pair object. 31f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert */ 32f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert public static <F, S> Pair<F, S> of(F first, S second) { 33f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert if (first == null || second == null) { 34f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert throw new IllegalArgumentException("Pair.of requires non null values."); 35f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 36f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert return new Pair<F, S>(first, second); 37f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 38f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 39f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert @Override 40f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert public boolean equals(Object other) { 41f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert if (other == this) { 42f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert return true; 43f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 44f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert if (!(other instanceof Pair)) { 45f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert return false; 46f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 47f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert Pair<?, ?> rhs = (Pair<?, ?>) other; 48f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert return first.equals(rhs.first) && second.equals(rhs.second); 49f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 50f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert 51f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert @Override 52f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert public int hashCode() { 53f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert return first.hashCode() * 37 + second.hashCode(); 54f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert } 55f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert} 56