samples/apifest1/day2/elementbasedsolution/src/org/netbeans/apifest/boolcircuit/Circuit.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:52:45 +0200
changeset 52 4257f4cf226b
child 59 02e05defc6a0
permissions -rw-r--r--
Adding samples from API fest to the repository, including pieces of their code in the document, not just links
     1 /*
     2  * The contents of this file are subject to the terms of the Common Development
     3  * and Distribution License (the License). You may not use this file except in
     4  * compliance with the License.
     5  *
     6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
     7  * or http://www.netbeans.org/cddl.txt.
     8  *
     9  * When distributing Covered Code, include this CDDL Header Notice in each file
    10  * and include the License file at http://www.netbeans.org/cddl.txt.
    11  * If applicable, add the following below the CDDL Header, with the fields
    12  * enclosed by brackets [] replaced by your own identifying information:
    13  * "Portions Copyrighted [year] [name of copyright owner]"
    14  *
    15  * The Original Software is NetBeans. The Initial Developer of the Original
    16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
    17  * Microsystems, Inc. All Rights Reserved.
    18  */
    19 
    20 package org.netbeans.apifest.boolcircuit;
    21 
    22 /**
    23  */
    24 public final class Circuit {
    25     private Circuit() {
    26     }
    27     
    28     public static Element and(final Element e1, final Element e2) {
    29         return new Element() {
    30             public boolean result() {
    31                 return e1.result() && e2.result();
    32             }
    33             public double doubleResult() {
    34                 return e1.doubleResult() * e2.doubleResult();
    35             }
    36         };
    37     }
    38     public static Element or(final Element e1, final Element e2) {
    39         return new Element() {
    40             public boolean result() {
    41                 return e1.result() || e2.result();
    42             }
    43             public double doubleResult() {
    44                 return 1.0 - (1.0 - e1.doubleResult()) * (1.0 - e2.doubleResult());
    45             }
    46         };
    47     }
    48 
    49     public static Element not(final Element e1) {
    50         return new Element() {
    51             public boolean result() {
    52                 return !e1.result();
    53             }
    54             public double doubleResult() {
    55                 return 1 - e1.doubleResult();
    56             }
    57         };
    58     }
    59     
    60     public static Element operation(final Operation op, final Element... elements) {
    61         return new Element() {
    62             public boolean result() {
    63                 return doubleResult() >= 1.0;
    64             }
    65             public double doubleResult() {
    66                 double[] arr = new double[elements.length];
    67                 for (int i = 0; i < arr.length; i++) {
    68                     arr[i] = elements[i].doubleResult();
    69                 }
    70                 return op.computeResult(arr);
    71             }
    72         };
    73         
    74     }
    75     
    76     public static Variable var() {
    77         return new Variable();
    78     }
    79     
    80     public static abstract class Element {
    81         private Element() {
    82         }
    83         
    84         public abstract boolean result();
    85         public abstract double doubleResult();
    86     }
    87     
    88     public static final class Variable extends Element {
    89         private Boolean booleanValue;
    90         private Double doubleValue;
    91         
    92         public void assignValue(boolean b) {
    93             booleanValue = b;
    94         }
    95         public void assignValue(double d) {
    96             if (d < 0 || d > 1) {
    97                 throw new IllegalArgumentException();
    98             }
    99             doubleValue = d;
   100         }
   101 
   102         public boolean result() {
   103             return booleanValue != null ? booleanValue : doubleValue >= 1.0;
   104         }
   105 
   106         public double doubleResult() {
   107             return doubleValue != null ? doubleValue : (booleanValue ? 1.0 : 0.0);
   108         }
   109 
   110     }
   111     
   112     public static interface Operation {
   113         public double computeResult(double... values);
   114     }
   115 }