samples/apifest1/day2/elementbasedsolution/src/org/netbeans/apifest/boolcircuit/Circuit.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:58:08 +0200
changeset 153 b5cbb797ec0a
parent 132 3bc4c54f4bcc
child 154 0fd5e9c500b9
permissions -rw-r--r--
up to line 2000
     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 // BEGIN: apifest.day2.elementbasedsolution.Circuit
    23 public final class Circuit {
    24     private Circuit() {
    25     }
    26     
    27     public static Element and(final Element e1, final Element e2) {
    28         return new Element() {
    29             public boolean result() {
    30                 return e1.result() && e2.result();
    31             }
    32             public double doubleResult() {
    33                 return e1.doubleResult() * e2.doubleResult();
    34             }
    35         };
    36     }
    37     public static Element or(final Element e1, final Element e2) {
    38         return new Element() {
    39             public boolean result() {
    40                 return e1.result() || e2.result();
    41             }
    42             public double doubleResult() {
    43                 return 1.0 - (1.0 - e1.doubleResult()) * (1.0 - e2.doubleResult());
    44             }
    45         };
    46     }
    47 
    48     public static Element not(final Element e1) {
    49         return new Element() {
    50             public boolean result() {
    51                 return !e1.result();
    52             }
    53             public double doubleResult() {
    54                 return 1 - e1.doubleResult();
    55             }
    56         };
    57     }
    58     
    59     public static Element operation(final Operation op, final Element... elements) {
    60         return new Element() {
    61             public boolean result() {
    62                 return doubleResult() >= 1.0;
    63             }
    64             public double doubleResult() {
    65                 double[] arr = new double[elements.length];
    66                 for (int i = 0; i < arr.length; i++) {
    67                     arr[i] = elements[i].doubleResult();
    68                 }
    69                 return op.computeResult(arr);
    70             }
    71         };
    72         
    73     }
    74     
    75     public static Variable var() {
    76         return new Variable();
    77     }
    78     
    79     public static abstract class Element {
    80         private Element() {
    81         }
    82         
    83         public abstract boolean result();
    84         public abstract double doubleResult();
    85     }
    86     
    87     public static final class Variable extends Element {
    88         private Boolean booleanValue;
    89         private Double doubleValue;
    90         
    91         public void assignValue(boolean b) {
    92             booleanValue = b;
    93         }
    94         public void assignValue(double d) {
    95             if (d < 0 || d > 1) {
    96                 throw new IllegalArgumentException();
    97             }
    98             doubleValue = d;
    99         }
   100 
   101         public boolean result() {
   102             return booleanValue != null ? booleanValue : doubleValue >= 1.0;
   103         }
   104 
   105         public double doubleResult() {
   106             return doubleValue != null ? doubleValue : (booleanValue ? 1.0 : 0.0);
   107         }
   108 
   109     }
   110     
   111     public static interface Operation {
   112         public double computeResult(double... values);
   113     }
   114 }
   115 // END: apifest.day2.elementbasedsolution.Circuit