PhoenixGenerator  2.6.4
Set of tools to generate code
Loading...
Searching...
No Matches
generator_class_cpp.h File Reference
#include "ProjectParam.h"
+ Include dependency graph for generator_class_cpp.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

PString class_getClassDefTemplate (const PVecString &listTemplate)
 Get the template call in the class declaration.
 
bool generator_class_cpp (const PTraitBackendManager &manager, const std::vector< PClassConfig > &vecClassConfig, const PPath &outputSourceDir, const PPath &baseFileName, const GeneratorMode &mode, const PVecPath &vecInclude)
 Creates header and source files.
 
void generator_class_cpp_header (const PTraitBackendManager &manager, std::ofstream &fs, const PClassConfig &classConfig, const GeneratorMode &mode)
 Create the declaration of the given class.
 
void generator_class_cpp_source (const PTraitBackendManager &manager, std::ofstream &fs, const PClassConfig &classConfig, const GeneratorMode &mode)
 Create the implementation of the given class.
 
bool generator_class_cpp_test (const PTraitBackendManager &manager, const PPath &outputTestDir, const std::vector< PClassConfig > &vecClassConfig, const PString &projectName, const PPath &baseFileName, const GeneratorMode &mode)
 Save the unit test of the generated PClassConfig.
 
bool generator_class_full (const PTraitBackendManager &manager, const ProjectParam &projectParam)
 Generate the full sources and related unit tests from configuration.
 

Function Documentation

◆ class_getClassDefTemplate()

PString class_getClassDefTemplate ( const PVecString & listTemplate)

Get the template call in the class declaration.

Parameters
listTemplate: list of template def
Returns
template definition in the class declaration (< T, U, .... >)

Definition at line 26 of file generator_class_cpp.cpp.

26 {
27 if(listTemplate.size() == 0lu){return "";}
28 PString defTemplate("<"), comma("");
29 for(PVecString::const_iterator it(listTemplate.begin()); it != listTemplate.end(); ++it){
30 PVecString vecPart = it->split(' ');
31 if(vecPart.size() != 0lu){
32 defTemplate += comma + vecPart.back();
33 comma = ", ";
34 }
35 }
36 defTemplate += ">";
37 return defTemplate;
38}

Referenced by generator_class_cpp_header(), and generator_class_cpp_source().

+ Here is the caller graph for this function:

◆ generator_class_cpp()

bool generator_class_cpp ( const PTraitBackendManager & manager,
const std::vector< PClassConfig > & vecClassConfig,
const PPath & outputSourceDir,
const PPath & baseFileName,
const GeneratorMode & mode,
const PVecPath & vecInclude )

Creates header and source files.

Parameters
manager: PTraitBackendManager which handles all trait backend
vecClassConfig: vector of class config we want to save
baseFileName: base file name for header or source file
outputSourceDir: output directory where to save sources
mode: all modes of the generator (data/check/type/config stream)
Returns
true on success, false otherwise

Definition at line 357 of file generator_class_cpp.cpp.

357 {
358 if(baseFileName == ""){
359 std::cerr << termRed() << "generator_class_cpp : baseFileName is empty" << termDefault() << std::endl;
360 return false;
361 }
362 bool hasSource(false), hasTemplate(false);
363 class_checkClassConfig(hasSource, hasTemplate, vecClassConfig);
364 PString includeTemplate("");
365 if(hasTemplate){
366 includeTemplate = PString(baseFileName.getFileName() + "_impl.h");
367 }
368 PPath headerFile = outputSourceDir / PPath(baseFileName + ".h");
369 if(!generator_class_cpp_headerFile(manager, headerFile, vecClassConfig, mode, vecInclude, includeTemplate)){
370 std::cerr << termRed() << "generator_class_cpp : cannot generate header file '"<<headerFile<<"'" << termDefault() << std::endl;
371 return false;
372 }
373 if(hasSource){
374 PPath sourceFile = outputSourceDir / PPath(baseFileName + PString(".cpp"));
375 if(!generator_class_cpp_sourceFile(manager, sourceFile, PPath(baseFileName + PString(".h")), vecClassConfig, mode, false)){
376 std::cerr << termRed() << "generator_class_cpp : cannot generate source file '"<<sourceFile<<"'" << termDefault() << std::endl;
377 return false;
378 }
379 }
380 if(hasTemplate){
381 PPath implFile = outputSourceDir / PPath(baseFileName + PString("_impl.h"));
382 if(!generator_class_cpp_sourceFile(manager, implFile, PPath(baseFileName + PString(".h")), vecClassConfig, mode, true)){
383 std::cerr << termRed() << "generator_class_cpp : cannot generate impl file '"<<implFile<<"'" << termDefault() << std::endl;
384 return false;
385 }
386 }
387 return true;
388}
bool generator_class_cpp_sourceFile(const PTraitBackendManager &manager, const PPath &sourceFile, const PPath &headerFile, const std::vector< PClassConfig > &vecClassConfig, const GeneratorMode &mode, bool isTemplateImpl)
Create the implementation of the given file.
void class_checkClassConfig(bool &hasSource, bool &hasTemplate, const std::vector< PClassConfig > &vecClassConfig)
Check if the configuration has source or template to determine if the .cpp or _impl....
bool generator_class_cpp_headerFile(const PTraitBackendManager &manager, const PPath &headerFile, const std::vector< PClassConfig > &vecClassConfig, const GeneratorMode &mode, const PVecPath &vecInclude, const PString &includeTemplate)
Create the declaration of the given class.

