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