source: release-kits/lirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Op.java_@ 14982

Last change on this file since 14982 was 14982, checked in by oranfry, 16 years ago

initial import of LiRK3

File size: 5.6 KB
Line 
1/*
2* The Apache Software License, Version 1.1
3*
4* Copyright (c) 2001-2002 The Apache Software Foundation. All rights
5* reserved.
6*
7* Redistribution and use in source and binary forms, with or without
8* modification, are permitted provided that the following conditions
9* are met:
10*
11* 1. Redistributions of source code must retain the above copyright
12* notice, this list of conditions and the following disclaimer.
13*
14* 2. Redistributions in binary form must reproduce the above copyright
15* notice, this list of conditions and the following disclaimer in
16* the documentation and/or other materials provided with the
17* distribution.
18*
19* 3. The end-user documentation included with the redistribution, if
20* any, must include the following acknowlegement:
21* "This product includes software developed by the
22* Apache Software Foundation (http://www.apache.org/)."
23* Alternately, this acknowlegement may appear in the software itself,
24* if and wherever such third-party acknowlegements normally appear.
25*
26* 4. The names "The Jakarta Project", "Ant", and "Apache Software
27* Foundation" must not be used to endorse or promote products derived
28* from this software without prior written permission. For written
29* permission, please contact [email protected].
30*
31* 5. Products derived from this software may not be called "Apache"
32* nor may "Apache" appear in their names without prior written
33* permission of the Apache Group.
34*
35* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46* SUCH DAMAGE.
47* ====================================================================
48*
49* This software consists of voluntary contributions made by many
50* individuals on behalf of the Apache Software Foundation. For more
51* information on the Apache Software Foundation, please see
52* <http://www.apache.org/>.
53*/
54package ise.antelope.tasks;
55
56import org.apache.tools.ant.BuildException;
57import java.util.Vector;
58import java.util.Enumeration;
59
60/**
61 * Represents a mathematical operation.
62 * @author Dale Anson, [email protected]
63 */
64public class Op {
65 // datatype for the result of this operation
66 private String datatype = null;
67
68 // storage for the numbers to execute the operation on
69 Vector nums = new Vector();
70
71 // storage for nested Ops
72 Vector ops = new Vector();
73
74 // storage for operation
75 String operation = null;
76
77 // should the StrictMath library be used?
78 private boolean _strict = false;
79
80 /**
81 * Set the operation.
82 */
83 public void setOp( String op ) {
84 if (op.equals("+"))
85 operation = "add";
86 else if (op.equals("-"))
87 operation = "subtract";
88 else if (op.equals("*"))
89 operation = "multiply";
90 else if (op.equals("/"))
91 operation = "divide";
92 else if (op.equals("%"))
93 operation = "mod";
94 else
95 operation = op;
96 }
97
98 /**
99 * Add a number to this operation. An operation can hold any number of
100 * numbers to support formulas like 5 + 4 + 3 + 2 + 1.
101 * @param num a number to use in this operation
102 */
103 public void addNum( Num num ) {
104 nums.addElement( num );
105 }
106
107 /**
108 * Sets the datatype of this calculation. Allowed values are
109 * "int", "long", "float", or "double".
110 */
111 public void setDatatype( String p ) {
112 if ( p.equals( "int" ) ||
113 p.equals( "long" ) ||
114 p.equals( "float" ) ||
115 p.equals( "double" ) )
116 datatype = p;
117 else
118 throw new BuildException( "Invalid datatype: " + p +
119 ". Must be one of int, long, float, or double." );
120 }
121
122 /**
123 * Add a nested operation.
124 * @param the operation to add.
125 */
126 public void addConfiguredOp( Op op ) {
127 if ( datatype != null )
128 op.setDatatype( datatype );
129 ops.addElement( op );
130 }
131
132 /**
133 * Use the StrictMath library.
134 */
135 public void setStrict( boolean b ) {
136 _strict = b;
137 }
138
139 /**
140 * Perform this operation.
141 * @return the value resulting from the calculation as a Num.
142 */
143 public Num calculate() {
144 if ( operation == null )
145 throw new BuildException( "Operation not specified." );
146
147 // calculate nested Ops
148 Enumeration en = ops.elements();
149 while ( en.hasMoreElements() ) {
150 Op op = ( Op ) en.nextElement();
151 if ( datatype != null )
152 op.setDatatype( datatype );
153 nums.addElement( op.calculate() );
154 }
155
156 // make an array of operands
157 String[] operands = new String[ nums.size() ];
158 en = nums.elements();
159 int i = 0;
160 while ( en.hasMoreElements() ) {
161 Num num = (Num)en.nextElement();
162 if (datatype != null)
163 num.setDatatype(datatype);
164 operands[ i++ ] = num.toString();
165 }
166
167 Math math = new Math(_strict);
168
169 Number number = math.calculate( operation, datatype, operands );
170 Num num = new Num();
171 num.setValue(number.toString());
172 num.setDatatype(datatype);
173 return num;
174
175 }
176}
177
178
Note: See TracBrowser for help on using the repository browser.