References class_checkClassConfig(), generator_class_cpp_headerFile(), and generator_class_cpp_sourceFile().

Referenced by generator_class_full().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generator_class_cpp_header()

void generator_class_cpp_header ( const PTraitBackendManager & manager,
std::ofstream & fs,
const PClassConfig & classConfig,
const GeneratorMode & mode )

Create the declaration of the given class.

Parameters
manager: PTraitBackendManager which handles all trait backend
[out]fs: file to be completed
classConfig: configuration of the class to be used
mode: mode of the generator

Definition at line 171 of file generator_class_cpp.cpp.

171 {
172 if(classConfig.getClassDocumentation() != "") fs << classConfig.getClassDocumentation() << std::endl;
173 PString name(classConfig.getName());
174 PString namespaceName(classConfig.getNamespace());
175 GeneratorMode classMode(mode);
176 const PVecString & listTemplate = classConfig.getListTemplate();
177 PString defTemplate(class_getClassDefTemplate(listTemplate));
178 PString templateDeclaration(class_getClassDeclTempalteDef(listTemplate));
179 classMode.defTemplate = defTemplate;
180 classMode.templateDeclaration = templateDeclaration;
181
182 fs << classMode.templateDeclaration;
183 fs << "class ";
184 if(namespaceName != ""){
185 fs << namespaceName << "::";
186 }
187 fs << name;
188 if(classConfig.getListParentClass().size() != 0lu){
189 PVecString::const_iterator it(classConfig.getListParentClass().begin());
190 fs << " : public " << *it;
191 if(classConfig.getListParentClass().size() > 1lu){
192 while(it != classConfig.getListParentClass().end()){
193 fs << ", " << *it;
194 ++it;
195 }
196 }
197 }
198 fs << "{" << std::endl;
199 fs << "\tpublic:" << std::endl;
200 fs << "\t\t" << name << "();" << std::endl;
201 fs << "\t\tvirtual ~" << name << "() = default;" << std::endl;
202
203 manager.publicMethodDeclaration(fs, classConfig, classMode);
204 fs << "\tprotected:" << std::endl;
205 manager.protectedMethodDeclaration(fs, classConfig, classMode);
206
207 fs << "\tprivate:" << std::endl;
208 fs << "\t\tvoid initialisation" << name << "();" << std::endl;
209 manager.privateMethodDeclaration(fs, classConfig, classMode);
210 const std::vector<PClassAttribute> & listAttr(classConfig.getListAttribute());
211 for(std::vector<PClassAttribute>::const_iterator it(listAttr.begin()); it != listAttr.end(); ++it){
212 if(it->getDocumentation() != "") fs << "\t\t" << it->getDocumentation() << std::endl;
213
214 fs << "\t\t" << it->getType() << " p_" << it->getName() << ";" << std::endl;
215 }
216 fs << "};" << std::endl << std::endl;
217 manager.classExtraFunctionDeclaration(fs, classConfig, classMode);
218 fs << std::endl << std::endl;
219}
const PString & getClassDocumentation() const
Returns the class documentation.
const std::vector< PClassAttribute > & getListAttribute() const
Returns the list of attributes of the class.
const PVecString & getListTemplate() const
Returns the list of the template of the class.
const PString & getName() const
Returns the class name.
const PVecString & getListParentClass() const
Returns the list of the parents of the class.
const PString & getNamespace() const
Returns the namespace of the class.
void protectedMethodDeclaration(std::ofstream &fs, const PClassConfig &classConfig, const GeneratorMode &mode) const
Declaration of protected methods.
void classExtraFunctionDeclaration(std::ofstream &fs, const PClassConfig &classConfig, const GeneratorMode &mode) const
Declaration of extra functions.
void privateMethodDeclaration(std::ofstream &fs, const PClassConfig &classConfig, const GeneratorMode &mode) const
Declaration of private methods.
void publicMethodDeclaration(std::ofstream &fs, const PClassConfig &classConfig, const GeneratorMode &mode) const
Declaration of public methods.
PString class_getClassDefTemplate(const PVecString &listTemplate)
Get the template call in the class declaration.
PString class_getClassDeclTempalteDef(const PVecString &listTemplate)
Get the template definition in the class declaration.
All the genertor modes.

