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