1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.mojo.system;
6
7
8/**
9 * A pair of object.
10 *
11 * @param <F> Type of the first element.
12 * @param <S> Type of the second element.
13 */
14public class Pair<F, S> {
15
16    public final F first;
17    public final S second;
18
19    /**
20     * Dedicated constructor.
21     *
22     * @param first the first element of the pair.
23     * @param second the second element of the pair.
24     */
25    public Pair(F first, S second) {
26        this.first = first;
27        this.second = second;
28    }
29
30    /**
31     * equals() that handles null values.
32     */
33    private boolean equals(Object o1, Object o2) {
34        return o1 == null ? o2 == null : o1.equals(o2);
35    }
36
37    /**
38     * @see Object#equals(Object)
39     */
40    @Override
41    public boolean equals(Object o) {
42        if (!(o instanceof Pair)) {
43            return false;
44        }
45        Pair<?, ?> p = (Pair<?, ?>) o;
46        return equals(first, p.first) && equals(second, p.second);
47    }
48
49    /**
50     * @see Object#hashCode()
51     */
52    @Override
53    public int hashCode() {
54        return (first == null ? 0 : first.hashCode()) ^ (second == null ? 0 : second.hashCode());
55    }
56
57    /**
58     * Helper method for creating a pair.
59     *
60     * @param a the first element of the pair.
61     * @param b the second element of the pair.
62     * @return the pair containing a and b.
63     */
64    public static <A, B> Pair<A, B> create(A a, B b) {
65        return new Pair<A, B>(a, b);
66    }
67}
68