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