plugins/base1/se.lu.onk/trunk/QPackage/src/qpackage/calculator/Operator.java

Code
Comments
Other
Rev Date Author Line
66 09 Feb 06 enell 1 /*
66 09 Feb 06 enell 2  * Created on 26-May-2004
66 09 Feb 06 enell 3  * 
66 09 Feb 06 enell 4  * Operator.java is a part of WeightedMerge
66 09 Feb 06 enell 5  * 
66 09 Feb 06 enell 6  * Copyright (C) 2004 Johan Enell, Dept Oncology, Lund University
66 09 Feb 06 enell 7  * 
66 09 Feb 06 enell 8  * This program is free software; you can redistribute it and/or modify it under
66 09 Feb 06 enell 9  * the terms of the GNU General Public License as published by the Free Software
66 09 Feb 06 enell 10  * Foundation; either version 2 of the License, or (at your option) any later
66 09 Feb 06 enell 11  * version.
66 09 Feb 06 enell 12  * 
66 09 Feb 06 enell 13  * This program is distributed in the hope that it will be useful, but WITHOUT
66 09 Feb 06 enell 14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
66 09 Feb 06 enell 15  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
66 09 Feb 06 enell 16  * details.
66 09 Feb 06 enell 17  * 
66 09 Feb 06 enell 18  * You should have received a copy of the GNU General Public License along with
66 09 Feb 06 enell 19  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
66 09 Feb 06 enell 20  * Place - Suite 330, Boston, MA 02111-1307, USA.
66 09 Feb 06 enell 21  */
67 10 Feb 06 enell 22 package qpackage.calculator;
66 09 Feb 06 enell 23
66 09 Feb 06 enell 24 import java.util.HashSet;
66 09 Feb 06 enell 25
66 09 Feb 06 enell 26 /**
66 09 Feb 06 enell 27  * An Operator is a Token that calculates it's value using two Operands or other
66 09 Feb 06 enell 28  * Operators.
66 09 Feb 06 enell 29  * 
66 09 Feb 06 enell 30  * @author Johan Enell, johan.enell@onk.lu.se, Dept Oncology, Lund University,
66 09 Feb 06 enell 31  *         S-221 85 Lund, Sweden
66 09 Feb 06 enell 32  */
66 09 Feb 06 enell 33 public abstract class Operator extends Token
66 09 Feb 06 enell 34 {
66 09 Feb 06 enell 35
66 09 Feb 06 enell 36   /**
66 09 Feb 06 enell 37    * The first Token in this Operator.
66 09 Feb 06 enell 38    */
66 09 Feb 06 enell 39   protected Token tok1 = null;
66 09 Feb 06 enell 40
66 09 Feb 06 enell 41   /**
66 09 Feb 06 enell 42    * The second Token in this Operator.
66 09 Feb 06 enell 43    */
66 09 Feb 06 enell 44   protected Token tok2 = null;
66 09 Feb 06 enell 45
66 09 Feb 06 enell 46   /**
66 09 Feb 06 enell 47    * The character for this Operator.
66 09 Feb 06 enell 48    */
66 09 Feb 06 enell 49   protected String character;
66 09 Feb 06 enell 50
66 09 Feb 06 enell 51   /**
66 09 Feb 06 enell 52    * The order of this Operator. The Operator with the lowest order will be
66 09 Feb 06 enell 53    * valculated last in an equation.
66 09 Feb 06 enell 54    */
66 09 Feb 06 enell 55   protected int order;
66 09 Feb 06 enell 56
66 09 Feb 06 enell 57   /**
66 09 Feb 06 enell 58    * Construct a new empty Operator.
66 09 Feb 06 enell 59    */
66 09 Feb 06 enell 60   protected Operator()
66 09 Feb 06 enell 61   {
66 09 Feb 06 enell 62     super();
66 09 Feb 06 enell 63   }
66 09 Feb 06 enell 64
66 09 Feb 06 enell 65   /**
66 09 Feb 06 enell 66    * Constructs a new Operator with the Tokens tok1 and tok2. It sets the
66 09 Feb 06 enell 67    * character to <code>""</code> and the order to 0.
66 09 Feb 06 enell 68    * 
66 09 Feb 06 enell 69    * @param tok1
66 09 Feb 06 enell 70    *            the first Token.
66 09 Feb 06 enell 71    * @param tok2
66 09 Feb 06 enell 72    *            the second Token.
66 09 Feb 06 enell 73    */
66 09 Feb 06 enell 74   protected Operator(Token tok1, Token tok2)
66 09 Feb 06 enell 75   {
66 09 Feb 06 enell 76     this.tok1 = tok1;
66 09 Feb 06 enell 77     this.tok2 = tok2;
66 09 Feb 06 enell 78     this.character = "";
66 09 Feb 06 enell 79     this.order = 0;
66 09 Feb 06 enell 80   }
66 09 Feb 06 enell 81
66 09 Feb 06 enell 82   /**
66 09 Feb 06 enell 83    * Constructs a new Operator with the two Tokens as null and with order 0.
66 09 Feb 06 enell 84    * 
66 09 Feb 06 enell 85    * @param character
66 09 Feb 06 enell 86    *            the character of this Operator.
66 09 Feb 06 enell 87    */
66 09 Feb 06 enell 88   protected Operator(String character)
66 09 Feb 06 enell 89   {
66 09 Feb 06 enell 90     this.tok1 = null;
66 09 Feb 06 enell 91     this.tok2 = null;
66 09 Feb 06 enell 92     this.character = character;
66 09 Feb 06 enell 93     this.order = 0;
66 09 Feb 06 enell 94   }
66 09 Feb 06 enell 95
66 09 Feb 06 enell 96   /*
66 09 Feb 06 enell 97    * (non-Javadoc)
66 09 Feb 06 enell 98    * 
66 09 Feb 06 enell 99    * @see calc.Token#setVariable(calc.Variable, float)
66 09 Feb 06 enell 100    */
66 09 Feb 06 enell 101   @Override
66 09 Feb 06 enell 102   protected void setVariable(Variable variable, float value)
66 09 Feb 06 enell 103   {
66 09 Feb 06 enell 104     if (tok1 != null) tok1.setVariable(variable, value);
66 09 Feb 06 enell 105     if (tok2 != null) tok2.setVariable(variable, value);
66 09 Feb 06 enell 106   }
66 09 Feb 06 enell 107
66 09 Feb 06 enell 108   /**
66 09 Feb 06 enell 109    * Returns a string representation of this Operator. The string
66 09 Feb 06 enell 110    * representation consistis of the string representation of the first Token
66 09 Feb 06 enell 111    * followed by the character of the Token and finally the string
66 09 Feb 06 enell 112    * representation of the last Operator. If the order of this Operator is
66 09 Feb 06 enell 113    * greater than 3 it is encapsulated by parenthesis. If any of the Token is
66 09 Feb 06 enell 114    * null the string "null" is printed instead.
66 09 Feb 06 enell 115    * 
66 09 Feb 06 enell 116    * @return a string representation of this Operator.
66 09 Feb 06 enell 117    */
66 09 Feb 06 enell 118   @Override
66 09 Feb 06 enell 119   public String toString()
66 09 Feb 06 enell 120   {
66 09 Feb 06 enell 121     String ret = "";
66 09 Feb 06 enell 122
66 09 Feb 06 enell 123     ret += (tok1 == null ? "null" : tok1.toString());
66 09 Feb 06 enell 124     ret += this.character;
66 09 Feb 06 enell 125     ret += (tok2 == null ? "null" : tok2.toString());
66 09 Feb 06 enell 126     if (this.order > 3) ret = "(" + ret + ")";
66 09 Feb 06 enell 127
66 09 Feb 06 enell 128     return ret;
66 09 Feb 06 enell 129   }
66 09 Feb 06 enell 130
66 09 Feb 06 enell 131   /**
66 09 Feb 06 enell 132    * Compares the specified object with this Operator for equality. Returns
66 09 Feb 06 enell 133    * <code>true</code> if the specifies object is also an Operator, the
66 09 Feb 06 enell 134    * Tokens in the two Operators are equal, and the character for the two
66 09 Feb 06 enell 135    * Operators are the same.
66 09 Feb 06 enell 136    * 
66 09 Feb 06 enell 137    * @return <code>true</code> if the specified object is equal this
66 09 Feb 06 enell 138    *         Operator.
66 09 Feb 06 enell 139    */
66 09 Feb 06 enell 140   @Override
66 09 Feb 06 enell 141   public boolean equals(Object obj)
66 09 Feb 06 enell 142   {
66 09 Feb 06 enell 143     if (obj instanceof Operator)
66 09 Feb 06 enell 144     {
66 09 Feb 06 enell 145       boolean ret;
66 09 Feb 06 enell 146       if (this.tok1 == null) ret = ((Operator) obj).tok1 == null;
66 09 Feb 06 enell 147       else ret = this.tok1.equals(((Operator) obj).tok1);
66 09 Feb 06 enell 148
66 09 Feb 06 enell 149       ret &= this.character == ((Operator) obj).character;
66 09 Feb 06 enell 150
66 09 Feb 06 enell 151       if (this.tok2 == null) ret &= ((Operator) obj).tok2 == null;
66 09 Feb 06 enell 152       else ret &= this.tok2.equals(((Operator) obj).tok2);
66 09 Feb 06 enell 153
66 09 Feb 06 enell 154       return ret;
66 09 Feb 06 enell 155     }
66 09 Feb 06 enell 156     return false;
66 09 Feb 06 enell 157   }
66 09 Feb 06 enell 158
66 09 Feb 06 enell 159   /**
66 09 Feb 06 enell 160    * Returns the hash code value for this Operator. The hash code is defined
66 09 Feb 06 enell 161    * as the sum of the hash codes of the two Tokens plus the hash code for the
66 09 Feb 06 enell 162    * character. This ensures that <code>o1.equals(o2)</code> implies that
66 09 Feb 06 enell 163    * <code>o1.hashCode() == o2.hashCode()</code> for any two Operators
66 09 Feb 06 enell 164    * <code>o1</code> and <code>o2</code>, as required by the general
66 09 Feb 06 enell 165    * contract of Object.hashCode.
66 09 Feb 06 enell 166    * 
66 09 Feb 06 enell 167    * @return the hash code value of this Operator.
66 09 Feb 06 enell 168    */
66 09 Feb 06 enell 169   @Override
66 09 Feb 06 enell 170   public int hashCode()
66 09 Feb 06 enell 171   {
66 09 Feb 06 enell 172     int ret;
66 09 Feb 06 enell 173
66 09 Feb 06 enell 174     ret = tok1.hashCode();
66 09 Feb 06 enell 175     ret += this.character.hashCode();
66 09 Feb 06 enell 176     ret += tok2.hashCode();
66 09 Feb 06 enell 177
66 09 Feb 06 enell 178     return ret;
66 09 Feb 06 enell 179   }
66 09 Feb 06 enell 180
66 09 Feb 06 enell 181   /*
66 09 Feb 06 enell 182    * (non-Javadoc)
66 09 Feb 06 enell 183    * 
66 09 Feb 06 enell 184    * @see calc.Token#getVariables()
66 09 Feb 06 enell 185    */
66 09 Feb 06 enell 186   @Override
66 09 Feb 06 enell 187   protected HashSet<Variable> getVariables()
66 09 Feb 06 enell 188   {
66 09 Feb 06 enell 189     HashSet<Variable> ret = new HashSet<Variable>();
66 09 Feb 06 enell 190     ret.addAll(tok1.getVariables());
66 09 Feb 06 enell 191     ret.addAll(tok2.getVariables());
66 09 Feb 06 enell 192     return ret;
66 09 Feb 06 enell 193   }
66 09 Feb 06 enell 194
66 09 Feb 06 enell 195   /**
66 09 Feb 06 enell 196    * Sets the first Token of this Operator object.
66 09 Feb 06 enell 197    * 
66 09 Feb 06 enell 198    * @param tok1
66 09 Feb 06 enell 199    *            the given new Token.
66 09 Feb 06 enell 200    */
66 09 Feb 06 enell 201   protected void setTok1(Token tok1)
66 09 Feb 06 enell 202   {
66 09 Feb 06 enell 203     this.tok1 = tok1;
66 09 Feb 06 enell 204   }
66 09 Feb 06 enell 205
66 09 Feb 06 enell 206   /**
66 09 Feb 06 enell 207    * Sets the second Token of this Operator object.
66 09 Feb 06 enell 208    * 
66 09 Feb 06 enell 209    * @param tok2
66 09 Feb 06 enell 210    *            the given new Token.
66 09 Feb 06 enell 211    */
66 09 Feb 06 enell 212   protected void setTok2(Token tok2)
66 09 Feb 06 enell 213   {
66 09 Feb 06 enell 214     this.tok2 = tok2;
66 09 Feb 06 enell 215   }
66 09 Feb 06 enell 216
66 09 Feb 06 enell 217   /**
66 09 Feb 06 enell 218    * Gets the oreder of this Operator.
66 09 Feb 06 enell 219    * 
66 09 Feb 06 enell 220    * @return the oreder of this Operator.
66 09 Feb 06 enell 221    */
66 09 Feb 06 enell 222   protected int getOrder()
66 09 Feb 06 enell 223   {
66 09 Feb 06 enell 224     return order;
66 09 Feb 06 enell 225   }
66 09 Feb 06 enell 226
66 09 Feb 06 enell 227   /**
66 09 Feb 06 enell 228    * Increases the order parameter with the given parameter,
66 09 Feb 06 enell 229    * <code>this.order += inc;</code>.
66 09 Feb 06 enell 230    * 
66 09 Feb 06 enell 231    * @param inc
66 09 Feb 06 enell 232    *            how much the order while increas, a negative value will
66 09 Feb 06 enell 233    *            decrease the order.
66 09 Feb 06 enell 234    */
66 09 Feb 06 enell 235   protected void addOrder(int inc)
66 09 Feb 06 enell 236   {
66 09 Feb 06 enell 237     this.order += inc;
66 09 Feb 06 enell 238   }
66 09 Feb 06 enell 239 }