Files
secondo/Algebras/CompiledExpressions/CECodeGenerator.cpp
2026-01-23 17:03:45 +08:00

2738 lines
93 KiB
C++

/*
----
This file is part of SECONDO.
Copyright (C) 2004-2009, University in Hagen, Faculty of Mathematics
and Computer Science, Database Systems for New Applications.
SECONDO is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
SECONDO is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SECONDO; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
----
//paragraph [10] title: [{\Large \bf ] [}]
//paragraph [21] table1column: [\begin{quote}\begin{tabular}{l}] [\end{tabular}\end{quote}]
//paragraph [22] table2columns: [\begin{quote}\begin{tabular}{ll}] [\end{tabular}\end{quote}]
//paragraph [23] table3columns: [\begin{quote}\begin{tabular}{lll}] [\end{tabular}\end{quote}]
//paragraph [24] table4columns: [\begin{quote}\begin{tabular}{llll}] [\end{tabular}\end{quote}]
//[TOC] [\tableofcontents]
//[--------] [\hline]
//characters [1] verbatim: [$] [$]
//characters [2] formula: [$] [$]
//characters [3] capital: [\textsc{] [}]
//characters [4] teletype: [\texttt{] [}]
//[ae] [\"a]
//[oe] [\"o]
//[ue] [\"u]
//[ss] [{\ss}]
//[<=] [\leq]
//[#] [\neq]
//[tilde] [\verb|~|]
//[<] [$<$]
//[>] [$>$]
[10] Implementation file of the CECodeGenerator
2016/2017 H.Brieschke created the new CompiledExpression Algebra
[TOC]
1 Overview
In this file the classes needed for the ~CECodeGenerator~ are implemented. These are
* ~CECGImplSecondoType~
* ~CECGImplSecondoOperator~
* ~CECGImplSecondoAlgebra~
* ~CECodeGenerator~
* ~CECOpTreeVisitorGenerateCode~
The 3 classes ~CECGImplSecondoAlgebra~, ~CECGImplSecondoType~ and ~CECGImplSecondoOperator~ are
the base classes of the ~ceCodeStore~.
The class ~CECodeGenerator~ implements the code generator.
The class ~CECOpTreeVisitorGenerateCode~, a subclass from the ~CECOpTreeVisitor~, searches for the
code parts in the operator tree and provides it to the ~CECodeGenerator~.
2 Defines, includes, and constants
*/
#include <iostream>
#include <sstream>
#include <string>
#include "Symbols.h"
#include "Trace.h"
#include "TypeConstructor.h"
#include "StandardTypes.h"
#include "FileSystem.h"
#include "CECodeGenerator.h"
#include "CECodeStore.cpp"
extern AlgebraManager *am;
using namespace CompiledExpressions;
namespace CompiledExpressions {
/*
3 Class ~CECGImplSecondoType~
This class is the base class of all ~ceCodeStore~-classes to implements
the code generation of a ~Secondo Type~.
3.1 The Constructor.
*/
CECGImplSecondoType::CECGImplSecondoType()
: algID(0),
typeID(0),
isActiv(false) {}
/*
3.2 Function ~initType~
A ~set~-function that initializes the class objects with the current values
of the ~Secondo Algebra Manager~ at runtime.
*/
void
CECGImplSecondoType::initType(int algID,
int typeID,
bool isActiv) {
(*this).algID = algID;
(*this).typeID = typeID;
(*this).isActiv = isActiv;
}
/*
3.3 Function ~isActivType~
A ~get~-function returned ~TRUE~ or ~FALSE~ if the
corresponding ~Secondo Type~ activ or not.
*/
bool
CECGImplSecondoType::isActivType() {
return isActiv;
}
/*
3.4 Function ~isCPPType~
A ~get~-function returned ~TRUE~ or ~FALSE~ whether the
corresponding ~Secondo Type~ has a correspondence as ~C++ Type~.
*/
bool
CECGImplSecondoType::isCPPType() {
return false;
}
/*
3.5 Function ~getTypeName~
A ~get~-function returned a string with the ~Secondo Type Name~.
*/
std::string
CECGImplSecondoType::getTypeName() {
return "";
}
/*
3.6 Function ~getTypeClassName~
A ~get~-function returned a string with the ~Secondo Type Class Name~.
*/
std::string
CECGImplSecondoType::getTypeClassName() {
return "";
}
/*
3.7 Function ~getCPPTypeName~
A ~get~-function returned a string with the ~C++ Type Name~.
*/
std::string
CECGImplSecondoType::getCPPTypeName() {
return "";
}
/*
4 Class ~CECGImplSecondoOperator~
This class is the base class of all ~ceCodeStore~-classes to implements
the code generation of a ~Secondo Operator~.
4.1 The Constructor.
*/
CECGImplSecondoOperator::CECGImplSecondoOperator()
: algID(0),
opID(0),
isActiv(false) {}
/*
4.2 Function ~initOperator~
A ~set~-function that initializes the class objects with the current values
of the ~Secondo Algebra Manager~ at runtime.
*/
void
CECGImplSecondoOperator::initOperator(int algID,
int opID,
bool isActiv) {
(*this).algID = algID;
(*this).opID = opID;
(*this).isActiv = isActiv;
}
/*
4.3 Function ~isActivOperator~
A ~get~-function returned ~TRUE~ or ~FALSE~ if the
corresponding ~Secondo Operator~ activ or not.
*/
bool
CECGImplSecondoOperator::isActivOperator() {
return isActiv;
}
/*
4.4 Function ~getOperatorName~
A ~get~-function returned a string with the ~Secondo Operator Name~.
*/
std::string
CECGImplSecondoOperator::getOperatorName() {
return "";
}
/*
4.5 Function ~isGenerateNewObject~
A ~get~-function returned ~TRUE~ or ~FALSE~ if the
corresponding ~Secondo Operator~ in his ~ResultStorage~ created new object or not.
*/
bool
CECGImplSecondoOperator::isGenerateNewObject() {
return false;
}
/*
4.6 Function ~isStreamOperator~
A ~get~-function returned ~TRUE~ or ~FALSE~ if the
corresponding ~Secondo Operator~ a stream operator or not.
*/
bool
CECGImplSecondoOperator::isStreamOperator() {
return false;
}
/*
4.7 Function ~getCodeOperatorAdditionalVariablesDefinition~
A ~get~-function returned a string with the code to defintion additional variables.
*/
std::string
CECGImplSecondoOperator::getCodeOperatorAdditionalVariablesDefinition() {
return "";
}
/*
4.8 Function ~getCodeOperatorAdditionalVariablesInitialisation~
A ~get~-function returned a string with the code to initialisation additional variables.
*/
std::string
CECGImplSecondoOperator::getCodeOperatorAdditionalVariablesInitialisation() {
return "";
}
/*
4.9 Function ~getCodeOperatorEvalOpenBody~
A ~get~-function returned a string with the code from the body of the ~eval open~-function.
*/
std::string
CECGImplSecondoOperator::getCodeOperatorEvalOpenBody() {
return "";
}
/*
4.10 Function ~getCodeOperatorEvalRequestBody~
A ~get~-function returned a string with the code from the body of the ~eval request~-function.
*/
std::string
CECGImplSecondoOperator::getCodeOperatorEvalRequestBody
(std::vector<CECGImplSecondoType*>(&signature)) throw (CECRuntimeError) {
return "";
}
/*
4.11 Function ~getCodeOperatorEvalCloseBody~
A ~get~-function returned a string with the code from the body of the ~eval close~-function.
*/
std::string
CECGImplSecondoOperator::getCodeOperatorEvalCloseBody() {
return "";
}
/*
5 Class ~CECodeGenerator~
The class ~CECodeGenerator~ implements the code generator. On one hand, it manages
the ~code store~ and, on the other hand, uses the ~CECOpTreeVisitorGenerateCode~-visitor
to create the source code files to be generated.
This class is implemented as a ~Singleton~.
5.1 Initialisation of the static class variable
*/
bool CECodeGenerator::canInitialize = false;
CECodeGenerator* CECodeGenerator::instance = 0;
/*
5.2 The Constructor.
*/
CECodeGenerator::CECodeGenerator()
: isLoadCECGImplTypesAndOperators(false),
isInitCECGImplTypesAndOperators(false) {
loadCECGImplAlgebrasTypesAndOperators();
initCECGImplTypesAndOperators();
}
/*
5.3 The Destructor.
*/
CECodeGenerator::~CECodeGenerator() {
deleteCECGImplAlgebrasTypesAndOperators();
}
/*
5.4 Function ~getInstance~
This static function returned a pointer of the ~CECodeGenerator~-instance.
If no instance has been created, the function creates an instance.
*/
CECodeGenerator*
CECodeGenerator::getInstance() {
if (!CECodeGenerator::instance)
CECodeGenerator::instance = new CECodeGenerator();
return CECodeGenerator::instance;
}
/*
5.5 Function ~deleteInstance~
This static function deleted the ~CECodeGenerator~-instance.
*/
void
CECodeGenerator::deleteInstance() {
delete instance;
instance = 0;
}
/*
5.6 Function ~setCanInitialize~
This static function set a flag, which indicates that the ~Secondo System~ has been started
so far that the ~Code Store~ can be initialized. This point is reached as soon as
the ~Secondo Algebra Manager~ has loaded all active algebras.
*/
void
CECodeGenerator::setCanInitialize() {
CECodeGenerator::canInitialize = true;
}
/*
5.7 Function ~loadCECGImplSecondoType~
This function insert the given ~CECGImplSecondoType~-object ~implSecondoType~
in a data structure, in which all implemented ~CECGImplSecondoType~ are managed.
*/
void
CECodeGenerator::loadCECGImplSecondoType
(CECGImplSecondoType* implSecondoType) {
std::string key = "type_" + implSecondoType->getTypeName();
mapNameImplTypes[key] = implSecondoType;
}
/*
5.8 Function ~getPtrSecondoType~
A ~get~-function returned a pointer to the ~CECGImplSecondoType~-objects is given
by the name ~name~.
*/
CECGImplSecondoType*
CECodeGenerator::getPtrSecondoType(std::string& name) {
CECGImplSecondoType* ptrReturn = 0;
std::string key = "type_" + name;
initCECGImplTypesAndOperators();
std::map<std::string, CECGImplSecondoType*>::const_iterator itType;
itType = mapNameImplTypes.find(key);
if (itType != mapNameImplTypes.end())
ptrReturn = itType->second;
return ptrReturn;
}
/*
5.9 Function ~loadCECGImplSecondoOperator~
This function insert the given ~CECGImplSecondoOperator~-object ~implSecondoOperator~
in a data structure, in which all implemented ~CECGImplSecondoOperator~ are managed.
*/
void
CECodeGenerator::loadCECGImplSecondoOperator
(const std::string& algName,
CECGImplSecondoOperator* implSecondoOperator) {
std::string key = "operator_"
+ algName
+ "_"
+ implSecondoOperator->getOperatorName();
mapNameImplOperators[key] = implSecondoOperator;
}
/*
5.10 Functions ~getPtrSecondoOperator~
A ~get~-function returned a pointer to the ~CECGImplSecondoOperator~-objects is given
by the ~Algebraname~ and the ~Operatorname~.
*/
CECGImplSecondoOperator*
CECodeGenerator::getPtrSecondoOperator(std::string& algName,
std::string& opName) {
CECGImplSecondoOperator* ptrReturn = 0;
std::string key = "operator_" + algName + "_" + opName;
initCECGImplTypesAndOperators();
std::map<std::string, CECGImplSecondoOperator*>::const_iterator itOperator;
itOperator = mapNameImplOperators.find(key);
if (itOperator != mapNameImplOperators.end())
ptrReturn = itOperator->second;
return ptrReturn;
}
/*
And a ~get~-function returned a pointer to the ~CECGImplSecondoOperator~-objects is given
by the ~Algebranumber~ and the ~Operatornumber~.
*/
CECGImplSecondoOperator*
CECodeGenerator::getPtrSecondoOperator(unsigned int algID,
unsigned int opID) {
CECGImplSecondoOperator* ptrReturn = 0;
std::stringstream ss;
ss << "operator_" << algID << "_" << opID;
std::string key(ss.str());
initCECGImplTypesAndOperators();
std::map<std::string, CECGImplSecondoOperator*>::const_iterator itOperator;
itOperator = mapIdImplOperators.find(key);
if (itOperator != mapIdImplOperators.end())
ptrReturn = itOperator->second;
return ptrReturn;
}
/*
5.11 Function ~loadCECGImplAlgebrasTypesAndOperators~
This function loaded all implemented algebras, types, and operators from the ~Code Store~.
*/
void
CECodeGenerator::loadCECGImplAlgebrasTypesAndOperators() {
if (isLoadCECGImplTypesAndOperators || isInitCECGImplTypesAndOperators)
deleteCECGImplAlgebrasTypesAndOperators();
loadCECGImplAlgebras();
std::set<CECGImplSecondoAlgebra*>::iterator pos;
for ( pos = classObjAlgebras.begin();
pos != classObjAlgebras.end();
++pos ) {
(*pos)->loadCECGImplSecondoTypes(this);
(*pos)->loadCECGImplSecondoOperators(this);
}
isLoadCECGImplTypesAndOperators = true;
}
/*
5.12 Function ~initCECGImplTypesAndOperators~
This function initialized all implemented types and operators from the ~Code Store~.
*/
void
CECodeGenerator::initCECGImplTypesAndOperators() {
if (CECodeGenerator::canInitialize && !isInitCECGImplTypesAndOperators) {
if (!isLoadCECGImplTypesAndOperators)
loadCECGImplAlgebrasTypesAndOperators();
int numAlgebra, numType, numOperator;
std::string keyTypeName, keyOpName, keyIdName;
numAlgebra = am->getMaxAlgebraId();
for (int i = 0; i <= numAlgebra; i++) {
if (am->IsAlgebraLoaded(i)) {
numType = am->ConstrNumber(i);
for (int j = 0; j < numType; j++) {
keyTypeName = "type_" + am->GetTC(i, j)->Name();
std::map<std::string, CECGImplSecondoType*>::const_iterator it;
it = mapNameImplTypes.find(keyTypeName);
if (it != mapNameImplTypes.end())
it->second->initType(i, j, true);
}
numOperator = am->OperatorNumber(i);
for (int j = 0; j < numOperator; j++) {
keyOpName = "operator_"
+ am->GetAlgebraName(i)
+ "_"
+ am->GetOP(i, j)->GetName();
std::map<std::string, CECGImplSecondoOperator*>::const_iterator it;
it = mapNameImplOperators.find(keyOpName);
if (it != mapNameImplOperators.end()) {
it->second->initOperator(i, j, true);
std::stringstream ss;
ss << "operator_" << i << "_" << j;
std::string keyIdName(ss.str());
mapIdImplOperators[keyIdName] = it->second;
}
}
}
}
isInitCECGImplTypesAndOperators = true;
}
}
/*
5.13 Function ~deleteCECGImplAlgebrasTypesAndOperators~
This function deleted all ~Algebras~-, ~Types~- and ~Operator~-objects are loaded from
the ~Code Store~.
*/
void
CECodeGenerator::deleteCECGImplAlgebrasTypesAndOperators() {
std::set<CECGImplSecondoAlgebra*>::iterator itAlgebra;
for ( itAlgebra = classObjAlgebras.begin();
itAlgebra != classObjAlgebras.end();
++itAlgebra )
delete (*itAlgebra);
classObjAlgebras.clear();
std::map<std::string, CECGImplSecondoType*>::iterator itType;
for (itType = mapNameImplTypes.begin();
itType != mapNameImplTypes.end();
++itType)
delete itType->second;
mapNameImplTypes.clear();
std::map<std::string, CECGImplSecondoOperator*>::iterator itOperator;
for (itOperator = mapNameImplOperators.begin();
itOperator != mapNameImplOperators.end();
++itOperator)
delete itOperator->second;
mapNameImplOperators.clear();
mapIdImplOperators.clear();
isLoadCECGImplTypesAndOperators = false;
isInitCECGImplTypesAndOperators = false;
}
/*
5.14 Function ~generateCECode~
This function generate the ~c++-code~ of the query.
*/
bool
CECodeGenerator::generateCECode(CECOpNode* ptrRootNode,
CEQuery* ptrCEQY) {
try {
ptrRootNode->accept(ptrCEQY->getCodeGenVisitor());
return true;
} catch(...) {
return false;
}
}
/*
5.15 Function ~getStreamGeneratedCECode~
This function write the ~c++-code~ of the query in the stream ~outPut~.
*/
void
CECodeGenerator::getStreamGeneratedCECode(std::ostream& outPut,
CEQuery* ptrCEQY) {
outPut << (ptrCEQY->getCodeGenVisitor()).getGenCodeIncludes()
<< "using namespace CompiledExpressions;" << endl
<< "namespace CompiledExpressions {" << endl << endl
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeForwardDeclarations() << endl
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeClassCECNodeDefault() << endl
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeClassCECNodeApplyop()
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeClassCECNodeAbstraction()
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeClassCECNodeObject()
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeClassCECNodeConstant()
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeClassCECNodeVariable()
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeClassCECNodeIdentifier()
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeClassCECNodeArglist()
<< (ptrCEQY->getCodeGenVisitor())
.getGenCodeCodeCompiledExpressionsDeclaration() << endl
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeClassDefinitions() << endl
<< (ptrCEQY->getCodeGenVisitor())
.getGenCodeCodeCompiledExpressionsDefinition() << endl
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeClassConstructor() << endl
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeClassDestructor() << endl
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeFunctionEval() << endl
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeFunctionInit() << endl
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeFunctionOperator() << endl
<< (ptrCEQY->getCodeGenVisitor())
.getGenCodeDeclarationAdditionalFunction() << endl
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeEvalDefaultFunction() << endl
<< "}" << endl << endl
<< (ptrCEQY->getCodeGenVisitor()).getGenCodeLibCallFunction() << endl;
}
/*
5.16 Function ~getStreamMake~
This function generate the code from a ~makefile~ and write this in the stream ~outPut~.
*/
void
CECodeGenerator::getStreamMake(std::ostream& outPut,
std::string libName) {
outPut << "include ../../../makefile.env" << endl
<< "CCFLAGS += $(ALG_INC_DIRS)" << endl << endl
<< ".PHONY: all" << endl
<< "all: " << libName << ".so" << endl << endl
<< "%.so: %.cpp" << endl
<< "\tg++ $(CCFLAGS) --shared -o $@ $<" << endl;
}
/*
6 Class ~CECOpTreeVisitorGenerateCode~
The class ~CECOpTreeVisitorGenerateCode~, a subclass from the ~CECOpTreeVisitor~, searches for the
code parts in the operator tree and provides it to the ~CECodeGenerator~.
6.1 The Constructor.
*/
CECOpTreeVisitorGenerateCode::CECOpTreeVisitorGenerateCode()
: cecOpNodeApplyopIsInsert(false),
cecOpNodeAbstractionIsInsert(false),
cecOpNodeObjectIsInsert(false),
cecOpNodeConstantIsInsert(false),
cecOpNodeVariableIsInsert(false),
cecOpNodeIdentifierIsInsert(false),
cecOpNodeArglistIsInsert(false) {
createCELibDefaultFunc();
}
/*
6.2 The Destructor.
*/
CECOpTreeVisitorGenerateCode::~CECOpTreeVisitorGenerateCode() {
for (int i = 0; i < HF_SIZEOF; i++)
headerfiles[i].clear();
genCodeNodes.clear();
operators_libcall_function.clear();
}
/*
6.3 Function ~addVarNamesARG-idx~
This function completes the names of the parameters passed to a function for all necessary functions
of the source code to be generated, so that unique variable names are generated within a function.
*/
void
CECOpTreeVisitorGenerateCode::addVarNamesARG_idx() {
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itMap;
for(itMap = genCodeNodes.begin(); itMap != genCodeNodes.end(); ++itMap) {
if (itMap->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD]
.size() > 0) {
int idx = 0;
std::vector<std::string>::iterator itVec;
for (itVec = itMap->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD]
.begin() + 1;
itVec != itMap->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD]
.end();
++itVec) {
if ((*itVec).find("arg_") != std::string::npos) {
std::stringstream ss;
ss << idx++;
(*itVec).append(ss.str());
}
}
}
if (itMap->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD]
.size() > 0) {
int idx = 0;
std::vector<std::string>::iterator itVec;
for (itVec = itMap->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD]
.begin() + 1;
itVec != itMap->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD]
.end();
++itVec) {
if ((*itVec).find("arg_") != std::string::npos) {
std::stringstream ss;
ss << idx++;
(*itVec).append(ss.str());
}
}
}
}
}
/*
6.4 Function ~getGenCodeIncludes~
A ~get~-function returned a string with the generated ~c++-code~ of
the ~include headerfile section~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeIncludes() {
std::string code = "";
std::set<std::string>::iterator pos;
for(pos = headerfiles[HF_IDX_CPP].begin();
pos != headerfiles[HF_IDX_CPP].end();
++pos) {
code.append("#include <");
code.append(*pos);
code.append(">\n");
}
if (headerfiles[HF_IDX_CPP].size() > 0)
code.append("\n");
for(pos = headerfiles[HF_IDX_SECONDO].begin();
pos != headerfiles[HF_IDX_SECONDO].end();
++pos) {
code.append("#include \"");
code.append(*pos);
code.append("\"\n");
}
if (headerfiles[HF_IDX_SECONDO].size() > 0)
code.append("\n");
for(pos = headerfiles[HF_IDX_REST].begin();
pos != headerfiles[HF_IDX_REST].end();
++pos) {
code.append("#include \"");
code.append(*pos);
code.append("\"\n");
}
if (headerfiles[HF_IDX_REST].size() > 0)
code.append("\n");
code.append("\n");
return code;
}
/*
6.5 Function ~getGenCodeForwardDeclarations~
A ~get~-function returned a string with the generated ~c++-code~ of
the ~forward class declaration section~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeForwardDeclarations() {
std::string code = "";
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itPos;
for(itPos = genCodeNodes.begin();
itPos != genCodeNodes.end();
++itPos) {
code.append("class ");
code.append(itPos->first);
code.append(";\n");
}
code.append("\n");
return code;
}
/*
6.6 Function ~getGenCodeClassDefinitions~
A ~get~-function returned a string with the generated ~c++-code~ of
the ~class definition section~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeClassDefinitions() {
std::string code = "";
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itPos;
for(itPos = genCodeNodes.begin();
itPos != genCodeNodes.end();
++itPos) {
code.append("class ");
code.append(itPos->first);
code.append(" : public ");
code.append(itPos->second[CE_VCG_SUPERCLASS].at(0));
code.append(" {\n");
code.append("public:\n");
code.append(itPos->first);
code.append("();\n");
code.append("virtual ~");
code.append(itPos->first);
code.append("();\n");
code.append("bool Init();\n");
code.append("Word evalDefault();\n");
std::vector<std::string>::iterator pos;
for(pos = itPos->second[CE_VCG_DEFINITATION_FUNC_EVAL].begin();
pos != itPos->second[CE_VCG_DEFINITATION_FUNC_EVAL].end();
++pos) {
code.append(*pos);
}
for(pos = itPos->second[CE_VCG_DEFINITATION_ADDITIONAL_FUNCTION].begin();
pos != itPos->second[CE_VCG_DEFINITATION_ADDITIONAL_FUNCTION].end();
++pos) {
code.append(*pos);
}
code.append("\nprivate:\n");
for(pos = itPos->second[CE_VCG_DEFINITATION_VAR].begin();
pos != itPos->second[CE_VCG_DEFINITATION_VAR].end();
++pos) {
code.append(*pos);
}
for(pos = itPos->second[CE_VCG_DEFINITATION_ADDITIONAL_VAR].begin();
pos != itPos->second[CE_VCG_DEFINITATION_ADDITIONAL_VAR].end();
++pos) {
code.append(*pos);
}
for(pos = itPos->second
[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_OPEN].begin();
pos != itPos->second
[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_OPEN].end();
++pos) {
code.append(*pos);
}
for(pos = itPos->second
[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_REQUEST].begin();
pos != itPos->second
[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_REQUEST].end();
++pos) {
code.append(*pos);
}
code.append("\n};\n\n");
}
return code;
}
/*
6.7 Function ~getGenCodeClassConstructor~
A ~get~-function returned a string with the generated ~c++-code~ of
the ~class constructor function~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeClassConstructor() {
std::string code = "";
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itPos;
for(itPos = genCodeNodes.begin(); itPos != genCodeNodes.end(); ++itPos) {
code.append(itPos->first);
code.append("::");
code.append(itPos->first);
code.append("()\n");
code.append(": ");
code.append(itPos->second[CE_VCG_SUPERCLASS].at(0));
code.append("() {\n");
code.append("ceNodeKey = \"");
code.append(itPos->first);
code.append("\";\n");
std::vector<std::string>::iterator pos;
for(pos = itPos->second
[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY].begin();
pos != itPos->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY].end();
++pos) {
code.append(*pos);
}
code.append("}\n\n");
}
return code;
}
/*
6.8 Function ~getGenCodeClassDestructor~
A ~get~-function returned a string with the generated ~c++-code~ of
the ~class destructor function~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeClassDestructor() {
std::string code = "";
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itPos;
for(itPos = genCodeNodes.begin(); itPos != genCodeNodes.end(); ++itPos) {
code.append(itPos->first);
code.append("::~");
code.append(itPos->first);
code.append("() {\n");
std::vector<std::string>::iterator pos;
for(pos = itPos->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY].begin();
pos != itPos->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY].end();
++pos) {
code.append(*pos);
}
if (itPos->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_CLOSE_BODY].size() > 0) {
for(pos = itPos->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_CLOSE_BODY].begin();
pos != itPos->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_CLOSE_BODY].end();
++pos) {
code.append(*pos);
}
}
code.append("}\n\n");
}
return code;
}
/*
6.9 Function ~getGenCodeFunctionEval~
A ~get~-function returned a string with the generated ~c++-code~ of
the ~eval function~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeFunctionEval() {
std::string code = "";
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itPos;
for(itPos = genCodeNodes.begin(); itPos != genCodeNodes.end(); ++itPos) {
if (itPos->first.find("arglist_") == std::string::npos
&& itPos->first.find("identifier_") == std::string::npos) {
code.append("inline ");
std::vector<std::string>::iterator pos;
for(pos = itPos->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD].begin();
pos != itPos->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD].end();
++pos) {
code.append(*pos);
}
code.append(" {\n");
for(pos = itPos->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY].begin();
pos != itPos->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY].end();
++pos) {
code.append(*pos);
}
code.append("}\n\n");
}
}
return code;
}
/*
6.10 Function ~getGenCodeFunctionInit~
A ~get~-function returned a string with the generated ~c++-code~ of
the ~init function~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeFunctionInit() {
std::string code = "";
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itPos;
for(itPos = genCodeNodes.begin(); itPos != genCodeNodes.end(); ++itPos) {
code.append("inline bool ");
code.append(itPos->first);
code.append("::Init() {\n");
std::vector<std::string>::iterator pos;
for(pos = itPos->second[CE_VCG_DECLARATION_FUNC_INIT_BODY].begin();
pos != itPos->second[CE_VCG_DECLARATION_FUNC_INIT_BODY].end();
++pos) {
code.append(*pos);
}
code.append("}\n\n");
}
return code;
}
/*
6.11 Function ~getGenCodeFunctionOperator~
A ~get~-function returned a string with the generated ~c++-code~ of
the ~evalOpen- and evalRequest- function~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeFunctionOperator() {
std::string code = "";
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itPos;
for(itPos = genCodeNodes.begin(); itPos != genCodeNodes.end(); ++itPos) {
if (itPos->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD].size() > 0) {
code.append("inline ");
std::vector<std::string>::iterator pos;
for(pos = itPos->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD].begin();
pos != itPos->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD].end();
++pos) {
code.append(*pos);
}
code.append(" {\n");
for(pos = itPos->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_BODY].begin();
pos != itPos->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_BODY].end();
++pos) {
code.append(*pos);
}
code.append("}\n\n");
}
if (itPos->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD].size() > 0) {
code.append("inline ");
std::vector<std::string>::iterator pos;
for(pos = itPos->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD].begin();
pos != itPos->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD].end();
++pos) {
code.append(*pos);
}
code.append(" {\n");
for(pos = itPos->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_BODY].begin();
pos != itPos->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_BODY].end();
++pos) {
code.append(*pos);
}
code.append("}\n\n");
}
}
return code;
}
/*
6.12 Function ~getGenCodeDeclarationAdditionalFunction~
A ~get~-function returned a string with the generated ~c++-code~ of
the ~declaration of additional functions~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeDeclarationAdditionalFunction() {
std::string code = "";
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itPos;
for(itPos = genCodeNodes.begin(); itPos != genCodeNodes.end(); ++itPos) {
std::vector<std::string>::iterator pos;
for(pos = itPos->second
[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION].begin();
pos != itPos->second
[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION].end();
++pos) {
code.append(*pos);
}
}
return code;
}
/*
6.13 Function ~getGenCodeEvalDefaultFunction~
A ~get~-function returned a string with the generated ~c++-code~ of
the ~evalDefault function~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeEvalDefaultFunction() {
std::string code = "";
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itPos;
for(itPos = genCodeNodes.begin(); itPos != genCodeNodes.end(); ++itPos) {
code.append("inline Word ");
code.append(itPos->first);
code.append("::evalDefault() {\n");
if (itPos->first.find("arglist_") == std::string::npos
&& itPos->first.find("identifier_") == std::string::npos)
code.append("return SetWord(eval());\n");
else
code.append("Word w;\nreturn w;\n");
code.append("}\n\n");
}
return code;
}
/*
6.14 Function ~getGenCodeClassCECNodeDefault~
A ~get~-function returned a string with the generated ~c++-code~ of
the class ~CECNodeDefault~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeClassCECNodeDefault() {
std::string code = "";
code.append("class CECNodeDefault {\n");
code.append("public:\n");
code.append("CECNodeDefault() : ceNodeKey("") {};\n");
code.append("virtual ~CECNodeDefault() {\n");
code.append("sons.clear();\n");
code.append("}\n");
code.append("inline int getNumOfSons() {\n");
code.append("return sons.size();\n");
code.append("}\n");
code.append("inline CECNodeDefault*");
code.append(" getSon(const unsigned int sonPos) {\n");
code.append("CECNodeDefault* retValue = 0;\n");
code.append("if (sonPos < sons.size())\n");
code.append("retValue = sons[sonPos];\n");
code.append("return retValue;\n");
code.append("}\n");
code.append("virtual Word evalDefault() = 0;\n");
code.append("protected:\n");
code.append("std::vector<CECNodeDefault*> sons;\n");
code.append("std::string ceNodeKey;\n");
code.append("};\n\n");
return code;
}
/*
6.15 Function ~getGenCodeClassCECNodeApplyop~
A ~get~-function returned a string with the generated ~c++-code~ of
the class ~CECNodeApplyop~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeClassCECNodeApplyop() {
std::string code = "";
if (cecOpNodeApplyopIsInsert) {
code.append("class CECNodeApplyop : public CECNodeDefault {\n");
code.append("public:\n");
code.append("CECNodeApplyop() {};\n");
code.append("virtual ~CECNodeApplyop() {};\n");
code.append("};\n\n\n");
}
return code;
}
/*
6.16 Function ~getGenCodeClassCECNodeAbstraction~
A ~get~-function returned a string with the generated ~c++-code~ of
the class ~CECNodeAbstraction~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeClassCECNodeAbstraction() {
std::string code = "";
if (cecOpNodeAbstractionIsInsert) {
code.append("class CECNodeAbstraction : public CECNodeDefault {\n");
code.append("public:\n");
code.append("CECNodeAbstraction() {};\n");
code.append("virtual ~CECNodeAbstraction() {};\n");
code.append("virtual void setMapType(Word, unsigned int) = 0;\n");
code.append("};\n\n\n");
}
return code;
}
/*
6.17 Function ~getGenCodeClassCECNodeObject~
A ~get~-function returned a string with the generated ~c++-code~ of
the class ~CECNodeObject~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeClassCECNodeObject() {
std::string code = "";
if (cecOpNodeObjectIsInsert) {
code.append("class CECNodeObject : public CECNodeDefault {\n");
code.append("public:\n");
code.append("CECNodeObject() {};\n");
code.append("virtual ~CECNodeObject() {};\n");
code.append("};\n\n\n");
}
return code;
}
/*
6.18 Function ~getGenCodeClassCECNodeConstant~
A ~get~-function returned a string with the generated ~c++-code~ of
the class ~CECNodeConstant~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeClassCECNodeConstant() {
std::string code = "";
if (cecOpNodeConstantIsInsert) {
code.append("class CECNodeConstant : public CECNodeDefault {\n");
code.append("public:\n");
code.append("CECNodeConstant() {};\n");
code.append("virtual ~CECNodeConstant() {};\n");
code.append("};\n\n\n");
}
return code;
}
/*
6.19 Function ~getGenCodeClassCECNodeVariable~
A ~get~-function returned a string with the generated ~c++-code~ of
the class ~CECNodeVariable~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeClassCECNodeVariable() {
std::string code = "";
if (cecOpNodeVariableIsInsert) {
code.append("class CECNodeVariable : public CECNodeDefault {\n");
code.append("public:\n");
code.append("CECNodeVariable() {};\n");
code.append("virtual ~CECNodeVariable() {};\n");
code.append("};\n\n\n");
}
return code;
}
/*
6.20 Function ~getGenCodeClassCECNodeIdentifier~
A ~get~-function returned a string with the generated ~c++-code~ of
the class ~CECNodeIdentifier~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeClassCECNodeIdentifier() {
std::string code = "";
if (cecOpNodeIdentifierIsInsert) {
code.append("class CECNodeIdentifier : public CECNodeDefault {\n");
code.append("public:\n");
code.append("CECNodeIdentifier() {};\n");
code.append("virtual ~CECNodeIdentifier() {};\n");
code.append("};\n\n\n");
}
return code;
}
/*
6.21 Function ~getGenCodeClassCECNodeArglist~
A ~get~-function returned a string with the generated ~c++-code~ of
the class ~CECNodeArglist~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeClassCECNodeArglist() {
std::string code = "";
if (cecOpNodeArglistIsInsert) {
code.append("class CECNodeArglist : public CECNodeDefault {\n");
code.append("public:\n");
code.append("CECNodeArglist() {};\n");
code.append("virtual ~CECNodeArglist() {};\n");
code.append("};\n\n\n");
}
return code;
}
/*
6.22 Function ~getGenCodeCodeCompiledExpressionsDeclaration~
A ~get~-function returned a string with the generated ~c++-code~ of
the declaration of the class ~CodeCompiledExpressions~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeCodeCompiledExpressionsDeclaration()
{
bool foundAbstraction, foundApplyop;
std::string code = "";
code.append("class CodeCompiledExpressions {\n");
code.append("public:\n");
code.append("static CodeCompiledExpressions* getInstance();\n");
code.append("static bool Init(CEQuery*);\n");
code.append("static void CloseInstance();\n");
code.append("virtual ~CodeCompiledExpressions();\n");
code.append("CEQueryProcessor* getPtrCEQP();\n");
code.append("CEQuery* getPtrCEQY();\n");
std::map<std::string, std::string>::iterator itMapType;
for(itMapType = genCodeCCEGlobalVar.begin();
itMapType != genCodeCCEGlobalVar.end();
++itMapType) {
code.append("void setMapType_");
code.append(itMapType->first);
code.append("(");
code.append(itMapType->second);
code.append("*);\n");
code.append(itMapType->second);
code.append("* getMapType_");
code.append(itMapType->first);
code.append("();\n");
}
std::set<std::string>::iterator itPos;
for(itPos = genCodeCompExprRootNodes.begin();
itPos != genCodeCompExprRootNodes.end();
++itPos) {
code.append(*itPos);
code.append("* getNodePtr_");
code.append(*itPos);
code.append("();\n");
}
foundAbstraction = false;
foundApplyop = false;
for(itPos = genCodeCompExprRootNodes.begin();
itPos != genCodeCompExprRootNodes.end();
++itPos) {
if (!foundAbstraction
&& (*itPos).find("abstraction") != std::string::npos) {
code.append("void setGlobalTuple(Tuple&);\n");
code.append("Tuple* getPtrGlobalTuple();\n");
foundAbstraction = true;
}
if (!foundApplyop && (*itPos).find("applyop") != std::string::npos) {
code.append("void setGlobalResultStorage(Word&);\n");
code.append("Word* getPtrGlobalResultStorage();\n");
foundApplyop = true;
}
}
code.append("\nprivate:\n");
code.append("static CodeCompiledExpressions* instance;\n\n");
code.append("CEQuery* ptrCEQY;\n");
for(itPos = genCodeCompExprRootNodes.begin();
itPos != genCodeCompExprRootNodes.end();
++itPos) {
code.append(*itPos);
code.append("* ptr_");
code.append(*itPos);
code.append(";\n");
}
if (cecOpNodeAbstractionIsInsert) {
code.append("CECNodeAbstraction* ptrActivAbstraction;\n");
}
for(itMapType = genCodeCCEGlobalVar.begin();
itMapType != genCodeCCEGlobalVar.end();
++itMapType) {
code.append(itMapType->second);
code.append("* ptrMapType_");
code.append(itMapType->first);
code.append(";\n");
}
foundApplyop = false;
for(itPos = genCodeCompExprRootNodes.begin();
itPos != genCodeCompExprRootNodes.end();
++itPos) {
if (!foundApplyop && (*itPos).find("applyop") != std::string::npos) {
code.append("Word* ptrGlobalResultStorage;\n");
foundApplyop = true;
}
}
code.append("CodeCompiledExpressions() {};\n");
code.append("CodeCompiledExpressions(CEQuery*);\n");
code.append("};\n\n");
return code;
}
/*
6.23 Function ~getGenCodeCodeCompiledExpressionsDefinition~
A ~get~-function returned a string with the generated ~c++-code~ of
the definition of the class ~CodeCompiledExpressions~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeCodeCompiledExpressionsDefinition() {
std::string code = "";
code.append("CodeCompiledExpressions*");
code.append(" CodeCompiledExpressions::instance = 0;\n\n");
code.append("CodeCompiledExpressions::CodeCompiledExpressions");
code.append("(CEQuery* ceQY)\n");
code.append(":ptrCEQY(ceQY) {\n");
std::set<std::string>::iterator itPos;
for(itPos = genCodeCompExprRootNodes.begin();
itPos != genCodeCompExprRootNodes.end();
++itPos) {
code.append("ptr_");
code.append(*itPos);
code.append(" = new ");
code.append(*itPos);
code.append("();\n");
}
code.append("}\n\n");
code.append("CodeCompiledExpressions::~CodeCompiledExpressions() {\n");
for(itPos = genCodeCompExprRootNodes.begin();
itPos != genCodeCompExprRootNodes.end();
++itPos) {
code.append("if (ptr_");
code.append(*itPos);
code.append(")\ndelete ptr_");
code.append(*itPos);
code.append(";\nptr_");
code.append(*itPos);
code.append(" = 0;\n");
}
code.append("ptrCEQY = 0;\n");
code.append("}\n\n");
code.append("inline CodeCompiledExpressions*");
code.append(" CodeCompiledExpressions::getInstance() {\n");
code.append("return CodeCompiledExpressions::instance;\n");
code.append("}\n\n");
code.append("bool CodeCompiledExpressions::Init(CEQuery* ceQY) {\n");
code.append("bool retValue = true;\n");
code.append("CodeCompiledExpressions::instance =");
code.append(" new CodeCompiledExpressions(ceQY);\n");
code.append("if (!CodeCompiledExpressions::instance)\n");
code.append("retValue = false;\n");
for(itPos = genCodeCompExprRootNodes.begin();
itPos != genCodeCompExprRootNodes.end();
++itPos) {
code.append("retValue = retValue");
code.append(" && CodeCompiledExpressions::instance->getNodePtr_");
code.append(*itPos);
code.append("()->Init();\n");
}
code.append("return retValue;\n");
code.append("}\n\n");
code.append("void CodeCompiledExpressions::CloseInstance() {\n");
code.append("if (CodeCompiledExpressions::instance)\n");
code.append("delete CodeCompiledExpressions::instance;\n");
code.append("CodeCompiledExpressions::instance = 0;\n");
code.append("}\n\n");
code.append("inline CEQueryProcessor*");
code.append(" CodeCompiledExpressions::getPtrCEQP() {\n");
code.append("return ptrCEQY->getPtrCEQP();\n");
code.append("}\n\n");
code.append("inline CEQuery* CodeCompiledExpressions::getPtrCEQY() {\n");
code.append("return ptrCEQY;\n");
code.append("}\n\n");
for(itPos = genCodeCompExprRootNodes.begin();
itPos != genCodeCompExprRootNodes.end();
++itPos) {
code.append("inline ");
code.append(*itPos);
code.append("* CodeCompiledExpressions::getNodePtr_");
code.append(*itPos);
code.append("() {\n");
code.append("return ptr_");
code.append(*itPos);
code.append(";\n");
code.append("}\n\n");
}
std::map<std::string, std::string>::iterator itMapType;
for(itMapType = genCodeCCEGlobalVar.begin();
itMapType != genCodeCCEGlobalVar.end();
++itMapType) {
code.append("inline void CodeCompiledExpressions::setMapType_");
code.append(itMapType->first);
code.append("(");
code.append(itMapType->second);
code.append("* arg) {\n");
code.append("ptrMapType_");
code.append(itMapType->first);
code.append(" = arg;\n");
code.append("}\n\n");
code.append("inline ");
code.append(itMapType->second);
code.append("* CodeCompiledExpressions::getMapType_");
code.append(itMapType->first);
code.append("() {\n");
code.append("return ptrMapType_");
code.append(itMapType->first);
code.append(";\n");
code.append("}\n\n");
}
bool foundApplyop = false;
for(itPos = genCodeCompExprRootNodes.begin();
itPos != genCodeCompExprRootNodes.end();
++itPos) {
if (!foundApplyop && (*itPos).find("applyop") != std::string::npos) {
code.append("inline void");
code.append(" CodeCompiledExpressions::setGlobalResultStorage");
code.append(" (Word& result) {\n");
code.append("ptrGlobalResultStorage = &result;\n");
code.append("}\n\n");
code.append("inline Word*");
code.append(" CodeCompiledExpressions::getPtrGlobalResultStorage");
code.append("() {\n");
code.append("return ptrGlobalResultStorage;\n");
code.append("}\n\n");
foundApplyop = true;
}
}
return code;
}
/*
6.24 Function ~getGenCodeLibCallFunction~
A ~get~-function returned a string with the generated ~c++-code~ of
the the ~external library call functions section~.
*/
std::string
CECOpTreeVisitorGenerateCode::getGenCodeLibCallFunction() {
std::string code = "";
code.append("#ifdef __cplusplus\n");
code.append("extern \"C\" {\n");
code.append("#endif\n\n");
std::map<std::string, std::string>::iterator pos;
for(pos = operators_libcall_function.begin();
pos != operators_libcall_function.end();
++pos) {
code.append(pos->first);
code.append(pos->second);
code.append("\n");
}
code.append("#ifdef __cplusplus\n");
code.append("}\n");
code.append("#endif\n\n");
return code;
}
/*
6.25 Function ~insertCommaInCodeVector~
This function adds commas to lists of arguments, parameters or similar in the
source code to be generated.
*/
void
CECOpTreeVisitorGenerateCode::insertCommaInCodeVector
(int startPos,
int actualPos,
std::vector<std::string>(&codeVector)) {
int commaPos = actualPos + 1;
bool setComma = false;
while (!setComma && actualPos >= startPos) {
if (codeVector.at(actualPos).length() > 0) {
codeVector.at(commaPos) = ", ";
setComma = true;
}
actualPos = actualPos - 2;
}
}
/*
6.26 Function ~initGenCodeNodesEntry~
This function initialized the data structure of code segments for a new node in
the ~operator tree~ and return a iterator of this structure.
*/
std::map<std::string, std::vector<std::vector<std::string> > >::iterator
CECOpTreeVisitorGenerateCode::initGenCodeNodesEntry(std::string strNodeKey,
unsigned int numSons) {
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itTestInsertMap;
itTestInsertMap = genCodeNodes.find(strNodeKey);
if (itTestInsertMap == genCodeNodes.end()) {
std::vector<std::vector<std::string> > codeClassNode(CE_VCG_CT_SIZEOF);
genCodeNodes[strNodeKey] = codeClassNode;
}
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itMap;
itMap = genCodeNodes.find(strNodeKey);
std::vector<std::string> ceSuperClass(1);
itMap->second[CE_VCG_SUPERCLASS] = ceSuperClass;
std::vector<std::string> ceDefinitionVariables(numSons + 1);
itMap->second[CE_VCG_DEFINITATION_VAR] = ceDefinitionVariables;
std::vector<std::string> ceDefinitionAdditionalVariables(numSons + 1);
itMap->second[CE_VCG_DEFINITATION_ADDITIONAL_VAR] =
ceDefinitionAdditionalVariables;
std::vector<std::string> ceDefinitionFuncGetSonNode(numSons);
itMap->second[CE_VCG_DEFINITATION_FUNC_GET_SON_NODE] =
ceDefinitionFuncGetSonNode;
std::vector<std::string> ceDefinitionFuncEval(1);
itMap->second[CE_VCG_DEFINITATION_FUNC_EVAL] = ceDefinitionFuncEval;
std::vector<std::string> ceDefinitionFuncOperatorEvalOpen(0);
itMap->second[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_OPEN] =
ceDefinitionFuncOperatorEvalOpen;
std::vector<std::string> ceDefinitionFuncOperatorEvalRequest(0);
itMap->second[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_REQUEST] =
ceDefinitionFuncOperatorEvalRequest;
std::vector<std::string> ceDefinitionAdditionalFunction(0);
itMap->second[CE_VCG_DEFINITATION_ADDITIONAL_FUNCTION] =
ceDefinitionAdditionalFunction;
std::vector<std::string> ceDeclarationContructorBody(numSons + 3);
itMap->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY] =
ceDeclarationContructorBody;
std::vector<std::string> ceDeclarationDestructorBody(numSons + 1);
itMap->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY] =
ceDeclarationDestructorBody;
std::vector<std::string> ceDeclarationFuncInitBody(3 * numSons + 3);
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY] =
ceDeclarationFuncInitBody;
std::vector<std::string> ceDeclarationFuncEvalHead(1);
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD] =
ceDeclarationFuncEvalHead;
std::vector<std::string> ceDeclarationFuncEvalBody(2 * numSons + 2);
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY] =
ceDeclarationFuncEvalBody;
std::vector<std::string> ceDeclarationFuncOperatorEvalOpenHead(0);
itMap->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD] =
ceDeclarationFuncOperatorEvalOpenHead;
std::vector<std::string> ceDeclarationFuncOperatorEvalOpenBody(0);
itMap->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_BODY] =
ceDeclarationFuncOperatorEvalOpenBody;
std::vector<std::string> ceDeclarationFuncOperatorEvalRequestHead(0);
itMap->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD] =
ceDeclarationFuncOperatorEvalRequestHead;
std::vector<std::string> ceDeclarationFuncOperatorEvalRequestBody(0);
itMap->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_BODY] =
ceDeclarationFuncOperatorEvalRequestBody;
std::vector<std::string> ceDeclarationFuncOperatorEvalCloseBody(0);
itMap->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_CLOSE_BODY] =
ceDeclarationFuncOperatorEvalCloseBody;
std::vector<std::string> ceDeclarationAdditionalFunction(0);
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION] =
ceDeclarationAdditionalFunction;
return itMap;
}
/*
6.27 Function ~completeGenCodeFatherNodeEntry~
This function completes the code segments for the father node ~ceNode~
in the operator tree.
*/
void
CECOpTreeVisitorGenerateCode::completeGenCodeFatherNodeEntry
(CECOpNode& ceNode) {
int posSons = ceNode.getSonsPosition();
if (posSons >= 0) {
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itFatherNode;
itFatherNode = genCodeNodes.find(ceNode.getPtrFatherNode()
->getStrNodeKey());
if (itFatherNode != genCodeNodes.end()) {
itFatherNode->second[CE_VCG_DEFINITATION_VAR]
.at(posSons).append(ceNode.getStrNodeKey());
itFatherNode->second[CE_VCG_DEFINITATION_VAR]
.at(posSons).append("* ptr_");
itFatherNode->second[CE_VCG_DEFINITATION_VAR]
.at(posSons).append(ceNode.getStrNodeKey());
itFatherNode->second[CE_VCG_DEFINITATION_VAR]
.at(posSons).append(";\n");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(posSons + 2).append("ptr_");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(posSons + 2).append(ceNode.getStrNodeKey());
itFatherNode->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(posSons + 2).append(" = new ");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(posSons + 2).append(ceNode.getStrNodeKey());
itFatherNode->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(posSons + 2).append("();\n");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(posSons + 2).append("sons.push_back(ptr_");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(posSons + 2).append(ceNode.getStrNodeKey());
itFatherNode->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(posSons + 2).append(");\n");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY]
.at(posSons).append("if (ptr_");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY]
.at(posSons).append(ceNode.getStrNodeKey());
itFatherNode->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY]
.at(posSons).append(")\ndelete ptr_");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY]
.at(posSons).append(ceNode.getStrNodeKey());
itFatherNode->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY]
.at(posSons).append(";\nptr_");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY]
.at(posSons).append(ceNode.getStrNodeKey());
itFatherNode->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY]
.at(posSons).append(" = 0;\n");
itFatherNode->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(posSons).append("\n&& ptr_");
itFatherNode->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(posSons).append(ceNode.getStrNodeKey());
itFatherNode->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(posSons).append("->Init()");
if (itFatherNode->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(ceNode.getPtrFatherNode()->getNumSons() + 1)
.find("&& EvalOpen(") != std::string::npos) {
if (posSons > 1) {
insertCommaInCodeVector
(ceNode.getPtrFatherNode()->getNumSons() + 2,
ceNode.getPtrFatherNode()->getNumSons() + 2 * posSons - 2,
itFatherNode->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]);
}
itFatherNode->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(ceNode.getPtrFatherNode()->getNumSons()
+ 2 * posSons)
.append("ptr_");
itFatherNode->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(ceNode.getPtrFatherNode()->getNumSons()
+ 2 * posSons)
.append(ceNode.getStrNodeKey());
}
if (itFatherNode->second[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_OPEN]
.size() > 0) {
if (posSons > 1) {
insertCommaInCodeVector
(1,
2 * (posSons - 1) - 1,
itFatherNode->second
[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_OPEN]);
}
itFatherNode->second[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_OPEN]
.at(2 * (posSons - 1) + 1)
.append(ceNode.getStrNodeKey());
itFatherNode->second[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_OPEN]
.at(2 * (posSons - 1) + 1).append("*");
}
if (itFatherNode->second[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_REQUEST]
.size() > 0) {
if (posSons > 1) {
insertCommaInCodeVector
(1,
2 * (posSons - 1) - 1,
itFatherNode->second
[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_REQUEST]);
}
itFatherNode->second[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_REQUEST]
.at(2 * (posSons - 1) + 1)
.append(ceNode.getStrNodeKey());
itFatherNode->second[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_REQUEST]
.at(2 * (posSons - 1) + 1).append("*");
}
if (itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD]
.size() > 0) {
if (posSons > 1) {
insertCommaInCodeVector
(1,
2 * (posSons - 1) - 1,
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD]
);
}
itFatherNode->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD]
.at(2 * (posSons - 1) + 1)
.append(ceNode.getStrNodeKey());
itFatherNode->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD]
.at(2 * (posSons - 1) + 1).append("* arg_");
}
if (itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD]
.size() > 0) {
if (posSons > 1) {
insertCommaInCodeVector
(1,
2 * (posSons - 1) - 1,
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD]);
}
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD]
.at(2 * (posSons - 1) + 1)
.append(ceNode.getStrNodeKey());
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD]
.at(2 * (posSons - 1) + 1)
.append("* arg_");
}
if (itFatherNode->first.find("applyop") != std::string::npos
|| itFatherNode->first.find("abstraction") != std::string::npos) {
if (posSons > 1) {
insertCommaInCodeVector
(2,
2 * (posSons - 1),
itFatherNode->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]);
}
itFatherNode->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(2 * (posSons - 1) + 2).append("ptr_");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(2 * (posSons - 1) + 2)
.append(ceNode.getStrNodeKey());
if (itFatherNode->first.find("abstraction") != std::string::npos) {
itFatherNode->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(2 * (posSons - 1) + 2).append("->eval()");
}
}
}
}
}
/*
6.27 Functions ~visit~
The following functions implement the visitor's behavior for each node type of the operator tree.
These functions implement the abstract functions of the base class ~CECOpTreeVisitor~.
*/
void
CECOpTreeVisitorGenerateCode::visit(CECOpNode& ceNode) {
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodeOperator& ceNode) {
std::vector<CECGImplSecondoType*> localSignatureVector
= ceNode.getSignatureVector();
int posSons = ceNode.getSonsPosition();
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itFatherNode;
itFatherNode = genCodeNodes.find
(ceNode.getPtrFatherNode()->getStrNodeKey());
if (itFatherNode != genCodeNodes.end()) {
if (ceNode.getPtrCodeStoreOperator()->isStreamOperator()) {
itFatherNode->second[CE_VCG_DEFINITATION_ADDITIONAL_VAR]
.at(posSons).append(
ceNode.getPtrCodeStoreOperator()
->getCodeOperatorAdditionalVariablesDefinition()
);
itFatherNode->second
[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_OPEN]
.resize(2 * ceNode.getPtrFatherNode()->getNumSons() + 1);
itFatherNode->second
[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_OPEN]
.at(0).append("bool EvalOpen(");
itFatherNode->second
[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_OPEN]
.at(2 * ceNode.getPtrFatherNode()->getNumSons())
.append(");\n");
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(posSons + 2).append(
ceNode.getPtrCodeStoreOperator()
->getCodeOperatorAdditionalVariablesInitialisation()
);
itFatherNode->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY]
.at(posSons).append(
ceNode.getPtrCodeStoreOperator()->getCodeOperatorEvalCloseBody()
);
itFatherNode->second
[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(ceNode.getPtrFatherNode()->getNumSons() + 1)
.append("retValue = retValue && EvalOpen(");
itFatherNode->second
[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(3 * ceNode.getPtrFatherNode()->getNumSons() + 1)
.append(");\n");
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD]
.resize(2 * ceNode.getPtrFatherNode()->getNumSons() + 1);
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD]
.at(0).append("bool ");
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD]
.at(0)
.append(ceNode.getPtrFatherNode()->getStrNodeKey());
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD]
.at(0).append("::EvalOpen(");
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_HEAD]
.at(2 * ceNode.getPtrFatherNode()->getNumSons())
.append(")");
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_BODY]
.resize(1);
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_OPEN_BODY]
.at(0).append
(ceNode.getPtrCodeStoreOperator()
->getCodeOperatorEvalOpenBody());
}
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_BODY]
.resize(1);
itFatherNode->second
[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_BODY]
.at(0).append
(ceNode.getPtrCodeStoreOperator()
->getCodeOperatorEvalRequestBody
(localSignatureVector)
);
if (ceNode.getPtrCodeStoreOperator()->isGenerateNewObject()) {
itFatherNode->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(0).append("new ");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(2).append("(false);\n");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY]
.at(0).append("if (resultStorage)\n");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY]
.at(0).append("resultStorage->DeleteIfAllowed();\n");
} else {
itFatherNode->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(0).append("0;\n");
itFatherNode->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(1) = "";
}
}
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodeApplyop& ceNode) {
cecOpNodeApplyopIsInsert = true;
ceNode.getPtrCodeStoreType()->getHeaderFilesEntry(headerfiles);
bool localUseSubType =
(ceNode.getPtrCodeStoreType()->getTypeName() == "stream");
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itMap;
itMap = initGenCodeNodesEntry(ceNode.getStrNodeKey(), ceNode.getNumSons());
itMap->second[CE_VCG_SUPERCLASS].at(0).append("CECNodeApplyop");
if (localUseSubType)
itMap->second[CE_VCG_DEFINITATION_VAR].at(0)
.append(ceNode.getPtrSubCodeStoreType()->getTypeClassName());
else
itMap->second[CE_VCG_DEFINITATION_VAR].at(0)
.append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VCG_DEFINITATION_VAR].at(0).append("* resultStorage;\n");
if (localUseSubType)
itMap->second[CE_VCG_DEFINITATION_FUNC_EVAL].at(0)
.append(ceNode.getPtrSubCodeStoreType()->getTypeClassName());
else
itMap->second[CE_VCG_DEFINITATION_FUNC_EVAL].at(0)
.append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VCG_DEFINITATION_FUNC_EVAL].at(0).append("* eval();\n");
itMap->second[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_REQUEST]
.resize(2 * ceNode.getNumSons() + 1);
itMap->second[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_REQUEST]
.at(0).append("void EvalRequest(");
itMap->second[CE_VCG_DEFINITATION_FUNC_OPERATOR_EVAL_REQUEST]
.at(2 * ceNode.getNumSons()).append(");\n");
itMap->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(0).append("resultStorage = ");
itMap->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(1).append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append("bool retValue = true");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(ceNode.getNumSons() + 1).append(";\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(3 * ceNode.getNumSons() + 2).append("return retValue;\n");
if (localUseSubType)
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0)
.append(ceNode.getPtrSubCodeStoreType()->getTypeClassName());
else
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0)
.append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append("* ");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append(itMap->first);
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append("::eval()");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(1).append("EvalRequest(");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(2 * ceNode.getNumSons() + 1).append(");\n");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(2 * ceNode.getNumSons() + 1)
.append("return resultStorage;\n");
itMap->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD]
.resize(2 * ceNode.getNumSons() + 1);
itMap->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD]
.at(0).append("void ");
itMap->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD]
.at(0).append(itMap->first);
itMap->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD]
.at(0).append("::EvalRequest(");
itMap->second[CE_VGC_DECLARATION_FUNC_OPERATOR_EVAL_REQUEST_HEAD]
.at(2 * ceNode.getNumSons()).append(")");
completeGenCodeFatherNodeEntry(ceNode);
if (ceNode.getIsCERootNode(true)) {
genCodeCompExprRootNodes.insert(itMap->first);
itMap->second[CE_VCG_DEFINITATION_VAR].at(0).append("Supplier sup;\n");
itMap->second[CE_VCG_DEFINITATION_ADDITIONAL_FUNCTION].resize(1);
itMap->second[CE_VCG_DEFINITATION_ADDITIONAL_FUNCTION]
.at(0).append("void setSupplier(Supplier);\n");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION].resize(1);
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("void ");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append(itMap->first);
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("::setSupplier(Supplier s) {\n");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("sup = s;\n");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("}\n\n");
std::string function_head = "void ";
function_head.append
(ceNode.getInstCEGenerateFunctionStatus()
->getCallLibFunctionName());
function_head.append("(Word& result, Supplier s)");
std::string code = " {\n";
code.append("CodeCompiledExpressions::getInstance()->getNodePtr_");
code.append(itMap->first);
code.append("()->setSupplier(s);\n");
code.append(ceNode.getPtrCodeStoreType()->getTypeClassName());
code.append("* retValue = CodeCompiledExpressions::getInstance()");
code.append("->getNodePtr_");
code.append(itMap->first);
code.append("()->eval();\n");
code.append("result.setAddr(retValue);\n}\n");
operators_libcall_function[function_head] = code;
}
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodeAbstraction& ceNode) {
cecOpNodeAbstractionIsInsert = true;
std::vector<CECGImplSecondoType*> ptrCodeStoreTypes
= ceNode.getVectorPtrCodeStoreTypes();
for (unsigned int i = 0; i < ptrCodeStoreTypes.size(); i++)
ptrCodeStoreTypes[i]->getHeaderFilesEntry(headerfiles);
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itMap;
itMap = initGenCodeNodesEntry(ceNode.getStrNodeKey(),
ceNode.getNumSons());
itMap->second[CE_VCG_SUPERCLASS].at(0).append("CECNodeAbstraction");
itMap->second[CE_VCG_DEFINITATION_VAR]
.at(0)
.append(ptrCodeStoreTypes[ptrCodeStoreTypes.size() - 1]
->getTypeClassName());
itMap->second[CE_VCG_DEFINITATION_VAR].at(0)
.append("* resultStorage;\n");
for (unsigned int idx = 0; idx <= ptrCodeStoreTypes.size() - 2; idx++) {
itMap->second[CE_VCG_DEFINITATION_VAR].at(0)
.append(ptrCodeStoreTypes[idx]->getTypeClassName());
itMap->second[CE_VCG_DEFINITATION_VAR].at(0)
.append("* ptrLocalMapType_");
std::stringstream ss;
ss << idx + 1;
itMap->second[CE_VCG_DEFINITATION_VAR].at(0).append(ss.str());
itMap->second[CE_VCG_DEFINITATION_VAR].at(0).append(";\n");
}
itMap->second[CE_VCG_DEFINITATION_FUNC_EVAL]
.at(0)
.append(ptrCodeStoreTypes[ptrCodeStoreTypes.size() - 1]
->getTypeClassName());
itMap->second[CE_VCG_DEFINITATION_FUNC_EVAL].at(0).append("* eval();\n");
itMap->second[CE_VCG_DEFINITATION_ADDITIONAL_FUNCTION].resize(1);
itMap->second[CE_VCG_DEFINITATION_ADDITIONAL_FUNCTION].at(0)
.append("void setMapType(Word, unsigned int);\n");
for (unsigned int idx = 0; idx <= ptrCodeStoreTypes.size() - 2; idx++) {
std::stringstream ss;
ss << idx + 1;
itMap->second[CE_VCG_DEFINITATION_ADDITIONAL_FUNCTION]
.at(0).append("void setMapType_");
itMap->second[CE_VCG_DEFINITATION_ADDITIONAL_FUNCTION]
.at(0).append(ss.str());
itMap->second[CE_VCG_DEFINITATION_ADDITIONAL_FUNCTION]
.at(0).append("(");
itMap->second[CE_VCG_DEFINITATION_ADDITIONAL_FUNCTION]
.at(0).append(ptrCodeStoreTypes[idx]->getTypeClassName());
itMap->second[CE_VCG_DEFINITATION_ADDITIONAL_FUNCTION]
.at(0).append("*);\n");
}
itMap->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY]
.at(0).append("resultStorage = 0;\n");
itMap->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY]
.at(0).append("resultStorage = 0;\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append("bool retValue = true");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(ceNode.getNumSons() + 1).append(";\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(3 * ceNode.getNumSons() + 2).append("return retValue;\n");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0)
.append(ptrCodeStoreTypes[ptrCodeStoreTypes.size() - 1]
->getTypeClassName());
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append("* ");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append(itMap->first);
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append("::eval()");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(1).append("resultStorage = ");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(2 * ceNode.getNumSons() + 1).append(";\n");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(2 * ceNode.getNumSons() + 1)
.append("return resultStorage;\n");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION].resize(1);
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("inline void ");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append(itMap->first);
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0)
.append("::setMapType(Word wordMapType, unsigned int idx) {\n");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("switch (idx) {\n");
for (unsigned int idx = 1; idx <= ptrCodeStoreTypes.size() - 1; idx++) {
std::stringstream ss;
ss << idx;
std::string strArgIdx = ss.str();
std::string strMapTypePosition = "";
strMapTypePosition.append(ceNode.getStrFunctionNo());
strMapTypePosition.append("_");
strMapTypePosition.append(strArgIdx);
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("case ");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append(strArgIdx);
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append(":\n{\n");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append(ptrCodeStoreTypes[idx-1]->getTypeClassName());
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("* mapType = (");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append(ptrCodeStoreTypes[idx-1]->getTypeClassName());
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("*) wordMapType.addr;\n");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("setMapType_");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append(strArgIdx);
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("(mapType);\n");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("break;\n");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("}\n");
}
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("}\n}\n\n");
for (unsigned int idx = 0; idx <= ptrCodeStoreTypes.size() - 2; idx++) {
std::stringstream ss;
ss << idx + 1;
std::string strArgIdx = ss.str();
std::string strMapTypePosition = "";
strMapTypePosition.append(ceNode.getStrFunctionNo());
strMapTypePosition.append("_");
strMapTypePosition.append(strArgIdx);
genCodeCCEGlobalVar[strMapTypePosition]
= ptrCodeStoreTypes[idx]->getTypeClassName();
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("inline void ");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append(itMap->first);
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("::setMapType_");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append(strArgIdx);
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("(");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append(ptrCodeStoreTypes[idx]->getTypeClassName());
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("* mapType) {\n");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0)
.append("CodeCompiledExpressions::getInstance()->setMapType_");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append(strMapTypePosition);
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("(mapType);\n");
itMap->second[CE_VGC_DECLARATION_ADDITIONAL_FUNCTION]
.at(0).append("}\n\n");
}
completeGenCodeFatherNodeEntry(ceNode);
if (ceNode.getIsCERootNode(true)) {
genCodeCompExprRootNodes.insert(itMap->first);
std::string function_head;
if ((ceNode.getInstCEGenerateFunctionStatus()->getCallLibFunctionName())
.find("filterFunction") != std::string::npos) {
function_head = "bool ";
} else {
function_head = ptrCodeStoreTypes[1]->getTypeClassName();
function_head.append("* ");
}
function_head.append
(ceNode.getInstCEGenerateFunctionStatus()
->getCallLibFunctionName());
function_head.append("(");
function_head.append(ptrCodeStoreTypes[0]->getTypeClassName());
function_head.append("* inputTuple)");
std::string code = " {\n";
code.append("CodeCompiledExpressions::getInstance()->getNodePtr_");
code.append(itMap->first);
code.append("()->setMapType_1(inputTuple);\n");
if ((ceNode.getInstCEGenerateFunctionStatus()->getCallLibFunctionName())
.find("filterFunction") != std::string::npos) {
code.append(ptrCodeStoreTypes[1]->getTypeClassName());
code.append("* attrBool = CodeCompiledExpressions::getInstance()");
code.append("->getNodePtr_");
code.append(itMap->first);
code.append("()->eval();\n");
code.append("if (attrBool->IsDefined())\n");
code.append("return attrBool->GetBoolval();\n");
code.append("else\n");
code.append("return false;\n");
} else {
code.append("return CodeCompiledExpressions::getInstance()");
code.append("->getNodePtr_");
code.append(itMap->first);
code.append("()->eval();\n");
}
code.append("}\n");
operators_libcall_function[function_head] = code;
}
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodeObject& ceNode) {
cecOpNodeObjectIsInsert = true;
ceNode.getPtrCodeStoreType()->getHeaderFilesEntry(headerfiles);
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itMap;
itMap = initGenCodeNodesEntry(ceNode.getStrNodeKey(),
ceNode.getNumSons());
itMap->second[CE_VCG_SUPERCLASS].at(0).append("CECNodeObject");
itMap->second[CE_VCG_DEFINITATION_VAR].at(0)
.append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VCG_DEFINITATION_VAR].at(0)
.append("* resultStorage;\n");
itMap->second[CE_VCG_DEFINITATION_FUNC_EVAL].at(0)
.append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VCG_DEFINITATION_FUNC_EVAL].at(0).append("* eval();\n");
itMap->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY].at(0)
.append("resultStorage = 0;\n");
itMap->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY].at(0)
.append("resultStorage = 0;\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append("bool retValue;\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append("resultStorage = (");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0)
.append("*)(CodeCompiledExpressions::getInstance()");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0)
.append("->getPtrCEQP()->getQPValues(");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append(ceNode.getQPValueIdx());
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append(")).addr;\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append("if (!resultStorage)\nretValue = false;\nelse\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append("retValue = true");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(ceNode.getNumSons() + 1).append(";\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(3 * ceNode.getNumSons() + 2).append("return retValue;\n");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append("* ");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append(itMap->first);
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append("::eval()");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(0).append("return resultStorage;\n");
completeGenCodeFatherNodeEntry(ceNode);
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodeConstant& ceNode) {
cecOpNodeConstantIsInsert = true;
ceNode.getPtrCodeStoreType()->getHeaderFilesEntry(headerfiles);
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itMap;
itMap = initGenCodeNodesEntry(ceNode.getStrNodeKey(),
ceNode.getNumSons());
itMap->second[CE_VCG_SUPERCLASS].at(0).append("CECNodeConstant");
itMap->second[CE_VCG_DEFINITATION_VAR].at(0)
.append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VCG_DEFINITATION_VAR].at(0)
.append("* resultStorage;\n");
itMap->second[CE_VCG_DEFINITATION_FUNC_EVAL].at(0)
.append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VCG_DEFINITATION_FUNC_EVAL].at(0)
.append("* eval();\n");
itMap->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY].at(0)
.append("resultStorage = 0;\n");
itMap->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY].at(0)
.append("if (resultStorage)\nresultStorage->DeleteIfAllowed();\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append("bool retValue;\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append("resultStorage = (");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0)
.append("*)(CodeCompiledExpressions::getInstance()");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0)
.append("->getPtrCEQP()->getQPValues(");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append(ceNode.getQPValueIdx());
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append(")).addr;\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append("if (!resultStorage)\nretValue = false;\nelse\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append("retValue = resultStorage->IsDefined()");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(ceNode.getNumSons() + 1).append(";\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(3 * ceNode.getNumSons() + 2).append("return retValue;\n");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD].
at(0).append("* ");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append(itMap->first);
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append("::eval()");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(0).append("return resultStorage;\n");
completeGenCodeFatherNodeEntry(ceNode);
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodeVariable& ceNode) {
cecOpNodeVariableIsInsert = true;
ceNode.getPtrCodeStoreType()->getHeaderFilesEntry(headerfiles);
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itMap;
itMap = initGenCodeNodesEntry(ceNode.getStrNodeKey(),
ceNode.getNumSons());
itMap->second[CE_VCG_SUPERCLASS].at(0).append("CECNodeVariable");
itMap->second[CE_VCG_DEFINITATION_VAR].at(0)
.append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VCG_DEFINITATION_VAR].at(0)
.append("* resultStorage;\n");
itMap->second[CE_VCG_DEFINITATION_FUNC_EVAL].at(0)
.append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VCG_DEFINITATION_FUNC_EVAL].at(0)
.append("* eval();\n");
itMap->second[CE_VGC_DECLARATION_FUNC_CONSTRUCTOR_BODY].at(0)
.append("resultStorage = 0;\n");
itMap->second[CE_VGC_DECLARATION_FUNC_DESTRUCTOR_BODY].at(0)
.append("resultStorage = 0;\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append("bool retValue = true");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(ceNode.getNumSons() + 1).append(";\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(3 * ceNode.getNumSons() + 2).append("return retValue;\n");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append(ceNode.getPtrCodeStoreType()->getTypeClassName());
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append("* ");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append(itMap->first);
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_HEAD]
.at(0).append("::eval()");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(0).append("resultStorage = ");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(0).append("CodeCompiledExpressions::getInstance()");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(0).append("->getMapType_");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(0).append(ceNode.getStrVarPosition());
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(0).append("();\n");
itMap->second[CE_VGC_DECLARATION_FUNC_EVAL_BODY]
.at(0).append("return resultStorage;\n");
completeGenCodeFatherNodeEntry(ceNode);
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodeIdentifier& ceNode) {
cecOpNodeIdentifierIsInsert = true;
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itMap;
itMap = initGenCodeNodesEntry(ceNode.getStrNodeKey(), ceNode.getNumSons());
itMap->second[CE_VCG_SUPERCLASS].at(0).append("CECNodeIdentifier");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append("bool retValue = true");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(ceNode.getNumSons() + 1).append(";\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(3 * ceNode.getNumSons() + 2).append("return retValue;\n");
completeGenCodeFatherNodeEntry(ceNode);
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodeArglist& ceNode) {
cecOpNodeArglistIsInsert = true;
std::map<std::string,
std::vector<std::vector<std::string> > >::iterator itMap;
itMap = initGenCodeNodesEntry(ceNode.getStrNodeKey(), ceNode.getNumSons());
itMap->second[CE_VCG_SUPERCLASS].at(0).append("CECNodeArglist");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(0).append("bool retValue = true");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(ceNode.getNumSons() + 1).append(";\n");
itMap->second[CE_VCG_DECLARATION_FUNC_INIT_BODY]
.at(3 * ceNode.getNumSons() + 2).append("return retValue;\n");
completeGenCodeFatherNodeEntry(ceNode);
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodeFunction& ceNode) {
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodeApplyabs& ceNode) {
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodeApplyfun& ceNode) {
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodeCounterdef& ceNode) {
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodePointer& ceNode) {
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodePredinfodef& ceNode) {
}
void
CECOpTreeVisitorGenerateCode::visit(CECOpNodeMemorydef& ceNode) {
}
/*
6.28 Functions ~createCELibDefaultFunc~
This function generated ~c++~-code of the the external library
call functions ~initCompiledExpressionsLib~ and ~closeCompiledExpressionsLib~.
*/
void
CECOpTreeVisitorGenerateCode::createCELibDefaultFunc() {
std::string function_head_init
= "bool initCompiledExpressionsLib(CEQuery* ceQY)";
std::string code_init = " {\n";
code_init.append("if (ceQY)\n");
code_init.append("return CodeCompiledExpressions::Init(ceQY);\n");
code_init.append("else\n");
code_init.append("return false;\n");
code_init.append("}\n");
operators_libcall_function[function_head_init] = code_init;
std::string function_head_close = "void closeCompiledExpressionsLib()";
std::string code_close = " {\n";
code_close.append("CodeCompiledExpressions::CloseInstance();\n");
code_close.append("}\n");
operators_libcall_function[function_head_close] = code_close;
}
} // end of namespace CompiledExpressions
/*
7 External call functions
*/
#ifdef __cplusplus
extern "C"{
#endif
/*
7.1 Function ~FuncCECGSetCanInitImplCodeStore~
This external call function calls the ~setCanInitialize~-function from
the ~CECodeGenerator~-Instance, with which a flag is set, which indicates that
the ~Secondo System~ has been started so far that the ~Code Store~ can
be initialized.
*/
void
FuncCECGSetCanInitImplCodeStore() {
CECodeGenerator::setCanInitialize();
}
#ifdef __cplusplus
}
#endif