References class_getClassDeclTempalteDef(), class_getClassDefTemplate(), PTraitBackendManager::classExtraFunctionDeclaration(), GeneratorMode::defTemplate, PClassConfig::getClassDocumentation(), PClassConfig::getListAttribute(), PClassConfig::getListParentClass(), PClassConfig::getListTemplate(), PClassConfig::getName(), PClassConfig::getNamespace(), PTraitBackendManager::privateMethodDeclaration(), PTraitBackendManager::protectedMethodDeclaration(), PTraitBackendManager::publicMethodDeclaration(), and GeneratorMode::templateDeclaration.

Referenced by generator_class_cpp_headerFile().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generator_class_cpp_source()

void generator_class_cpp_source ( const PTraitBackendManager & manager,
std::ofstream & fs,
const PClassConfig & classConfig,
const GeneratorMode & mode )

Create the implementation of the given class.

Parameters
manager: PTraitBackendManager which handles all trait backend
[out]fs: file to be completed
classConfig: configuration of the class to be used
mode: mode of the generator

Definition at line 273 of file generator_class_cpp.cpp.

273 {
274 manager.classExtraFunctionImplementation(fs, classConfig, mode);
275 GeneratorMode classMode(mode);
276 const PVecString & listTemplate = classConfig.getListTemplate();
277 PString defTemplate(class_getClassDefTemplate(listTemplate));
278 PString templateDeclaration(class_getClassDeclTempalteDef(listTemplate));
279 classMode.defTemplate = defTemplate;
280 classMode.templateDeclaration = templateDeclaration;
281 if(!classConfig.getIsEnum()){
282 class_saveClassConstructorImpl(fs, classConfig, defTemplate, templateDeclaration);
283 }
284 manager.publicMethodImplementation(fs, classConfig, classMode);
285 manager.protectedMethodImplementation(fs, classConfig, classMode);
286 manager.privateMethodImplementation(fs, classConfig, classMode);
287 if(!classConfig.getIsEnum()){
288 class_saveClassInitialisationFunctionImpl(fs, classConfig, defTemplate, templateDeclaration);
289 }
290}
bool getIsEnum() const
Say if the current PClassConfig is an enum.
void classExtraFunctionImplementation(std::ofstream &fs, const PClassConfig &classConfig, const GeneratorMode &mode) const
Implementation of extra functions.
void protectedMethodImplementation(std::ofstream &fs, const PClassConfig &classConfig, const GeneratorMode &mode) const
Implementation of protected methods.
void privateMethodImplementation(std::ofstream &fs, const PClassConfig &classConfig, const GeneratorMode &mode) const
Implementation of private methods.
void publicMethodImplementation(std::ofstream &fs, const PClassConfig &classConfig, const GeneratorMode &mode) const
Implementation of public methods.
void class_saveClassConstructorImpl(std::ofstream &fs, const PClassConfig &classConfig, const PString &defTemplate, const PString &templateDeclaration)
Saves constructor of the class.
void class_saveClassInitialisationFunctionImpl(std::ofstream &fs, const PClassConfig &classConfig, const PString &defTemplate, const PString &templateDeclaration)
Saves the copy function of a class.

References class_getClassDeclTempalteDef(), class_getClassDefTemplate(), class_saveClassConstructorImpl(), class_saveClassInitialisationFunctionImpl(), PTraitBackendManager::classExtraFunctionImplementation(), GeneratorMode::defTemplate, PClassConfig::getIsEnum(), PClassConfig::getListTemplate(), PTraitBackendManager::privateMethodImplementation(), PTraitBackendManager::protectedMethodImplementation(), PTraitBackendManager::publicMethodImplementation(), and GeneratorMode::templateDeclaration.

Referenced by generator_class_cpp_sourceFile().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generator_class_cpp_test()

bool generator_class_cpp_test ( const PTraitBackendManager & manager,
const PPath & outputTestDir,
const std::vector< PClassConfig > & vecClassConfig,
const PString & projectName,
const PPath & baseFileName,
const GeneratorMode & mode )

Save the unit test of the generated PClassConfig.

Parameters
manager: PTraitBackendManager which handles all trait backend
outputTestDir: output directory where to put the generated test (typically ../TESTS if the program is called from ./src)
vecClassConfig: vector of class configuration to be used
projectName: configuration of the project
baseFileName: base of output file name of the generated sources
mode: all modes of the generator (data/check/type/config stream)
Returns
true on success, false oterhwise

