/******************************************************************************* * Copyright (c) 2012, Directors of the Tyndale STEP Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * Neither the name of the Tyndale House, Cambridge (www.TyndaleHouse.com) * nor the names of its contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ package com.tyndalehouse.step.core.xsl.impl; import static java.lang.String.format; /** * A Strong Morph Map takes two keys, and gives one word back. The following DualKey relies on hashCode. The * hash function relies on toString so T and S need to have fast toString(). * * @param <T> the first part of the key * @param <S> the second part of the key * @author chrisburrell * */ public class DualKey<T, S> { private final T t; private final S s; /** * creates a composite key * * @param t the first part of the key * @param s the second part of the key */ public DualKey(final T t, final S s) { this.t = t; this.s = s; } @Override public boolean equals(final Object obj) { if (obj == this) { return true; } if (!(obj instanceof DualKey)) { return false; } final DualKey<?, ?> k = (DualKey<?, ?>) obj; return this.t.equals(k.t) && this.s.equals(k.s); } @Override public int hashCode() { // we need to return the same hashcode based on s and t if (this.s == null && this.t == null) { return super.hashCode(); } if (this.s == null) { return this.t.hashCode(); } if (this.t == null) { return this.s.hashCode(); } return this.t.toString().concat(this.s.toString()).hashCode(); } @Override public String toString() { return format("%s-%s", this.t, this.s); } }