relNumExpr.h

Go to the documentation of this file.
00001 /*
00002  * CrocoPat is a tool for relational programming.
00003  * This file is part of CrocoPat. 
00004  *
00005  * Copyright (C) 2002-2008  Dirk Beyer
00006  *
00007  * CrocoPat is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public License
00009  * as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * CrocoPat is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public License
00018  * along with CrocoPat; if not, write to the Free Software
00019  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00020  *
00021  * Please find the GNU Lesser General Public License in file
00022  * License_LGPL.txt or at http://www.gnu.org/licenses/lgpl.txt
00023  *
00024  * Author:
00025  * Dirk Beyer (firstname.lastname@sfu.ca)
00026  * Simon Fraser University
00027  *
00028  * With contributions of: Andreas Noack, Michael Vogel
00029  */
00030 
00031 #ifndef _relNumExpr_h
00032 #define _relNumExpr_h
00033 
00034 #include "relNumber.h"
00035 #include "bddSymTab.h"
00036 class relExpression;
00037 class relStrExpr;
00038 
00039 #include <string>
00040 #include <map>
00041 #include <cmath>
00042 
00044 extern map<string, relDataType*> gVariables;
00045 
00047 extern double elapsed();
00048 
00050 class relNumExpr : public relObject
00051 {
00052 public:
00053   virtual relNumber
00054   interpret(bddSymTab* pSymTab) = 0;
00055 };
00056 
00057 
00059 class relNumExprVar : public relNumExpr
00060 {
00061 private:
00062   string*         mVar;
00063 
00064 public:
00065   relNumExprVar(string* pVar)
00066     : mVar(pVar)
00067   {}
00068 
00069   ~relNumExprVar()
00070   {
00071     delete mVar;
00072   }
00073 
00074   virtual relNumber
00075   interpret(bddSymTab* pSymTab)
00076   {
00077     // Fetch result.
00078     map<string, relDataType*>::const_iterator lVarIt = gVariables.find(*mVar);
00079     assert(lVarIt != gVariables.end());  // Must be declared.
00080     assert(lVarIt->second != NULL);
00081     relNumber* lResult = dynamic_cast<relNumber*>(lVarIt->second);
00082     assert(lResult != NULL);             // Must be a INT variable.
00083  
00084     return *lResult;
00085   }
00086 };
00087 
00089 class relNumExprConst : public relNumExpr
00090 {
00091 private:
00092   double         mVal;
00093 
00094 public:
00095   relNumExprConst(double pVal)
00096     : mVal(pVal)
00097   {}
00098 
00099   ~relNumExprConst()
00100   {}
00101 
00102   virtual relNumber
00103   interpret(bddSymTab* pSymTab)
00104   {
00105     return relNumber(mVal);
00106   }
00107 };
00108 
00110 class relNumExprUnOp : public relNumExpr
00111 {
00112 public:
00113   typedef enum {CARD, MIN, MAX, SUM, AVG} relNumOP;
00114 
00115 private:
00116   relExpression* mExpr;
00117   relNumOP       mOp;
00118 
00119 public:
00120   relNumExprUnOp(relExpression* pExpr, relNumOP pOp)
00121     : mExpr(pExpr),
00122       mOp(pOp)
00123   {}
00124 
00125   ~relNumExprUnOp();
00126 
00127   virtual relNumber
00128   interpret(bddSymTab* pSymTab);
00129 };
00130 
00131 
00133 class relNumExprBinOp : public relNumExpr
00134 {
00135 public:
00136   typedef enum {PLUS, MINUS, MULT, DDIV, IDIV, MOD, POW} relNumOP;
00137 
00138 private:
00139   relNumExpr*   mExpr1;
00140   relNumOP      mOp;
00141   relNumExpr*   mExpr2;
00142 
00143 public:
00144   relNumExprBinOp( relNumExpr* pExpr1, 
00145                    relNumOP pOp, 
00146                    relNumExpr* pExpr2)
00147     : mExpr1(pExpr1),
00148       mOp(pOp),
00149       mExpr2(pExpr2)
00150   {}
00151 
00152   ~relNumExprBinOp()
00153   {
00154         delete mExpr1;
00155         delete mExpr2;
00156   }
00157 
00158   virtual relNumber
00159   interpret(bddSymTab* pSymTab)
00160   {
00161         double lExpr1 = mExpr1->interpret(pSymTab).getValue();
00162         double lExpr2 = mExpr2->interpret(pSymTab).getValue();
00163         double result;
00164 
00165         if (mOp == PLUS)   result = lExpr1 + lExpr2;
00166         else if (mOp == MINUS)  result = lExpr1 - lExpr2;
00167         else if (mOp == MULT)   result = lExpr1 * lExpr2;
00168         else if (mOp == DDIV)   result = lExpr1 / lExpr2;
00169         else if (mOp == IDIV)   result = (int)lExpr1 / (int)lExpr2;
00170         else if (mOp == MOD)    result = (int)lExpr1 % (int)lExpr2;
00171         else if (mOp == POW)    result = pow(lExpr1, lExpr2);
00172         else { 
00173           cerr << "Internal error: Unknown operator (relNumExprBinOp)." << endl;
00174           abort(); 
00175         }
00176         return relNumber(result);
00177   }
00178 };
00179 
00181 class relNumExprRound : public relNumExpr
00182 {
00183 private:
00184   relNumExpr*   mExpr;
00185 
00186 public:
00187   relNumExprRound(relNumExpr* pExpr) 
00188     : mExpr(pExpr)
00189   {}
00190 
00191   ~relNumExprRound()
00192   {
00193     delete mExpr;
00194   }
00195 
00196   virtual relNumber
00197   interpret(bddSymTab* pSymTab)
00198   {
00199     double lExpr = mExpr->interpret(pSymTab).getValue();
00200     return relNumber(floor(lExpr + 0.5));
00201   }
00202 };
00203 
00205 class relNumExprStr : public relNumExpr
00206 {
00207 private:
00208   relStrExpr*   mExpr;
00209 
00210 public:
00211   relNumExprStr(relStrExpr* pExpr) 
00212     : mExpr(pExpr)
00213   {}
00214 
00215   ~relNumExprStr();
00216 
00217   virtual relNumber
00218   interpret(bddSymTab* pSymTab);
00219 };
00220 
00222 class relNumExprTimeElapsed : public relNumExpr
00223 {
00224 private:
00225 
00226 public:
00227   relNumExprTimeElapsed()
00228   {}
00229 
00230   ~relNumExprTimeElapsed()
00231   {}
00232 
00233   virtual relNumber
00234   interpret(bddSymTab* pSymTab)
00235   {
00236     return elapsed();
00237   }
00238 };
00239 
00240 #endif
00241 

Generated on Fri Jun 6 22:21:09 2008 for CrocoPat by  doxygen 1.5.1