00001 #include "FunctionSet.h" 00002 00003 namespace cart { 00004 00005 FunctionSet::FunctionSet(string gettype) 00006 { 00007 type = gettype; 00008 existFunc["+"] = true; 00009 existFunc["-"] = true; 00010 existFunc["*"] = true; 00011 existFunc["/"] = true; 00012 existFunc["sin"] = true; 00013 existFunc["cos"] = true; 00014 existFunc["AND"] = true; 00015 existFunc["OR"] = true; 00016 existFunc["NOT"] = true; 00017 existFunc["XOR"] = true; 00018 existFunc["XNOR"] = true; 00019 } 00020 00021 bool FunctionSet::addFunction(string name) 00022 { 00023 if (!existFunc[name]) 00024 { 00025 cerr << "FunctionSet error: Function " << name << " isn't implemented." << endl; 00026 return false; 00027 } 00028 00029 if (type == "double") 00030 { 00031 if (name == "+") 00032 { 00033 this->push_back((FunctionP) (new AddDouble)); 00034 } 00035 else if (name == "-") 00036 { 00037 this->push_back((FunctionP) (new SubDouble)); 00038 } 00039 else if (name == "*") 00040 { 00041 this->push_back((FunctionP) (new MulDouble)); 00042 } 00043 else if (name == "/") 00044 { 00045 this->push_back((FunctionP) (new DivDouble)); 00046 } 00047 else if (name == "sin") 00048 { 00049 this->push_back((FunctionP) (new SinDouble)); 00050 } 00051 else if (name == "cos") 00052 { 00053 this->push_back((FunctionP) (new CosDouble)); 00054 } 00055 else 00056 { 00057 cerr << "FunctionSet error: Unkown function name: " << name << endl; 00058 return false; 00059 } 00060 } 00061 else if (type == "int") 00062 { 00063 if (name == "+") 00064 { 00065 this->push_back((FunctionP) (new AddInt)); 00066 } 00067 else if (name == "-") 00068 { 00069 this->push_back((FunctionP) (new SubInt)); 00070 } 00071 else if (name == "*") 00072 { 00073 this->push_back((FunctionP) (new MulInt)); 00074 } 00075 else if (name == "/") 00076 { 00077 this->push_back((FunctionP) (new DivInt)); 00078 } 00079 else if (name == "sin") 00080 { 00081 this->push_back((FunctionP) (new SinInt)); 00082 } 00083 else if (name == "cos") 00084 { 00085 this->push_back((FunctionP) (new CosInt)); 00086 } 00087 else 00088 { 00089 cerr << "FunctionSet error: Unkown function name: " << name << endl; 00090 return false; 00091 } 00092 } 00093 else if (type == "uint") 00094 { 00095 if (name == "AND") 00096 { 00097 this->push_back((FunctionP) (new AndUint)); 00098 } 00099 else if (name == "OR") 00100 { 00101 this->push_back((FunctionP) (new OrUint)); 00102 } 00103 else if (name == "NOT") 00104 { 00105 this->push_back((FunctionP) (new NotUint)); 00106 } 00107 else if (name == "XOR") 00108 { 00109 this->push_back((FunctionP) (new XorUint)); 00110 } 00111 else if (name == "XNOR") 00112 { 00113 this->push_back((FunctionP) (new XnorUint)); 00114 } 00115 else 00116 { 00117 cerr << "FunctionSet error: Unkown function name: " << name << endl; 00118 return false; 00119 } 00120 } 00121 else 00122 { 00123 cerr << "FunctionSet error: Unkown data type: " << type << endl; 00124 return false; 00125 } 00126 00127 return true; 00128 } 00129 00130 bool FunctionSet::addFunction(string name, uint numArgs) 00131 { 00132 if (!existFunc[name]) 00133 { 00134 cerr << "FunctionSet error: Function " << name << " isn't implemented." << endl; 00135 return false; 00136 } 00137 00138 if (type == "double") 00139 { 00140 if (name == "+") 00141 { 00142 this->push_back((FunctionP) (new AddDouble(numArgs))); 00143 } 00144 else if (name == "-") 00145 { 00146 this->push_back((FunctionP) (new SubDouble(numArgs))); 00147 } 00148 else if (name == "*") 00149 { 00150 this->push_back((FunctionP) (new MulDouble(numArgs))); 00151 } 00152 else if (name == "/") 00153 { 00154 this->push_back((FunctionP) (new DivDouble(numArgs))); 00155 } 00156 else 00157 { 00158 cerr << "FunctionSet error: Unkown function name: " << name; 00159 cerr << " for " << numArgs << " arguments." << endl; 00160 return false; 00161 } 00162 } 00163 else if (type == "int") 00164 { 00165 if (name == "+") 00166 { 00167 this->push_back((FunctionP) (new AddInt(numArgs))); 00168 } 00169 else if (name == "-") 00170 { 00171 this->push_back((FunctionP) (new SubInt(numArgs))); 00172 } 00173 else if (name == "*") 00174 { 00175 this->push_back((FunctionP) (new MulInt(numArgs))); 00176 } 00177 else if (name == "/") 00178 { 00179 this->push_back((FunctionP) (new DivInt(numArgs))); 00180 } 00181 else 00182 { 00183 cerr << "FunctionSet error: Unkown function name: " << name; 00184 cerr << " for " << numArgs << " arguments." << endl; 00185 return false; 00186 } 00187 } 00188 else if (type == "uint") 00189 { 00190 if (name == "AND") 00191 { 00192 this->push_back((FunctionP) (new AndUint(numArgs))); 00193 } 00194 else if (name == "OR") 00195 { 00196 this->push_back((FunctionP) (new OrUint(numArgs))); 00197 } 00198 else if (name == "XOR") 00199 { 00200 this->push_back((FunctionP) (new XorUint(numArgs))); 00201 } 00202 else if (name == "XNOR") 00203 { 00204 this->push_back((FunctionP) (new XnorUint(numArgs))); 00205 } 00206 else 00207 { 00208 cerr << "FunctionSet error: Unkown function name: " << name; 00209 cerr << " for " << numArgs << " arguments." << endl; 00210 return false; 00211 } 00212 } 00213 else 00214 { 00215 cerr << "FunctionSet error: Unkown data type: " << type << endl; 00216 return false; 00217 } 00218 00219 return true; 00220 } 00221 00222 void FunctionSet::evaluate(voidP inputs, void* result, uint funcNum) 00223 { 00224 this->at(funcNum)->evaluate(inputs, result); 00225 } 00226 00227 }