package org.andengine.util.adt.map;
import java.util.Arrays;
/**
 * (c) 2010 Nicolas Gramlich 
 * (c) 2011 Zynga Inc.
 * 
 * @author Nicolas Gramlich
 * @since 16:54:24 - 07.11.2010
 */
public class MultiKey<K> {
	// ===========================================================
	// Constants
	// ===========================================================
	// ===========================================================
	// Fields
	// ===========================================================
	private final K[] mKeys;
	private final int mCachedHashCode;
	// ===========================================================
	// Constructors
	// ===========================================================
	public MultiKey(final K... pKeys) {
		this.mKeys = pKeys;
		this.mCachedHashCode = MultiKey.hash(pKeys);
	}
	// ===========================================================
	// Getter & Setter
	// ===========================================================
	public K[] getKeys() {
		return this.mKeys;
	}
	// ===========================================================
	// Methods for/from SuperClass/Interfaces
	// ===========================================================
	@Override
	public boolean equals(final Object pOther) {
		if(pOther == this) {
			return true;
		}
		if(pOther instanceof MultiKey<?>) {
			final MultiKey<?> otherMultiKey = (MultiKey<?>) pOther;
			return Arrays.equals(this.mKeys, otherMultiKey.mKeys);
		}
		return false;
	}
	public static int hash(final Object ... pKeys) {
		int hashCode = 0;
		for(final Object key : pKeys) {
			if(key != null) {
				hashCode ^= key.hashCode();
			}
		}
		return hashCode;
	}
	@Override
	public int hashCode() {
		return this.mCachedHashCode;
	}
	@Override
	public String toString() {
		return "MultiKey" + Arrays.asList(this.mKeys).toString();
	}
	// ===========================================================
	// Methods
	// ===========================================================
	public K getKey(final int pIndex) {
		return this.mKeys[pIndex];
	}
	public int size() {
		return this.mKeys.length;
	}
	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}