samples/apifest1/day2/elementbasedsolution/src/org/netbeans/apifest/boolcircuit/Circuit.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:56:12 +0200
changeset 132 3bc4c54f4bcc
parent 59 02e05defc6a0
child 153 b5cbb797ec0a
permissions -rw-r--r--
Truncating all examples to 80 characters per line
     1 package org.netbeans.apifest.boolcircuit;
     2 
     3 // BEGIN: apifest.day2.elementbasedsolution.Circuit
     4 public final class Circuit {
     5     private Circuit() {
     6     }
     7     
     8     public static Element and(final Element e1, final Element e2) {
     9         return new Element() {
    10             public boolean result() {
    11                 return e1.result() && e2.result();
    12             }
    13             public double doubleResult() {
    14                 return e1.doubleResult() * e2.doubleResult();
    15             }
    16         };
    17     }
    18     public static Element or(final Element e1, final Element e2) {
    19         return new Element() {
    20             public boolean result() {
    21                 return e1.result() || e2.result();
    22             }
    23             public double doubleResult() {
    24                 return 1.0 - 
    25                     (1.0 - e1.doubleResult()) * (1.0 - e2.doubleResult());
    26             }
    27         };
    28     }
    29 
    30     public static Element not(final Element e1) {
    31         return new Element() {
    32             public boolean result() {
    33                 return !e1.result();
    34             }
    35             public double doubleResult() {
    36                 return 1 - e1.doubleResult();
    37             }
    38         };
    39     }
    40     
    41     public static Element operation(
    42         final Operation op, final Element... elements
    43     ) {
    44         return new Element() {
    45             public boolean result() {
    46                 return doubleResult() >= 1.0;
    47             }
    48             public double doubleResult() {
    49                 double[] arr = new double[elements.length];
    50                 for (int i = 0; i < arr.length; i++) {
    51                     arr[i] = elements[i].doubleResult();
    52                 }
    53                 return op.computeResult(arr);
    54             }
    55         };
    56         
    57     }
    58     
    59     public static Variable var() {
    60         return new Variable();
    61     }
    62     
    63     public static abstract class Element {
    64         private Element() {
    65         }
    66         
    67         public abstract boolean result();
    68         public abstract double doubleResult();
    69     }
    70     
    71     public static final class Variable extends Element {
    72         private Boolean booleanValue;
    73         private Double doubleValue;
    74         
    75         public void assignValue(boolean b) {
    76             booleanValue = b;
    77         }
    78         public void assignValue(double d) {
    79             if (d < 0 || d > 1) {
    80                 throw new IllegalArgumentException();
    81             }
    82             doubleValue = d;
    83         }
    84 
    85         public boolean result() {
    86             return booleanValue != null ? 
    87                 booleanValue : doubleValue >= 1.0;
    88         }
    89 
    90         public double doubleResult() {
    91             return doubleValue != null ? 
    92                 doubleValue : (booleanValue ? 1.0 : 0.0);
    93         }
    94 
    95     }
    96     
    97     public static interface Operation {
    98         public double computeResult(double... values);
    99     }
   100 }
   101 // END: apifest.day2.elementbasedsolution.Circuit