10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file.
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochpackage org.chromium.mojo.system;
60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch/**
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * A pair of object.
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch *
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * @param <F> Type of the first element.
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * @param <S> Type of the second element.
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch */
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochpublic class Pair<F, S> {
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    public final F first;
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    public final S second;
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    /**
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     * Dedicated constructor.
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     *
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     * @param first the first element of the pair.
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     * @param second the second element of the pair.
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     */
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    public Pair(F first, S second) {
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        this.first = first;
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        this.second = second;
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    /**
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu     * equals() that handles null values.
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu     */
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    private boolean equals(Object o1, Object o2) {
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        return o1 == null ? o2 == null : o1.equals(o2);
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    /**
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     * @see Object#equals(Object)
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     */
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    @Override
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    public boolean equals(Object o) {
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        if (!(o instanceof Pair)) {
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            return false;
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        }
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        Pair<?, ?> p = (Pair<?, ?>) o;
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        return equals(first, p.first) && equals(second, p.second);
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    /**
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     * @see Object#hashCode()
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     */
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    @Override
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    public int hashCode() {
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        return (first == null ? 0 : first.hashCode()) ^ (second == null ? 0 : second.hashCode());
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    /**
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     * Helper method for creating a pair.
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     *
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     * @param a the first element of the pair.
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     * @param b the second element of the pair.
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     * @return the pair containing a and b.
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch     */
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    public static <A, B> Pair<A, B> create(A a, B b) {
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        return new Pair<A, B>(a, b);
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
68