Definition at line 468 of file generator_class_cpp.cpp.

468 {
469 PString cmakeListBody;
470 cmakeListBody += getCMakeListsHeader();
471 bool b(true);
472 cmakeListBody += "#Generating tests for " + PString::toString(vecClassConfig.size()) + "\n";
473 for(std::vector<PClassConfig>::const_iterator it(vecClassConfig.begin()); it != vecClassConfig.end(); ++it){
474 cmakeListBody += "add_subdirectory(TEST_" + it->getName().toUpper() + ")\n";
475 b &= generator_class_test(manager, outputTestDir, *it, projectName, baseFileName, mode);
476 }
477 cmakeListBody += "\n\n";
478 PPath cmakelist(outputTestDir / PPath("CMakeLists.txt"));
479 b &= cmakelist.saveFileContent(cmakeListBody);
480 return b;
481}
PString getCMakeListsHeader()
Get the CMakeLists.txt header.
bool generator_class_test(const PTraitBackendManager &manager, const PPath &outputTestDir, const PClassConfig &classConfig, const PString &projectName, const PPath &baseFileName, const GeneratorMode &mode)
Save the unit test of the generated PClassConfig.

References generator_class_test(), and getCMakeListsHeader().

Referenced by generator_class_full().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generator_class_full()

bool generator_class_full ( const PTraitBackendManager & manager,
const ProjectParam & projectParam )

Generate the full sources and related unit tests from configuration.

Parameters
manager: PTraitBackendManager which handles all trait backend
projectParam: description of classes and how and where to generate sources and test
Returns
true on success, false otherwise

Definition at line 488 of file generator_class_cpp.cpp.

488 {
489 bool b(true);
490 b &= projectParam.outputSourceDir.createDirectory();
491 b &= projectParam.outputTestDir.createDirectory();
492 PString cmakeListBody;
493 cmakeListBody += getCMakeListsHeader();
494 const PVecDataConfig & vecDataConfig = projectParam.vecDataConfig;
495 for(const PDataConfig & config : vecDataConfig){
496 PPath baseFileName = config.getFileName().getFileName().eraseExtension();
497 if(!generator_class_cpp(manager, config.getVecClassConfig(), projectParam.outputSourceDir, baseFileName, projectParam.mode, config.getVecInclude())){
498 std::cerr << termRed() << "generator_class_full : cannot generate C++ sources at '"<<projectParam.outputSourceDir<<"'" << termDefault() << std::endl;
499 b = false; //best effort strategy
500 }
501 PPath outputCurrentTestDir = projectParam.outputTestDir / PPath("TEST_" + config.getFileName().getFileName().eraseExtension().toUpper());
502 cmakeListBody += "add_subdirectory(" + outputCurrentTestDir.getFileName() + ")\n";
503 if(!generator_class_cpp_test(manager, outputCurrentTestDir, config.getVecClassConfig(), projectParam.name, baseFileName, projectParam.mode)){
504 std::cerr << termRed() << "generator_class_full : cannot generate C++ tests at '"<<projectParam.outputTestDir<<"'" << termDefault() << std::endl;
505 b = false; //best effort strategy
506 }
507 }
508 cmakeListBody += "\n\n";
509 PPath cmakelist(projectParam.outputTestDir / PPath("CMakeLists.txt"));
510 b &= cmakelist.saveFileContent(cmakeListBody);
511 return b;
512}
std::vector< PDataConfig > PVecDataConfig
Definition PDataConfig.h:48
Class to describe a basic class.
Definition PDataConfig.h:17
bool generator_class_cpp(const PTraitBackendManager &manager, const std::vector< PClassConfig > &vecClassConfig, const PPath &outputSourceDir, const PPath &baseFileName, const GeneratorMode &mode, const PVecPath &vecInclude)
Creates header and source files.
bool generator_class_cpp_test(const PTraitBackendManager &manager, const PPath &outputTestDir, const std::vector< PClassConfig > &vecClassConfig, const PString &projectName, const PPath &baseFileName, const GeneratorMode &mode)
Save the unit test of the generated PClassConfig.
GeneratorMode mode
Mode to be used to generate the project.
PPath outputTestDir
Output path of the unit tests.
PVecDataConfig vecDataConfig
Configuration of classes to be generated.
PString name
Name of the project.
PPath outputSourceDir
Output path of the sources.

References generator_class_cpp(), generator_class_cpp_test(), getCMakeListsHeader(), ProjectParam::mode, ProjectParam::name, ProjectParam::outputSourceDir, ProjectParam::outputTestDir, and ProjectParam::vecDataConfig.

Referenced by generateCppClassesFull().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: