/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2009 Sun Microsystems, Inc. */ package org.opends.sdk; /** * The result of a tri-state logical expression. Condition results are * used to represent the result of a conditional evaluation that can * yield three possible values: {@code FALSE} (i.e. "no"), {@code TRUE} * (i.e. "yes"), or {@code UNDEFINED} (i.e. "maybe"). A result of * {@code UNDEFINED} indicates that further investigation may be * required. */ public enum ConditionResult { /** * Indicates that the condition evaluated to {@code false}. */ FALSE("false"), /** * Indicates that the condition could not be evaluated and its result * is undefined. */ UNDEFINED("undefined"), /** * Indicates that the condition evaluated to {@code true}. */ TRUE("true"); // Boolean -> ConditionResult map. private static final boolean[] booleanMap = { false, false, true }; // AND truth table. private static final ConditionResult[][] logicalAND = { { FALSE, FALSE, FALSE }, { FALSE, UNDEFINED, UNDEFINED }, { FALSE, UNDEFINED, TRUE }, }; // NOT truth table. private static final ConditionResult[] logicalNOT = { TRUE, UNDEFINED, FALSE }; // OR truth table. private static final ConditionResult[][] logicalOR = { { FALSE, UNDEFINED, TRUE }, { UNDEFINED, UNDEFINED, TRUE }, { TRUE, TRUE, TRUE }, }; /** * Returns the logical AND of zero condition results, which is always * {@code TRUE}. * * @return The logical OR of zero condition results, which is always * {@code TRUE}. */ public static ConditionResult and() { return TRUE; } /** * Returns the logical AND of the provided condition result, which is * always {@code r}. * * @param r * The condition result. * @return The logical AND of the provided condition result, which is * always {@code r}. */ public static ConditionResult and(ConditionResult r) { return r; } /** * Returns the logical AND of the provided condition results, which is * {@code TRUE} if all of the provided condition results are {@code * TRUE}, {@code FALSE} if at least one of them is {@code FALSE}, and * {@code UNDEFINED} otherwise. Note that {@code TRUE} is returned if * the provided list of results is empty. * * @param results * The condition results to be compared. * @return The logical AND of the provided condition results. */ public static ConditionResult and(ConditionResult... results) { ConditionResult finalResult = TRUE; for (ConditionResult result : results) { finalResult = and(finalResult, result); if (finalResult == FALSE) break; } return finalResult; } /** * Returns the logical AND of the provided condition results, which is * {@code TRUE} if both of the provided condition results are {@code * TRUE}, {@code FALSE} if at least one of them is {@code FALSE} , and * {@code UNDEFINED} otherwise. * * @param r1 * The first condition result to be compared. * @param r2 * The second condition result to be compared. * @return The logical AND of the provided condition results. */ public static ConditionResult and(ConditionResult r1, ConditionResult r2) { return logicalAND[r1.ordinal()][r2.ordinal()]; } /** * Returns the logical NOT of the provided condition result, which is * {@code TRUE} if the provided condition result is {@code FALSE}, * {@code TRUE} if it is {@code FALSE}, and {@code UNDEFINED} * otherwise. * * @param r * The condition result to invert. * @return The logical NOT of the provided condition result. */ public static ConditionResult not(ConditionResult r) { return logicalNOT[r.ordinal()]; } /** * Returns the logical OR of zero condition results, which is always * {@code FALSE}. * * @return The logical OR of zero condition results, which is always * {@code FALSE}. */ public static ConditionResult or() { return FALSE; } /** * Returns the logical OR of the provided condition result, which is * always {@code r}. * * @param r * The condition result. * @return The logical OR of the provided condition result, which is * always {@code r}. */ public static ConditionResult or(ConditionResult r) { return r; } /** * Returns the logical OR of the provided condition results, which is * {@code FALSE} if all of the provided condition results are {@code * FALSE}, {@code TRUE} if at least one of them is {@code TRUE}, and * {@code UNDEFINED} otherwise. Note that {@code FALSE} is returned if * the provided list of results is empty. * * @param results * The condition results to be compared. * @return The logical OR of the provided condition results. */ public static ConditionResult or(ConditionResult... results) { ConditionResult finalResult = FALSE; for (ConditionResult result : results) { finalResult = and(finalResult, result); if (finalResult == TRUE) break; } return finalResult; } /** * Returns the logical OR of the provided condition results, which is * {@code FALSE} if both of the provided condition results are {@code * FALSE}, {@code TRUE} if at least one of them is {@code TRUE} , and * {@code UNDEFINED} otherwise. * * @param r1 * The first condition result to be compared. * @param r2 * The second condition result to be compared. * @return The logical OR of the provided condition results. */ public static ConditionResult or(ConditionResult r1, ConditionResult r2) { return logicalOR[r1.ordinal()][r2.ordinal()]; } /** * Returns the condition result which is equivalent to the provided * boolean value. * * @param b * The boolean value. * @return {@code TRUE} if {@code b} was {@code true}, otherwise * {@code FALSE}. */ public static ConditionResult valueOf(boolean b) { return b ? TRUE : FALSE; } // The human-readable name for this result. private final String resultName; // Prevent instantiation. private ConditionResult(String resultName) { this.resultName = resultName; } /** * Converts this condition result to a boolean value. {@code FALSE} * and {@code UNDEFINED} are both converted to {@code false}, and * {@code TRUE} is converted to {@code true}. * * @return The boolean equivalent of this condition result. */ public boolean toBoolean() { return booleanMap[ordinal()]; } /** * Returns the string representation of this condition result. * * @return The string representation of his condition result. */ @Override public String toString() { return resultName; } }