std::string CppCode::methodCode(Method* method) { std::string mCode=tabStr, tmpStr; Variable *var = method->getReturnVariable(); if (var->getDataType()=="DOUBLE") { this->isDouble = true; } mCode += this->generateDatatype(var)+" "; mCode += method->getName()+"("; for (int i=0; i<method->getNumberOfParameters(); i++) { var = method->getParameterAt(i); if (var->getDataType()=="DOUBLE") { this->isDouble = true; } if (i>0) { mCode += ", "; } mCode += this->generateDatatype(var)+" "; //int a, vector<string> b etc. mCode += var->getName(); } mCode += ") {\n "; mCode += this->generateDatatype(method->getReturnVariable())+" out;\n\n"; mCode += " return out;\n }\n"; return mCode; }
fdmath::Matrix44 TransformPath::compute(GraphicsAPI& api) { Matrix44 camMatrix; if (!camera.isNull()) { Camera* cam = api.getVariableValueT<Camera*>(camera); fdmath::Transform transform = cam->getViewPair().getOutToIn(); camMatrix = Matrix44(transform); } else { camMatrix = Matrix44::createIdentity(); } if (!subTransform.isNull()) { Variable* subTransformVar = api.getVariable(subTransform); if (subTransformVar->getDataType() == FVT_TRANSFORM_PATH) { TransformPath* transformPath = subTransformVar->getValueT<TransformPath>(); return camMatrix * transformPath->compute(api); } else if (subTransformVar->getValue() != NULL) { fdmath::Matrix44 subTransformMatrix = *(fdmath::Matrix44*) subTransformVar->getValue(); return camMatrix * subTransformMatrix; } else { return camMatrix; } } else { return camMatrix; } }
std::string CppCode::generateFullTestReader(Problem& problem) { Method* method = problem.getMethod(); Variable* var; std::string code = tabStr + "const std::string currentDateTime() {\n"+ tabStr + tabStr + "time_t now = time(0);\n"+ tabStr + tabStr + "struct tm tstruct;\n"+ tabStr + tabStr + "char buf[80];\n" + tabStr + tabStr + "tstruct = *localtime(&now);\n"+ tabStr + tabStr + "strftime(buf, sizeof(buf), \"%Y-%m-%d %X\", &tstruct);\n"+ tabStr + tabStr + "return buf;\n"+ tabStr+"}\n\n"+ tabStr+"//This method will only accept input files that are formatted in proper way.\n"+ tabStr+"//Command line example: "+problem.getClassName()+".exe -2 <"+problem.getClassName()+".io\n"+ tabStr+"bool run_full_test() {\n" + tabStr+tabStr+"int testCase, N, caseNo, correct=0;\n"; //declare all variables for (int i=0; i<method->getNumberOfParameters(); i++) { var = method->getParameterAt(i); code+= tabStr+tabStr+this->generateDatatype(var)+" "+var->getName()+";\n";//vector<int> var; //if we have an array then we will create another variable to read single item of that array, redundant but easy to code :| if (var->isArray()) { code += tabStr+tabStr+this->convertDataType(var->getDataType())+" "+var->getName()+"_sin;\n"; //with _in suffix } } var = method->getReturnVariable(); code+= tabStr+tabStr+this->generateDatatype(var)+" "+var->getName()+";\n";//vector<int> var; if (var->isArray()) { code += tabStr+tabStr+this->convertDataType(var->getDataType())+" "+var->getName()+"_sin;\n"; //with _in suffix } code += "\n"; code+= tabStr+tabStr+"std::cin>>testCase; std::cin.ignore(10, '\\n');\n" + tabStr+tabStr+"for (int i=0; i<testCase; i++) {\n" + tabStr+tabStr+tabStr+"std::cin>>caseNo; std::cin.ignore(10, '\\n');\n"; //code to read all parameters for (int i=0; i<method->getNumberOfParameters(); i++) { code += this->generateSingleCaseReader(method->getParameterAt(i), tabStr+tabStr); } //code to read expected result code += this->generateSingleCaseReader(method->getReturnVariable(), tabStr+tabStr); //code to run class.Method(parameters...) code += tabStr+tabStr+tabStr+"clock_t start_ = clock();\n"; code += tabStr+tabStr+tabStr+this->generateDatatype(method->getReturnVariable())+" received_ = " + problem.getClassName()+"()."+method->getName()+"("; for (int i=0; i<method->getNumberOfParameters(); i++) { if (i) { code += ", "; } code += method->getParameterAt(i)->getName(); } code += ");\n"; code += tabStr+tabStr+tabStr+"correct += verify_case(caseNo, " + method->getReturnVariable()->getName() + ", received_, clock()-start_);\n"; code+=tabStr+tabStr+"}//end of testCase for loop\n\n"; code += tabStr+tabStr +"if (testCase == 0) {\n" + tabStr+tabStr+tabStr+"cerr << \"No test cases run.\" << endl;\n" + tabStr+tabStr+"} else if (correct < testCase) {\n"+ tabStr+tabStr+tabStr+"cerr << \"Some cases FAILED (passed \" << correct << \" of \" << testCase << \").\" << endl;\n"+ tabStr+tabStr+"} else {\n"+ tabStr+tabStr+tabStr+"cerr << \"All \" << testCase << \" tests passed!\" << endl;\n"+ tabStr+tabStr+tabStr+"std::ofstream ofs(\""+problem.getClassName()+".st\", std::ios_base::app);\n"+ tabStr+tabStr+tabStr+"ofs<<currentDateTime()<<std::endl;\n"+ tabStr+tabStr+tabStr+"ofs.close();\n"+ tabStr+tabStr+"}\n"+ tabStr+tabStr+"return true;\n"+ tabStr+"}\n\n"; return code; }
std::string CppCode::generateVerifyCase(Problem& problem) { Variable* reType = problem.getMethod()->getReturnVariable(); std::string typeName = this->generateDatatype(reType); std::string mCode; mCode = " int verify_case(int casenum, const " + typeName + " &expected, const " + typeName + " &received, clock_t elapsed) { \n" + " cerr << \"Example \" << casenum << \"... \"; \n" + "\n" + " string verdict;\n" + " vector<string> info;\n" + " char buf[100];\n" + "\n" + " if (elapsed > CLOCKS_PER_SEC / 200) {\n" + " sprintf(buf, \"time %.2fs\", elapsed * (1.0/CLOCKS_PER_SEC));\n" + " info.push_back(buf);\n" + " }\n" + "\n"; // Print "PASSED" or "FAILED" based on the result if (reType->getDataType()=="DOUBLE") { mCode += std::string( " if (compareDouble(expected, received)) {\n") + " verdict = \"PASSED\";\n" + " double rerr = moj_relative_error(expected, received); \n" + " if (rerr > 0) {\n" + " sprintf(buf, \"relative error %.3e\", rerr);\n" + " info.push_back(buf);\n" + " }\n"; } else { mCode += std::string(" if (expected == received) {\n") + " verdict = \"PASSED\";\n"; } mCode += std::string(" } else {\n") + " verdict = \"FAILED\";\n" + " }\n" + "\n" + " cerr << verdict;\n" + " if (!info.empty()) {\n" + " cerr << \" (\";\n" + " for (int i=0; i<(int)info.size(); ++i) {\n" + " if (i > 0) cerr << \", \";\n" + " cerr << info[i];\n" + " }\n" + " cerr << \")\";\n" + " }\n" + " cerr << endl;\n" + "\n" + " if (verdict == \"FAILED\") {\n"; if (reType->getDataType()=="STRING" && !reType->isArray()) { mCode += std::string(" cerr << \" Expected: \\\"\" << expected << \"\\\"\" << endl;\n") + " cerr << \" Received: \\\"\" << received << \"\\\"\" << endl;\n"; } else { mCode += std::string(" cerr << \" Expected: \" << expected << endl; \n") + " cerr << \" Received: \" << received << endl; \n"; } mCode += std::string(" }\n") + "\n" + " return verdict == \"PASSED\";\n" + " }\n" + "\n"; return mCode; }