/*******************************************************************************
 * Copyright (c) 2009 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0, which accompanies this distribution
 * and is available at http://www.eclipse.org/legal/epl-v10.html.
 * 
 * Contributors:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.common.utility.internal;

/**
 * Assorted "Capital-B Boolean" operations.
 */
 // commented code is just playing around with building *everything* from NAND
public final class BooleanTools {

	/**
	 * Return the NOT of the specified Boolean.
	 * Boolean#not()
	 */
	public static Boolean not(Boolean b) {
		return Boolean.valueOf( ! b.booleanValue());
//		return nand(b, b);
	}

	/**
	 * Return the AND of the specified Booleans.
	 * Boolean#and(Boolean)
	 */
	public static Boolean and(Boolean b1, Boolean b2) {
		return Boolean.valueOf(b1.booleanValue() && b2.booleanValue());
//		Boolean nand = nand(b1, b2);
//		return nand(nand, nand);
	}

	/**
	 * Return the OR of the specified Booleans.
	 * Boolean#or(Boolean)
	 */
	public static Boolean or(Boolean b1, Boolean b2) {
		return Boolean.valueOf(b1.booleanValue() || b2.booleanValue());
//		Boolean nand = nand(b1, b2);
//		Boolean xor = nand(nand(b1, nand), nand(b2, nand));
//		Boolean and = nand(nand, nand);
//		Boolean nand2 = nand(xor, and);
//		return nand(nand(xor, nand2), nand(and, nand2));
	}

	/**
	 * Return the XOR of the specified Booleans.
	 * Boolean#xor(Boolean)
	 */
	public static Boolean xor(Boolean b1, Boolean b2) {
		return and(or(b1, b2), nand(b1, b2));
//		Boolean nand = nand(b1, b2);
//		return nand(nand(b1, nand), nand(b2, nand));
	}

	/**
	 * Return the NAND of the specified Booleans.
	 * Boolean#nand(Boolean)
	 */
	public static Boolean nand(Boolean b1, Boolean b2) {
		return not(and(b1, b2));
//		return Boolean.valueOf( ! (b1.booleanValue() && b2.booleanValue()));
	}

	/**
	 * Return the NOR of the specified Booleans.
	 * Boolean#nor(Boolean)
	 */
	public static Boolean nor(Boolean b1, Boolean b2) {
		return not(or(b1, b2));
//		Boolean nand = nand(b1, b2);
//		Boolean xor = nand(nand(b1, nand), nand(b2, nand));
//		Boolean and = nand(nand, nand);
//		Boolean nand2 = nand(xor, and);
//		Boolean nand3 = nand(nand(xor, nand2), nand(and, nand2));
//		return nand(nand3, nand3);
	}

	/**
	 * Return the XNOR of the specified Booleans.
	 * Boolean#xnor(Boolean)
	 */
	public static Boolean xnor(Boolean b1, Boolean b2) {
		return not(xor(b1, b2));
//		Boolean nand = nand(b1, b2);
//		Boolean xor = nand(nand(b1, nand), nand(b2, nand));
//		return nand(xor, xor);
	}


	// ********** constructor **********

	/**
	 * Suppress default constructor, ensuring non-instantiability.
	 */
	private BooleanTools() {
		super();
		throw new UnsupportedOperationException();
	}

}
