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