00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
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
00078 map<string, relDataType*>::const_iterator lVarIt = gVariables.find(*mVar);
00079 assert(lVarIt != gVariables.end());
00080 assert(lVarIt->second != NULL);
00081 relNumber* lResult = dynamic_cast<relNumber*>(lVarIt->second);
00082 assert(lResult != NULL);
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