001package conexp.fx.core.collections;
002
003/*
004 * #%L
005 * Concept Explorer FX
006 * %%
007 * Copyright (C) 2010 - 2023 Francesco Kriegel
008 * %%
009 * This program is free software: you can redistribute it and/or modify
010 * it under the terms of the GNU General Public License as
011 * published by the Free Software Foundation, either version 3 of the
012 * License, or (at your option) any later version.
013 * 
014 * This program is distributed in the hope that it will be useful,
015 * but WITHOUT ANY WARRANTY; without even the implied warranty of
016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
017 * GNU General Public License for more details.
018 * 
019 * You should have received a copy of the GNU General Public
020 * License along with this program.  If not, see
021 * <http://www.gnu.org/licenses/gpl-3.0.html>.
022 * #L%
023 */
024
025public class Pair<X, Y> {
026
027  public static final <X, Y> Pair<X, Y> of(final X x, final Y y) {
028    return new Pair<X, Y>(x, y);
029  }
030
031  protected X x;
032  protected Y y;
033
034  public Pair(final X x, final Y y) {
035    super();
036    this.x = x;
037    this.y = y;
038  }
039
040  public final X x() {
041    return x;
042  }
043
044  public final Y y() {
045    return y;
046  }
047
048  public final X first() {
049    return x;
050  }
051
052  public final Y second() {
053    return y;
054  }
055
056  @Override
057  public boolean equals(final Object object) {
058    if (object == null)
059      return false;
060    if (!(object instanceof Pair))
061      return false;
062    final Pair<?, ?> other = (Pair<?, ?>) object;
063    final boolean equalsX =
064        (other.x == null && this.x == null) || (other.x != null && this.x != null && other.x.equals(this.x));
065    if (!equalsX)
066      return false;
067    final boolean equalsY =
068        (other.y == null && this.y == null) || (other.y != null && this.y != null && other.y.equals(this.y));
069    return equalsY;
070  }
071
072  @Override
073  public int hashCode() {
074    if (x == null && y == null)
075      return 0;
076    if (x == null)
077      return 1 + 3 * y.hashCode();
078    if (y == null)
079      return 1 + 2 * x.hashCode();
080    return 1 + 2 * x.hashCode() + 3 * y.hashCode();
081  }
082
083  @Override
084  public String toString() {
085    return "(" + x + ", " + y + ")";
086  }
087}