GCC Code Coverage Report


Directory: ./
File: src/wrapper_module_generator.cpp
Date: 2025-04-25 19:10:50
Exec Total Coverage
Lines: 792 859 92.2%
Branches: 1585 1854 85.5%

Line Branch Exec Source
1 /***************************************
2 Auteur : Pierre Aubert
3 Mail : pierre.aubert@lapp.in2p3.fr
4 Licence : CeCILL-C
5 ****************************************/
6
7 #include "header_generator.h"
8 #include "saveClassConfig.h"
9 #include "type_utils.h"
10 #include "wrapper_convertType.h"
11 #include "wrapper_module_generator.h"
12
13 ///Get the string description of the Py_BuildValue call for the given type
14 /** @param type : type of the used
15 * @return corresponding string description or UnknownType if the type is not yet supported by this function
16 */
17 PString wrapper_getBuildValueStr(const PString & type){
18 if(type == "int"){return "i";}
19 else if(type == "float"){return "f";}
20 else if(type == "double"){return "d";}
21 else if(type == "char"){return "c";}
22 else if(type == "std::string"){return "s";}
23 else{
24 return "UnknownType";
25 }
26 }
27
28 ///Get the function to convert the given object to a value
29 /** @param type : tpye to be used
30 * @return corresponding function or UnknownConvertFunctionToValue if the type is not yet supported by this function
31 */
32 1 PString wrapper_getObjectToValue(const PString & type){
33
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
1 if(type == "float" || type == "double"){return "PyFloat_AsDouble";}
34
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
1 else if(type == "long" || type == "short" || type == "char"){return "PyLong_AsLong";}
35
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 else if(type == "int"){return "PyLong_AsInt";}
36 else if(type == "size_t"){return "PyLong_ToSize_t";}
37 else{
38 return "UnknownConvertFunctionToValue";
39 }
40 }
41
42 ///Get the function to convert the given value to a PyObject
43 /** @param type : tpye to be used
44 * @return corresponding function or UnknownConvertFunctionFromValue if the type is not yet supported by this function
45 */
46 1 PString wrapper_getValueToObject(const PString & type){
47
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
1 if(type == "float" || type == "double"){return "PyFloat_FromDouble";}
48
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
1 else if(type == "long" || type == "short" || type == "char" || type == "int"){return "PyLong_FromLong";}
49 else if(type == "unsigned long" || type == "unsigned short" || type == "unsigned char" || type == "unsigned int"){return "PyLong_FromLong";}
50 else if(type == "size_t"){return "PyLong_FromSize_t";}
51 else{
52 return "UnknownConvertFunctionFromValue";
53 }
54 }
55
56 ///Get the expected type of a given python type
57 /** @param type : type ot be used
58 * @return corresponding Python type or NoPythonTypeYet if the type is not yet supported by this function
59 */
60 1 PString wrapper_getExpectedType(const PString & type){
61
3/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
1 if(type == "long" || type == "int" || type == "short" || type == "char"){return "int";}
62 else if(type == "float" || type == "double"){return "float";}
63 else if(type == "std::string"){return "std";}
64 else{
65 return "NoPythonTypeYet";
66 }
67 }
68
69 ///Create the PyType_Ready for all classes of the module
70 /** @param vecClassConfig : vector of class configuration
71 * @return corresponding c++
72 */
73 5 PString project_wrapper_modulePyTypeReady(const std::vector<PClassConfig> & vecClassConfig){
74 5 PString body;
75 // bool isPyEnumAvailable(true);
76
2/2
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 5 times.
12 for(std::vector<PClassConfig>::const_iterator it(vecClassConfig.begin()); it != vecClassConfig.end(); ++it){
77
3/3
✓ Branch 2 taken 7 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 6 times.
7 if(it->getIsEnum()){continue;}
78 // if(it->getIsEnum() && isPyEnumAvailable){
79 // body += "\tif(PyType_Ready(&PyEnum_Type) < 0){return NULL;}\n";
80 // isPyEnumAvailable = false;
81 // }
82
4/4
✓ Branch 2 taken 6 times.
✓ Branch 5 taken 6 times.
✓ Branch 8 taken 6 times.
✓ Branch 11 taken 6 times.
6 body += "\tif(PyType_Ready(&WP"+it->getName()+"Type) < 0){return NULL;}\n";
83 }
84 5 return body;
85 }
86
87 ///Create the Py_INCREF for all classes of the module
88 /** @param vecClassConfig : vector of class configuration
89 * @return corresponding c++
90 */
91 5 PString project_wrapper_modulePyIncref(const std::vector<PClassConfig> & vecClassConfig){
92 5 PString body;
93 // bool isPyEnumAvailable(true);
94
2/2
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 5 times.
12 for(std::vector<PClassConfig>::const_iterator it(vecClassConfig.begin()); it != vecClassConfig.end(); ++it){
95
3/3
✓ Branch 2 taken 7 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 6 times.
7 if(it->getIsEnum()){
96
7/7
✓ Branch 2 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 9 taken 1 times.
✓ Branch 12 taken 1 times.
✓ Branch 15 taken 1 times.
✓ Branch 18 taken 1 times.
✓ Branch 21 taken 1 times.
1 body += "\tPyObject* "+it->getName()+"EnumType = WP"+it->getName()+"_newC(NULL, NULL, NULL);\n";
97
4/4
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
✓ Branch 11 taken 1 times.
1 body += "\tPy_INCREF("+it->getName()+"EnumType);\n";
98 1 continue;
99 }
100 // if(it->getIsEnum() && isPyEnumAvailable){
101 // body += "\tPy_INCREF(&PyEnum_Type);\n";
102 // isPyEnumAvailable = false;
103 // }
104
4/4
✓ Branch 2 taken 6 times.
✓ Branch 5 taken 6 times.
✓ Branch 8 taken 6 times.
✓ Branch 11 taken 6 times.
6 body += "\tPy_INCREF(&WP"+it->getName()+"Type);\n";
105 }
106 5 return body;
107 }
108
109 ///Create the Py_INCREF for all classes of the module
110 /** @param vecClassConfig : vector of class configuration
111 * @return corresponding c++
112 */
113 5 PString project_wrapper_moduleAddObject(const std::vector<PClassConfig> & vecClassConfig){
114 5 PString body;
115 // bool isPyEnumAvailable(true);
116
2/2
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 5 times.
12 for(std::vector<PClassConfig>::const_iterator it(vecClassConfig.begin()); it != vecClassConfig.end(); ++it){
117
3/3
✓ Branch 2 taken 7 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 6 times.
7 if(it->getIsEnum()){
118
7/7
✓ Branch 2 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 9 taken 1 times.
✓ Branch 12 taken 1 times.
✓ Branch 15 taken 1 times.
✓ Branch 18 taken 1 times.
✓ Branch 21 taken 1 times.
1 body += "\tPyModule_AddObject(m, \""+it->getName()+"\", "+it->getName()+"EnumType);\n";
119 1 continue;
120 }
121 // if(it->getIsEnum() && isPyEnumAvailable){
122 // body += "\tPyModule_AddObject(m, \"Enum\", (PyObject *)&PyEnum_Type);\n";
123 // isPyEnumAvailable = false;
124 // }
125
7/7
✓ Branch 2 taken 6 times.
✓ Branch 6 taken 6 times.
✓ Branch 9 taken 6 times.
✓ Branch 12 taken 6 times.
✓ Branch 15 taken 6 times.
✓ Branch 18 taken 6 times.
✓ Branch 21 taken 6 times.
6 body += "\tPyModule_AddObject(m, \""+it->getName()+"\", (PyObject *)&WP"+it->getName()+"Type);\n";
126 }
127 5 return body;
128 }
129
130 ///Create the main wrapper module
131 /** @param fileName : path of the module
132 * @param projectConfig : config of the project
133 * @param baseImplInclude : basic include of the module implementation
134 * @param vecClassConfig : vector of class configuration
135 * @param vecInclude : vector of includes
136 * @return true on success, false otherwise
137 */
138 5 bool project_wrapper_moduleGeneratorMain(const PPath & fileName, const ProjectConfig & projectConfig, const PString & baseImplInclude, const std::vector<PClassConfig> & vecClassConfig, const PVecPath & vecInclude){
139
2/2
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
5 PString body, moduleName(projectConfig.name.toLower());
140
2/2
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
5 body += licenceSaveStr();
141
1/1
✓ Branch 1 taken 5 times.
5 body += "\n";
142
1/1
✓ Branch 1 taken 5 times.
5 body += "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\n";
143
1/1
✓ Branch 1 taken 5 times.
5 body += "#ifndef DISABLE_COOL_ARRAY\n";
144
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
5 body += "#\tdefine PY_ARRAY_UNIQUE_SYMBOL "+moduleName+"_ARRAY_API\n";
145
1/1
✓ Branch 1 taken 5 times.
5 body += "#endif\n";
146
1/1
✓ Branch 1 taken 5 times.
5 body += "\n";
147
1/1
✓ Branch 1 taken 5 times.
5 body += "#include <Python.h>\n";
148
1/1
✓ Branch 1 taken 5 times.
5 body += "#include \"structmember.h\"\n";
149
1/1
✓ Branch 1 taken 5 times.
5 body += "#include <numpy/arrayobject.h>\n";
150
1/1
✓ Branch 1 taken 5 times.
5 body += "\n";
151
1/1
✓ Branch 1 taken 5 times.
5 body += "#include <string>\n";
152
153 //TODO : put the includes of all class definitions
154
1/2
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
5 for(PVecPath::const_iterator it(vecInclude.begin()); it != vecInclude.end(); ++it){
155 body += "#include \""+(*it)+"\"\n";
156 }
157
1/1
✓ Branch 1 taken 5 times.
5 body += "\n";
158
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
5 body += "#include \""+ baseImplInclude + "_wrapper.h\"\n\n";
159
160
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
5 body += "static PyMethodDef _"+moduleName+"_methods[] = {\n";
161
1/1
✓ Branch 1 taken 5 times.
5 body += "\t{NULL, NULL}\n";
162
1/1
✓ Branch 1 taken 5 times.
5 body += "};\n\n";
163
164
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
5 body += "static PyModuleDef _"+moduleName+"_module = {\n";
165
1/1
✓ Branch 1 taken 5 times.
5 body += "\tPyModuleDef_HEAD_INIT,\n";
166
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
5 body += "\t\"py"+moduleName+"\",\n";
167
1/1
✓ Branch 1 taken 5 times.
5 body += "\t\"\",\n";
168
1/1
✓ Branch 1 taken 5 times.
5 body += "\t-1,\n";
169
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
5 body += "\t_"+moduleName+"_methods,\n";
170
1/1
✓ Branch 1 taken 5 times.
5 body += "\tNULL,\n";
171
1/1
✓ Branch 1 taken 5 times.
5 body += "\tNULL,\n";
172
1/1
✓ Branch 1 taken 5 times.
5 body += "\tNULL,\n";
173
1/1
✓ Branch 1 taken 5 times.
5 body += "\tNULL\n";
174
1/1
✓ Branch 1 taken 5 times.
5 body += "};\n\n";
175
176
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
5 body += "///Create the python module "+moduleName+"\n";
177
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
5 body += "/**\t@return python module "+moduleName+"\n";
178
1/1
✓ Branch 1 taken 5 times.
5 body += "*/\n";
179
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
5 body += "PyMODINIT_FUNC PyInit_py"+moduleName+"(void){\n";
180
1/1
✓ Branch 1 taken 5 times.
5 body += "\tPyObject *m;\n";
181
1/1
✓ Branch 1 taken 5 times.
5 body += "\timport_array();\n";
182
1/1
✓ Branch 1 taken 5 times.
5 body += "\n";
183
2/2
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
5 body += project_wrapper_modulePyTypeReady(vecClassConfig);
184
1/1
✓ Branch 1 taken 5 times.
5 body += "\t\n";
185
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
5 body += "\tm = PyModule_Create(&_"+moduleName+"_module);\n";
186
1/1
✓ Branch 1 taken 5 times.
5 body += "\tif(m == NULL){\n";
187
1/1
✓ Branch 1 taken 5 times.
5 body += "\t\treturn NULL;\n";
188
1/1
✓ Branch 1 taken 5 times.
5 body += "\t}\n";
189
1/1
✓ Branch 1 taken 5 times.
5 body += "\t\n";
190
2/2
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
5 body += project_wrapper_modulePyIncref(vecClassConfig);
191
1/1
✓ Branch 1 taken 5 times.
5 body += "\t\n";
192
2/2
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
5 body += project_wrapper_moduleAddObject(vecClassConfig);
193
1/1
✓ Branch 1 taken 5 times.
5 body += "\t\n";
194
1/1
✓ Branch 1 taken 5 times.
5 body += "\treturn m;\n";
195
1/1
✓ Branch 1 taken 5 times.
5 body += "}\n\n";
196
197
1/1
✓ Branch 1 taken 5 times.
10 return fileName.saveFileContent(body);
198 5 }
199
200 ///Predefine struct of the wrapper
201 /** @param vecClassConfig : vector of class configuration
202 * @return corresponding c++
203 */
204 5 PString project_wrapper_moduleGeneratorWrapperHeaderStructPreDef(const std::vector<PClassConfig> & vecClassConfig){
205 5 PString body;
206
2/2
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 5 times.
12 for(std::vector<PClassConfig>::const_iterator it(vecClassConfig.begin()); it != vecClassConfig.end(); ++it){
207
3/3
✓ Branch 2 taken 7 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 6 times.
7 if(it->getIsEnum()){continue;}
208
4/4
✓ Branch 2 taken 6 times.
✓ Branch 5 taken 6 times.
✓ Branch 8 taken 6 times.
✓ Branch 11 taken 6 times.
6 body += "struct WP"+it->getName()+";\n";
209 }
210 5 return body;
211 }
212
213 ///Get the C++ definition of an attribute
214 /** @param attr : attribute of a class
215 * @return corresponding C++
216 */
217 18 PString project_wrapper_attributeDef(const PClassAttribute & attr){
218 18 PString body;
219
4/4
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
✓ Branch 10 taken 18 times.
18 body += "\t" + attr.getDocumentation() + "\n";
220
4/4
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 6 times.
18 if(getIsSimpleType(attr.getType())){
221
3/3
✓ Branch 1 taken 12 times.
✓ Branch 4 taken 12 times.
✓ Branch 7 taken 12 times.
12 body += "\t" + attr.getType();
222 }else{
223
1/1
✓ Branch 1 taken 6 times.
6 body += "\tPyObject *";
224 }
225
4/4
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
✓ Branch 10 taken 18 times.
18 body += " "+attr.getName()+";\n";
226 18 return body;
227 }
228
229 ///Definition of the getter and setter for complex types
230 /** @param className : name of the current class
231 * @param attr : attribute of a class
232 * @return corresponding C++
233 */
234 18 PString project_wrapper_classGetterSetterDef(const PString & className, const PClassAttribute & attr){
235 18 PString body;
236 //If the type is simple, we do not need getter, setter and other methods
237
4/4
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 6 times.
18 if(getIsSimpleType(attr.getType())){return body;}
238
8/8
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
✓ Branch 16 taken 6 times.
✓ Branch 19 taken 6 times.
✓ Branch 22 taken 6 times.
6 body += "int "+className+"_set"+attr.getName()+"("+className+" * self, PyObject * value, void * closure);\n";
239
8/8
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
✓ Branch 16 taken 6 times.
✓ Branch 19 taken 6 times.
✓ Branch 22 taken 6 times.
6 body += "PyObject * "+className+"_get"+attr.getName()+"("+className+" * self, void * closure);\n";
240 6 return body;
241 }
242
243 ///Enum of the wrapper
244 /** @param classConfig : class configuration
245 * @return corresponding c++
246 */
247 1 PString project_wrapper_moduleGeneratorWrapperHeaderEnumDef(const PClassConfig & classConfig){
248
4/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
1 PString body, className("WP"+classConfig.getName());
249 // body += classConfig.getClassDocumentation() + "\n";
250 // body += "struct "+className+"{\n";
251 // body += "\tPyObject_HEAD\n";
252 // const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
253 // for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
254 // if(it->getDocumentation() != ""){
255 // body += "\t" + it->getDocumentation() + "\n";
256 // }
257 // body += "\tPyObject * "+it->getName()+";\n";
258 // }
259 // body += "};\n\n";
260
261 // body += "PyObject * "+className+"_getTypeName(PyObject *self, PyObject *args);\n\n";
262
1/1
✓ Branch 1 taken 1 times.
1 body += "//Allocation and deallocation\n";
263
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "PyObject * "+className+"_newC(PyTypeObject * type, PyObject * args, PyObject * kwds);\n";
264 // body += "void "+className+"_dealloc("+className+" * self);\n\n";
265
266 // body += "//getter and setters\n";
267 // for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
268 // body += project_wrapper_classGetterSetterDef(className, *it);
269 // }
270 // body += "\n";
271 // body += "extern PyGetSetDef "+className+"_getseters[];\n";
272 // body += "extern PyMemberDef "+className+"_members[];\n";
273 // body += "extern PyMethodDef "+className+"_methods[];\n";
274 // body += "extern PyTypeObject "+className+"Type;\n\n";
275 2 return body;
276 1 }
277
278 ///Struct of the wrapper
279 /** @param classConfig : class configuration
280 * @return corresponding c++
281 */
282 6 PString project_wrapper_moduleGeneratorWrapperHeaderStructDef(const PClassConfig & classConfig){
283
4/4
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
6 PString body, className("WP"+classConfig.getName());
284
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += classConfig.getClassDocumentation() + "\n";
285
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "struct "+className+"{\n";
286
1/1
✓ Branch 1 taken 6 times.
6 body += "\tPyObject_HEAD\n";
287
1/1
✓ Branch 1 taken 6 times.
6 const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
288
2/2
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
289
2/2
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
18 body += project_wrapper_attributeDef(*it);
290 }
291
1/1
✓ Branch 1 taken 6 times.
6 body += "};\n\n";
292
1/1
✓ Branch 1 taken 6 times.
6 body += "//Check function\n";
293
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "bool "+className+"_check(std::string & error, const "+className+" & obj);\n";
294
295
1/1
✓ Branch 1 taken 6 times.
6 body += "//TODO : add new and free for array data\n";
296
1/1
✓ Branch 1 taken 6 times.
6 body += "//getter and setters\n";
297
2/2
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
298
2/2
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
18 body += project_wrapper_classGetterSetterDef(className, *it);
299 }
300 //Check when we defined std::vector
301
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyObject * "+className+"_getTypeName(PyObject *self, PyObject *args);\n\n";
302
1/1
✓ Branch 1 taken 6 times.
6 body += "//Allocation and deallocation\n";
303
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyObject * "+className+"_newC(PyTypeObject * type, PyObject * args, PyObject * kwds);\n";
304
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "void "+className+"_dealloc("+className+" * self);\n\n";
305
306
1/1
✓ Branch 1 taken 6 times.
6 body += "//PhoenixDataStream interface\n";
307
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyObject * "+className+"_fromBytes(PyObject *self, PyObject *args);\n";
308
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "size_t "+className+"_fromMessage("+className+" & obj, DataStreamIter & iter);\n\n";
309
310
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyObject * "+className+"_toBytes(PyObject *self, PyObject *args);\n";
311
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "size_t "+className+"_toMessage("+className+" & obj, DataStreamIter & iter);\n\n";
312
313
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyObject * "+className+"_getSizeInByte(PyObject *self, PyObject *args);\n";
314
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "size_t "+className+"_getSize("+className+" & obj);\n\n";
315
316
1/1
✓ Branch 1 taken 6 times.
6 body += "//PhoenixDataStream interface under the hood for all attributes\n";
317
2/2
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
318
4/4
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
✓ Branch 8 taken 18 times.
✓ Branch 11 taken 18 times.
18 body += "//PhoenixDataStream interface under the hood for " + it->getName() + " attribute\n";
319
8/8
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
✓ Branch 8 taken 18 times.
✓ Branch 11 taken 18 times.
✓ Branch 14 taken 18 times.
✓ Branch 17 taken 18 times.
✓ Branch 20 taken 18 times.
✓ Branch 23 taken 18 times.
18 body += "bool "+className+"_" + it->getName() + "_fromMessage("+className+" & self, DataStreamIter &iter);\n";
320
8/8
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
✓ Branch 8 taken 18 times.
✓ Branch 11 taken 18 times.
✓ Branch 14 taken 18 times.
✓ Branch 17 taken 18 times.
✓ Branch 20 taken 18 times.
✓ Branch 23 taken 18 times.
18 body += "bool "+className+"_" + it->getName() + "_toMessage("+className+" & self, DataStreamIter &iter);\n";
321
8/8
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
✓ Branch 8 taken 18 times.
✓ Branch 11 taken 18 times.
✓ Branch 14 taken 18 times.
✓ Branch 17 taken 18 times.
✓ Branch 20 taken 18 times.
✓ Branch 23 taken 18 times.
18 body += "size_t "+className+"_" + it->getName() + "_getSize("+className+" & self);\n\n";
322 }
323
324
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "extern PyGetSetDef "+className+"_getseters[];\n";
325
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "extern PyMemberDef "+className+"_members[];\n";
326
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "extern PyMethodDef "+className+"_methods[];\n";
327
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "extern PyTypeObject "+className+"Type;\n\n";
328 12 return body;
329 6 }
330
331 ///Predefine struct of the wrapper
332 /** @param vecClassConfig : vector of class configuration
333 * @return corresponding c++
334 */
335 5 PString project_wrapper_moduleGeneratorWrapperHeaderAllStructDef(const std::vector<PClassConfig> & vecClassConfig){
336 5 PString body;
337
2/2
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 5 times.
12 for(std::vector<PClassConfig>::const_iterator it(vecClassConfig.begin()); it != vecClassConfig.end(); ++it){
338
3/3
✓ Branch 2 taken 7 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 6 times.
7 if(it->getIsEnum()){
339
2/2
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
1 body += project_wrapper_moduleGeneratorWrapperHeaderEnumDef(*it);
340 }else{
341
2/2
✓ Branch 2 taken 6 times.
✓ Branch 5 taken 6 times.
6 body += project_wrapper_moduleGeneratorWrapperHeaderStructDef(*it);
342 }
343
344 }
345 5 return body;
346 }
347
348 ///Create the wrapper module header
349 /** @param wrapperHeader : path of the wrapper header
350 * @param projectConfig : config of the project
351 * @param baseImplInclude : basic include of the module implementation
352 * @param vecClassConfig : vector of class configuration
353 * @param vecInclude : vector of includes
354 * @return true on success, false otherwise
355 */
356 5 bool project_wrapper_moduleGeneratorWrapperHeader(const PPath & wrapperHeader, const ProjectConfig & projectConfig, const PString & baseImplInclude, const std::vector<PClassConfig> & vecClassConfig, const PVecPath & vecInclude){
357
1/1
✓ Branch 1 taken 5 times.
5 PString body;
358
2/2
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
5 body += licenceSaveStr();
359
1/1
✓ Branch 1 taken 5 times.
5 body += "\n";
360
4/4
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
✓ Branch 10 taken 5 times.
10 PString includeMacro("__" + baseImplInclude.toUpper() + "_WRAPPER_H__");
361
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
5 body += "#ifndef "+includeMacro+"\n";
362
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
5 body += "#define "+includeMacro+"\n\n";
363
364
1/1
✓ Branch 1 taken 5 times.
5 body += "#include <Python.h>\n";
365
1/1
✓ Branch 1 taken 5 times.
5 body += "#include <structmember.h>\n";
366
1/1
✓ Branch 1 taken 5 times.
5 body += "#include <iostream>\n\n";
367
1/1
✓ Branch 1 taken 5 times.
5 body += "#include \"phoenix_data_stream.h\"\n\n";
368
2/2
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
5 body += project_wrapper_moduleGeneratorWrapperHeaderStructPreDef(vecClassConfig);
369
1/1
✓ Branch 1 taken 5 times.
5 body += "\n";
370
2/2
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
5 body += project_wrapper_moduleGeneratorWrapperHeaderAllStructDef(vecClassConfig);
371
372
1/1
✓ Branch 1 taken 5 times.
5 body += "#endif\n\n";
373
1/1
✓ Branch 1 taken 5 times.
10 return wrapperHeader.saveFileContent(body);
374 5 }
375
376 ///Create the Python type of the given class
377 /** @param classConfig : class to be used
378 * @param moduleName : name of the module where the class should be defined
379 * @param fromOtherType : name of an other PyTypeObject to inheritate
380 * @return corresponding C++
381 */
382 6 PString project_wrapper_classImplPythonType(const PClassConfig & classConfig, const PString & moduleName, const PString & fromOtherType){
383
4/4
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
6 PString body, className("WP"+classConfig.getName());
384
385
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Define the type of the "+className+"\n";
386
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyTypeObject "+className+"Type = {\n";
387
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\tPyVarObject_HEAD_INIT("+fromOtherType+", 0)\n";
388
6/6
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
✓ Branch 16 taken 6 times.
6 body += "\t\""+moduleName+"."+classConfig.getName()+"\", /* tp_name */\n";
389
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\tsizeof("+className+"), /* tp_basicsize */\n";
390
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_itemsize */\n";
391
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\t(destructor)"+className+"_dealloc, /* tp_dealloc */\n";
392
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_print */\n";
393
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_getattr */\n";
394
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_setattr */\n";
395
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_reserved */\n";
396
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_repr */\n";
397
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_as_number */\n";
398
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_as_sequence */\n";
399
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_as_mapping */\n";
400
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_hash */\n";
401
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_call */\n";
402
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_str */\n";
403
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_getattro */\n";
404
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_setattro */\n";
405
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_as_buffer */\n";
406
1/1
✓ Branch 1 taken 6 times.
6 body += "\tPy_TPFLAGS_DEFAULT |\n";
407
1/1
✓ Branch 1 taken 6 times.
6 body += "\tPy_TPFLAGS_BASETYPE, /* tp_flags */\n";
408
9/9
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
✓ Branch 16 taken 6 times.
✓ Branch 19 taken 6 times.
✓ Branch 22 taken 6 times.
✓ Branch 25 taken 6 times.
6 body += "\t\""+className+" doc : "+classConfig.getClassDocumentation().replace("///", "")+"\", /* tp_doc */\n";
409
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_traverse */\n";
410
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_clear */\n";
411
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_richcompare */\n";
412
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_weaklistoffset */\n";
413
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_iter */\n";
414
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_iternext */\n";
415
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\t"+className+"_methods, /* tp_methods */\n";
416
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\t"+className+"_members, /* tp_members */\n";
417
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\t"+className+"_getseters,/* tp_getset */\n";
418
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_base */\n";
419
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_dict */\n";
420
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_descr_get */\n";
421
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_descr_set */\n";
422
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_dictoffset */\n";
423
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_init */\n";
424
1/1
✓ Branch 1 taken 6 times.
6 body += "\t0, /* tp_alloc */\n";
425
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\t"+className+"_newC, /* tp_new */\n";
426
1/1
✓ Branch 1 taken 6 times.
6 body += "};\n\n";
427 12 return body;
428 6 }
429
430 ///Implement new and dealloc
431 /** @param classConfig : class configuration
432 * @param moduleName : name of the module where the class should be defined
433 * @return corresponding C++
434 */
435 6 PString project_wrapper_classImplNewc(const PClassConfig & classConfig){
436
4/4
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
6 PString body, className("WP"+classConfig.getName());
437
438
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Allocate the "+className+"\n";
439
1/1
✓ Branch 1 taken 6 times.
6 body += "/**\t@param type : type variable\n";
440
1/1
✓ Branch 1 taken 6 times.
6 body += " * \t@param args : args variable\n";
441
1/1
✓ Branch 1 taken 6 times.
6 body += " * \t@param kwds : kwds variable\n";
442
1/1
✓ Branch 1 taken 6 times.
6 body += " * \t@return object to be allocated\n";
443
1/1
✓ Branch 1 taken 6 times.
6 body += "*/\n";
444
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyObject * "+className+"_newC(PyTypeObject * type, PyObject * args, PyObject * kwds){\n";
445
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\t"+className+" *self;\n";
446
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\tself = ("+className+" *)type->tp_alloc(type, 0);\n";
447
1/1
✓ Branch 1 taken 6 times.
6 body += "\tif(self != NULL){\n";
448
1/1
✓ Branch 1 taken 6 times.
6 const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
449
2/2
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
450
2/2
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
18 PString attrType(it->getType());
451
3/3
✓ Branch 1 taken 18 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 6 times.
18 if(getIsSimpleType(attrType)){
452
4/4
✓ Branch 2 taken 12 times.
✓ Branch 5 taken 12 times.
✓ Branch 8 taken 12 times.
✓ Branch 11 taken 12 times.
12 body += "\t\tself->"+it->getName()+" = 0;\n";
453
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 4 times.
6 }else if(attrType == "std::string"){
454
4/4
✓ Branch 2 taken 2 times.
✓ Branch 5 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 11 taken 2 times.
2 body += "\t\tself->"+it->getName()+" = Py_BuildValue(\"s\", \"\");\n";
455
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
4 }else if(attrType == "DataStreamMsg"){
456
4/4
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
✓ Branch 11 taken 1 times.
1 body += "\t\tself->"+it->getName()+" = PyByteArray_FromStringAndSize(\"\", 0lu);\n";
457
3/3
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
3 }else if(generator_typeIsList(attrType)){
458
4/4
✓ Branch 2 taken 2 times.
✓ Branch 5 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 11 taken 2 times.
2 body += "\t\tself->"+it->getName()+" = PyList_New(0);\n";
459 }else{
460 //TODO : check for complex types, vector, map, and nested types
461
2/3
✓ Branch 2 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 if(it->getIsEnum()){
462
1/1
✓ Branch 1 taken 1 times.
1 body += "\t\t//There is not type for enum because of the very ugly trick of Python\n";
463
6/6
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
✓ Branch 11 taken 1 times.
✓ Branch 14 taken 1 times.
✓ Branch 17 taken 1 times.
1 body += "\t\tself->"+it->getName()+" = WP"+attrType+"_newAttributeC();\n";
464 }else{
465 body += "\t\tself->"+it->getName()+" = WP"+attrType+"_newC(&WP"+attrType+"Type, NULL, NULL);\n";
466 }
467 }
468 18 }
469
1/1
✓ Branch 1 taken 6 times.
6 body += "\t}\n";
470
1/1
✓ Branch 1 taken 6 times.
6 body += "\treturn (PyObject *)self;\n";
471
1/1
✓ Branch 1 taken 6 times.
6 body += "}\n\n";
472 12 return body;
473 6 }
474
475 ///Implement new and dealloc
476 /** @param classConfig : class configuration
477 * @param moduleName : name of the module where the class should be defined
478 * @return corresponding C++
479 */
480 6 PString project_wrapper_classImplDealloc(const PClassConfig & classConfig){
481
4/4
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
6 PString body, className("WP"+classConfig.getName());
482
483
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Deallocate the structure "+className+"\n";
484
1/1
✓ Branch 1 taken 6 times.
6 body += "/**\t@param self : object to be deallocated\n";
485
1/1
✓ Branch 1 taken 6 times.
6 body += "*/\n";
486
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "void "+className+"_dealloc("+className+" * self){\n";
487
1/1
✓ Branch 1 taken 6 times.
6 const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
488
2/2
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
489
4/4
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 12 times.
18 if(!getIsSimpleType(it->getType())){
490
2/2
✓ Branch 2 taken 6 times.
✓ Branch 5 taken 6 times.
6 PString attrName = it->getName();
491
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\t//Free the "+attrName+" attribute\n";
492
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\tPyObject* "+attrName+"_tmp = self->"+attrName+";\n";
493
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\tself->"+attrName+" = NULL;\n";
494
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\tPy_XDECREF("+attrName+"_tmp);\n";
495 6 }
496 }
497
1/1
✓ Branch 1 taken 6 times.
6 body += "}\n\n";
498 12 return body;
499 6 }
500
501 ///Implement new and dealloc
502 /** @param classConfig : class configuration
503 * @return corresponding C++
504 */
505 6 PString project_wrapper_classImplGetterSetter(const PClassConfig & classConfig){
506
4/4
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
6 PString body, className("WP"+classConfig.getName());
507
1/1
✓ Branch 1 taken 6 times.
6 const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
508
2/2
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
509
4/4
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 12 times.
18 if(!getIsSimpleType(it->getType())){
510
4/4
✓ Branch 2 taken 6 times.
✓ Branch 5 taken 6 times.
✓ Branch 9 taken 6 times.
✓ Branch 12 taken 6 times.
6 PString attrName(it->getName()), attrDoc(it->getDocumentation());
511
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Setter of the "+attrName+"\n";
512
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "/**\t@param self : object "+className+"\n";
513
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += " * \t@param value : "+attrDoc+"\n";
514
1/1
✓ Branch 1 taken 6 times.
6 body += " * \t@param closure : object closure for python API (it is a wrapper python grosse bidouille)\n";
515
1/1
✓ Branch 1 taken 6 times.
6 body += " * \t@return 0 on success, -1 otherwise\n";
516
1/1
✓ Branch 1 taken 6 times.
6 body += "*/\n";
517
7/7
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
✓ Branch 16 taken 6 times.
✓ Branch 19 taken 6 times.
6 body += "int "+className+"_set"+attrName+"("+className+" * self, PyObject * value, void * closure){\n";
518
1/1
✓ Branch 1 taken 6 times.
6 body += "\tif(value == NULL){\n";
519
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\t\tPyErr_SetString(PyExc_TypeError, \"Cannot delete the "+className+"."+attrName+" attribute\");\n";
520
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\treturn -1;\n";
521
1/1
✓ Branch 1 taken 6 times.
6 body += "\t}\n";
522
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\tPy_DECREF(self->"+attrName+");\n";
523
1/1
✓ Branch 1 taken 6 times.
6 body += "\tPy_INCREF(value);\n";
524
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\tself->"+attrName+" = value;\n";
525
1/1
✓ Branch 1 taken 6 times.
6 body += "\treturn 0;\n";
526
1/1
✓ Branch 1 taken 6 times.
6 body += "}\n\n";
527
528
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Setter of the "+attrName+"\n";
529
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "/**\t@param self : object "+className+"\n";
530
1/1
✓ Branch 1 taken 6 times.
6 body += " * \t@param closure : object closure for python API (it is a wrapper python grosse bidouille)\n";
531
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += " * \t@return "+attrDoc+"\n";
532
1/1
✓ Branch 1 taken 6 times.
6 body += "*/\n";
533
7/7
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
✓ Branch 16 taken 6 times.
✓ Branch 19 taken 6 times.
6 body += "PyObject * "+className+"_get"+attrName+"("+className+" * self, void * closure){\n";
534
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\tPy_INCREF(self->"+attrName+");\n";
535
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\treturn self->"+attrName+";\n";
536
1/1
✓ Branch 1 taken 6 times.
6 body += "}\n\n";
537 6 }
538 }
539 12 return body;
540 6 }
541
542 ///Get the proper code for PyArg_ParseTuple with one object
543 /** @param varName : name of the variable to be checked
544 * @return corresponding C++
545 */
546 6 PString getObjectParseTuple(const PString & varName){
547 6 PString body;
548
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\tif(!PyArg_ParseTuple(args, \"O\", &"+varName+")){\n";
549
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\tPyErr_SetString(PyExc_RuntimeError, \"missing filename or keyword not supported\\n\");\n";
550
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\treturn NULL;\n";
551
1/1
✓ Branch 1 taken 6 times.
6 body += "\t}\n";
552 6 return body;
553 }
554
555 ///Do the implementation of data stream method _fromBytes for one class
556 /** @param classConfig : class configuration
557 * @param className : name of the current class
558 * @return corresponding C++
559 */
560 6 PString project_wrapper_classPythonFromBytes(const PClassConfig & classConfig, const PString & className){
561 6 PString body;
562
1/1
✓ Branch 1 taken 6 times.
6 const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
563
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Initialise a "+className+" with a ByteArray\n";
564
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "/**\t@param self : pointer to the "+className+"\n";
565
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += " * \t@param args : PyByteArray to initialise the "+className+"\n";
566
1/1
✓ Branch 1 taken 6 times.
6 body += " * \t@return Py_RETURN_NONE\n";
567
1/1
✓ Branch 1 taken 6 times.
6 body += "*/\n";
568
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyObject * "+className+"_fromBytes(PyObject *self, PyObject *args){\n";
569
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\t"+className+"* obj = ("+className+"*)self;\n";
570
1/1
✓ Branch 1 taken 6 times.
6 body += "\tPyObject * byteArray = NULL;\n";
571
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += getObjectParseTuple("byteArray");
572
1/1
✓ Branch 1 taken 6 times.
6 body += "\t//We hvae to check if byteArray is a 'bytearray'\n";
573
1/1
✓ Branch 1 taken 6 times.
6 body += "\tstd::string inputTypeName(PyUnicode_AsUTF8(PyType_GetName(Py_TYPE(byteArray))));\n";
574
1/1
✓ Branch 1 taken 6 times.
6 body += "\tif(inputTypeName != \"bytearray\"){\n";
575
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\t\tstd::string error(\""+className+"_fromBytes : cannot load "+className+" with given '\"+inputTypeName+\"', expecting 'bytearray'\\n\");\n";
576
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\tPyErr_SetString(PyExc_RuntimeError, error.c_str());\n";
577
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\treturn NULL;\n";
578
1/1
✓ Branch 1 taken 6 times.
6 body += "\t}\n";
579
1/1
✓ Branch 1 taken 6 times.
6 body += "\tsize_t nbByte = PyByteArray_Size(byteArray);\n";
580
1/1
✓ Branch 1 taken 6 times.
6 body += "\tif(nbByte == 0lu){\n";
581
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\tPy_RETURN_NONE;\n";
582
1/1
✓ Branch 1 taken 6 times.
6 body += "\t}\n";
583
1/1
✓ Branch 1 taken 6 times.
6 body += "\tDataStreamIter iter = (DataStreamIter)PyByteArray_AsString(byteArray);\n";
584
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\tif(!"+className+"_fromMessage(*obj, iter)){\n";
585
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\t\tPyErr_SetString(PyExc_RuntimeError, \""+className+"_fromBytes : cannot load "+className+" with given PyByteArray\\n\");\n";
586
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\treturn NULL;\n";
587
1/1
✓ Branch 1 taken 6 times.
6 body += "\t}\n";
588
1/1
✓ Branch 1 taken 6 times.
6 body += "\tPy_RETURN_NONE;\n";
589
1/1
✓ Branch 1 taken 6 times.
6 body += "}\n\n";
590
591
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Load a "+className+" from a DataStreamIter\n";
592
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "/**\t@param obj : reference to the "+className+"\n";
593
1/1
✓ Branch 1 taken 6 times.
6 body += " * \t@param iter : DataStreamIter to be used\n";
594
1/1
✓ Branch 1 taken 6 times.
6 body += " * \t@return true on success, false otherwise\n";
595
1/1
✓ Branch 1 taken 6 times.
6 body += "*/\n";
596
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "size_t "+className+"_fromMessage("+className+" & obj, DataStreamIter & iter){\n";
597
1/1
✓ Branch 1 taken 6 times.
6 body += "\tbool b(true);\n";
598
2/2
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
599
1/1
✓ Branch 2 taken 18 times.
18 const PString & attrName = it->getName();
600
5/5
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
✓ Branch 10 taken 18 times.
✓ Branch 13 taken 18 times.
18 body += "\tb &= "+className+"_"+attrName+"_fromMessage(obj, iter);\n";
601 }
602
1/1
✓ Branch 1 taken 6 times.
6 body += "\treturn b;\n";
603
1/1
✓ Branch 1 taken 6 times.
6 body += "}\n\n";
604 6 return body;
605 }
606
607 ///Call the check of a class
608 /** @param className : name of the class to be checked
609 * @param functionName : name of the function where it is called
610 * @return corresponding C++
611 */
612 12 PString projecy_wrapper_classCheckCall(const PString & className, const PString & functionName){
613 12 PString body;
614
1/1
✓ Branch 1 taken 12 times.
12 body += "\t//In case of emergency : check the integrity of the types before getting the size of to ensure all attributes have to good type\n";
615
1/1
✓ Branch 1 taken 12 times.
12 body += "\tstd::stringstream error(\"\");\n";
616
3/3
✓ Branch 1 taken 12 times.
✓ Branch 4 taken 12 times.
✓ Branch 7 taken 12 times.
12 body += "\tif(!"+className+"_check(error, *obj)){\n";
617
5/5
✓ Branch 1 taken 12 times.
✓ Branch 4 taken 12 times.
✓ Branch 7 taken 12 times.
✓ Branch 10 taken 12 times.
✓ Branch 13 taken 12 times.
12 body += "\t\tstd::string errorText(\""+functionName+" : check of class "+className+" failled\\n\" + error.str());\n";
618
1/1
✓ Branch 1 taken 12 times.
12 body += "\t\tPyErr_SetString(PyExc_RuntimeError, errorText.c_str());\n";
619
1/1
✓ Branch 1 taken 12 times.
12 body += "\t\treturn NULL;\n";
620
1/1
✓ Branch 1 taken 12 times.
12 body += "\t}\n";
621 12 return body;
622 }
623
624 ///Do the implementation of data stream method _toBytes for one class
625 /** @param classConfig : class configuration
626 * @param className : name of the current class
627 * @return corresponding C++
628 */
629 6 PString project_wrapper_classPythonToBytes(const PClassConfig & classConfig, const PString & className){
630 6 PString body;
631
1/1
✓ Branch 1 taken 6 times.
6 const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
632
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Convert a "+className+" to a ByteArray\n";
633
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "/**\t@param self : pointer to the "+className+"\n";
634
1/1
✓ Branch 1 taken 6 times.
6 body += " * \t@param args : not used\n";
635
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += " * \t@return PyByteArray which contains data of the "+className+"\n";
636
1/1
✓ Branch 1 taken 6 times.
6 body += "*/\n";
637
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyObject * "+className+"_toBytes(PyObject *self, PyObject *args){\n";
638
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\t"+className+"* obj = ("+className+"*)self;\n";
639
4/4
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
6 body += projecy_wrapper_classCheckCall(className, className+"_toBytes");
640
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\tsize_t nbByte = "+className+"_getSize(*obj);\n";
641
1/1
✓ Branch 1 taken 6 times.
6 body += "\tif(nbByte == 0lu){\n";
642
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\t\tPyErr_SetString(PyExc_RuntimeError, \"project_wrapper_classPythonToBytes : cannot serialise "+className+" of size 0 into a PyByteArray\\n\");\n";
643
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\treturn NULL;\n";
644
1/1
✓ Branch 1 taken 6 times.
6 body += "\t}\n";
645
1/1
✓ Branch 1 taken 6 times.
6 body += "\tDataStreamMsg msg(nbByte);\n";
646
1/1
✓ Branch 1 taken 6 times.
6 body += "\tDataStreamIter iter = msg.data();\n";
647
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\n";
648
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\tif(!"+className+"_toMessage(*obj, iter)){\n";
649
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\t\tPyErr_SetString(PyExc_RuntimeError, \"project_wrapper_dataStreamMethod : cannot save "+className+" into a PyByteArray\\n\");\n";
650
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\treturn NULL;\n";
651
1/1
✓ Branch 1 taken 6 times.
6 body += "\t}\n";
652
1/1
✓ Branch 1 taken 6 times.
6 body += "\treturn PyByteArray_FromStringAndSize((const char*)msg.data(), nbByte);\n";
653
1/1
✓ Branch 1 taken 6 times.
6 body += "}\n\n";
654
655
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Write a "+className+" in a DataStreamIter\n";
656
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "/**\t@param obj : reference to the "+className+"\n";
657
1/1
✓ Branch 1 taken 6 times.
6 body += " * \t@param iter : DataStreamIter to be used\n";
658
1/1
✓ Branch 1 taken 6 times.
6 body += " * \t@return true on success, false otherwise\n";
659
1/1
✓ Branch 1 taken 6 times.
6 body += "*/\n";
660
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "size_t "+className+"_toMessage("+className+" & obj, DataStreamIter & iter){\n";
661
1/1
✓ Branch 1 taken 6 times.
6 body += "\tbool b(true);\n";
662
2/2
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
663
1/1
✓ Branch 2 taken 18 times.
18 const PString & attrName = it->getName();
664
5/5
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
✓ Branch 10 taken 18 times.
✓ Branch 13 taken 18 times.
18 body += "\tb &= "+className+"_"+attrName+"_toMessage(obj, iter);\n";
665 }
666
1/1
✓ Branch 1 taken 6 times.
6 body += "\treturn b;\n";
667
1/1
✓ Branch 1 taken 6 times.
6 body += "}\n\n";
668 6 return body;
669 }
670
671 ///Do the implementation of data stream method _getSizeInByte for one class
672 /** @param classConfig : class configuration
673 * @param className : name of the current class
674 * @return corresponding C++
675 */
676 6 PString project_wrapper_classPythonGetSizeInBytes(const PClassConfig & classConfig, const PString & className){
677 6 PString body;
678
1/1
✓ Branch 1 taken 6 times.
6 const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
679
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Get the size in bytes of "+className+" for Python API\n";
680
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "/**\t@param self : pointer to the "+className+"\n";
681
1/1
✓ Branch 1 taken 6 times.
6 body += " * \t@param args : not used\n";
682
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += " * \t@return size of the "+className+" in bytes\n";
683
1/1
✓ Branch 1 taken 6 times.
6 body += "*/\n";
684
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyObject * "+className+"_getSizeInByte(PyObject *self, PyObject *args){\n";
685
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\t"+className+"* obj = ("+className+"*)self;\n";
686
4/4
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
6 body += projecy_wrapper_classCheckCall(className, className+"_getSizeInByte");
687
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "\tsize_t nbByte = "+className+"_getSize(*obj);\n";
688
1/1
✓ Branch 1 taken 6 times.
6 body += "\treturn Py_BuildValue(\"k\", nbByte);\n";
689
1/1
✓ Branch 1 taken 6 times.
6 body += "}\n\n";
690
691
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Get the size of a "+className+"\n";
692
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "/**\t@param obj : reference to the "+className+" to be used\n";
693
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += " * \t@return size of the "+className+" in bytes\n";
694
1/1
✓ Branch 1 taken 6 times.
6 body += "*/\n";
695
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "size_t "+className+"_getSize("+className+" & obj){\n";
696
1/1
✓ Branch 1 taken 6 times.
6 body += "\tsize_t nbByte(0lu);\n";
697
2/2
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
698
1/1
✓ Branch 2 taken 18 times.
18 const PString & attrName = it->getName();
699
5/5
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
✓ Branch 10 taken 18 times.
✓ Branch 13 taken 18 times.
18 body += "\tnbByte += "+className+"_"+attrName+"_getSize(obj);\n";
700 }
701
1/1
✓ Branch 1 taken 6 times.
6 body += "\treturn nbByte;\n";
702
1/1
✓ Branch 1 taken 6 times.
6 body += "}\n\n";
703 6 return body;
704 }
705
706 ///Do the implementation of from message of one attribute
707 /** @param className : name of the current class
708 * @param attr : current attribute
709 * @return corresponding C++
710 */
711 18 PString project_wrapper_classAttributeFromMessage(const PString & className, const PClassAttribute & attr){
712
1/1
✓ Branch 1 taken 18 times.
18 PString body;
713
2/2
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
18 const PString & attrName = attr.getName(), & type(attr.getType());
714
1/1
✓ Branch 1 taken 18 times.
18 bool isSimpleType(getIsSimpleType(type));
715
2/2
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
18 PString callAttr("self."+attrName);
716
5/5
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
✓ Branch 10 taken 18 times.
✓ Branch 13 taken 18 times.
18 body += "///Load a "+className+"."+attrName+" from a DataStreamMsg\n";
717
3/3
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
18 body += "/**\t@param self : reference to the "+className+"\n";
718
1/1
✓ Branch 1 taken 18 times.
18 body += " * \t@param iter : DataStreamIter to be used\n";
719
1/1
✓ Branch 1 taken 18 times.
18 body += " * \t@return true on success, false otherwise\n";
720
1/1
✓ Branch 1 taken 18 times.
18 body += "*/\n";
721
4/4
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
✓ Branch 10 taken 18 times.
36 PString functionName(className+"_" + attrName + "_fromMessage");
722
5/5
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
✓ Branch 10 taken 18 times.
✓ Branch 13 taken 18 times.
18 body += "bool "+functionName + "("+className+" & self, DataStreamIter & iter){\n";
723
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 6 times.
18 if(isSimpleType){
724
5/5
✓ Branch 1 taken 12 times.
✓ Branch 4 taken 12 times.
✓ Branch 7 taken 12 times.
✓ Branch 10 taken 12 times.
✓ Branch 13 taken 12 times.
12 body += "\treturn DataStream<DataStreamIter, DataStreamMode::READ, "+type+">::data_stream(iter, "+callAttr+");\n";
725
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 4 times.
6 }else if(type == "std::string"){
726
1/1
✓ Branch 1 taken 2 times.
2 body += "\tstd::string tmpStr(\"\");\n";
727
3/3
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
2 body += "\tif(!DataStream<DataStreamIter, DataStreamMode::READ, "+type+">::data_stream(iter, tmpStr)){return false;};\n";
728 // body += "\tself."+attrName+" = PyBytes_FromStringAndSize(tmpStr.c_str(), tmpStr.size());\n";
729 // body += "\tself."+attrName+" = PyUnicode_FromStringAndSize(tmpStr.c_str(), tmpStr.size());\n";
730
3/3
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
2 body += "\tself."+attrName+" = PyUnicode_DecodeFSDefaultAndSize(tmpStr.c_str(), tmpStr.size());\n";
731
1/1
✓ Branch 1 taken 2 times.
2 body += "\treturn true;\n";
732
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
4 }else if(type == "DataStreamMsg"){
733
1/1
✓ Branch 1 taken 1 times.
1 body += "\tDataStreamMsg message;\n";
734
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\tif(!DataStream<DataStreamIter, DataStreamMode::READ, "+type+">::data_stream(iter, message)){return false;};\n";
735
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\tself."+attrName+" = PyByteArray_FromStringAndSize((const char*)message.data(), message.size());\n";
736
1/1
✓ Branch 1 taken 1 times.
1 body += "\treturn true;\n";
737
3/3
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
3 }else if(generator_typeIsList(type)){
738
1/1
✓ Branch 1 taken 2 times.
2 body += "\tsize_t nbElement(0lu);\n";
739
1/1
✓ Branch 1 taken 2 times.
2 body += "\tif(!DataStream<DataStreamIter, DataStreamMode::READ, size_t>::data_stream(iter, nbElement)){return false;};\n";
740
1/1
✓ Branch 1 taken 2 times.
2 body += "\tif(nbElement == 0lu){return true;}\t//The list can be empty\n";
741
3/3
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
2 body += "\t"+callAttr+" = PyList_New(nbElement);\n";
742
1/1
✓ Branch 1 taken 2 times.
2 body += "\tfor(size_t i(0lu); i < nbElement; ++i){\t//Then we load the content of the list\n";
743
1/1
✓ Branch 1 taken 2 times.
2 PString nestedType(generator_getListNestedType(type));
744
3/3
✓ Branch 1 taken 2 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
2 if(getIsSimpleType(nestedType)){
745
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t\t"+nestedType+" value = 0;\n";
746
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t\tif(!DataStream<DataStreamIter, DataStreamMode::READ, "+nestedType+">::data_stream(iter, value)){return false;};\n";
747
4/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
1 body += "\t\tPyObject * el = "+wrapper_getValueToObject(nestedType)+"(value);\n";
748 // body += "\t\tPyObject * el = Py_BuildValue(\""+wrapper_getBuildValueStr(nestedType)+"\", value);\n";
749
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t\tPyList_SET_ITEM("+callAttr+", i, el);\n";
750 }else{
751
1/1
✓ Branch 1 taken 1 times.
1 body += "\t\t//If it is not a predefined type, we cannot deal with it\n";
752
9/9
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
✓ Branch 13 taken 1 times.
✓ Branch 16 taken 1 times.
✓ Branch 19 taken 1 times.
✓ Branch 22 taken 1 times.
✓ Branch 25 taken 1 times.
1 body += "\t\tWP"+nestedType+" * el = (WP"+nestedType+"*)WP"+nestedType+"_newC(&WP"+nestedType+"Type, NULL, NULL);\n";
753
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t\tif(!WP"+nestedType+"_fromMessage(*el, iter)){return false;}\n";
754
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t\tPyList_SET_ITEM("+callAttr+", i, el);\n";
755 }
756
1/1
✓ Branch 1 taken 2 times.
2 body += "\t}\n";
757
1/1
✓ Branch 1 taken 2 times.
2 body += "\treturn true;\n";
758
2/3
✓ Branch 2 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
3 }else if(attr.getIsEnum()){
759
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t//TODO : implement the load from a message of type "+type+"\n";
760
1/1
✓ Branch 1 taken 1 times.
1 body += "\t//We know, for sure it is an Enum but we have to figure out how we are supposed to deal with it inside the wrapper\n";
761
1/1
✓ Branch 1 taken 1 times.
1 body += "\t//And I really wanted to avoid to call the interpreter once more each time we want to deserialise an Enum\n";
762
1/1
✓ Branch 1 taken 1 times.
1 body += "\tint enumValue = 0;\n";
763
1/1
✓ Branch 1 taken 1 times.
1 body += "\tif(!DataStream<DataStreamIter, DataStreamMode::READ, int>::data_stream(iter, enumValue)){\n";
764
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t\tstd::cerr << \""+functionName+" : cannot read enum value\" << std::endl;\n";
765
1/1
✓ Branch 1 taken 1 times.
1 body += "\t\treturn false;\n";
766
1/1
✓ Branch 1 taken 1 times.
1 body += "\t}\n";
767 // body += "\tif(PyObject_SetAttrString("+callAttr+", \"value\", PyLong_FromLong(enumValue)) != 0){\n";
768 // body += "\t\tstd::cerr << \""+functionName+" : cannot set enum value(\"<<enumValue<<\") in PyObject\" << std::endl;\n";
769 // body += "\t\treturn false;\n";
770 // body += "\t}\n";
771
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\tstd::map<int, std::string>::const_iterator it = WP"+type+"EnumValue.find(enumValue);\n";
772
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\tif(it == WP"+type+"EnumValue.end()){\n";
773
5/5
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
✓ Branch 13 taken 1 times.
1 body += "\t\tstd::cerr << \""+functionName+" : cannot find enum value \" << enumValue << \" in map WP"+type+"EnumValue\" << std::endl;\n";
774
1/1
✓ Branch 1 taken 1 times.
1 body += "\t\treturn false;\n";
775
1/1
✓ Branch 1 taken 1 times.
1 body += "\t}\n";
776
777
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\tPy_DECREF("+callAttr+");\n";
778
7/7
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
✓ Branch 13 taken 1 times.
✓ Branch 16 taken 1 times.
✓ Branch 19 taken 1 times.
1 body += "\t"+callAttr+" = WP"+type+"_newGeneric(\"_var_______ = "+type+".\" + it->second, \"_var_______\");\n";
779
1/1
✓ Branch 1 taken 1 times.
1 body += "\treturn true;\n";
780
781 // body += "\treturn PyObject_SetAttrString("+callAttr+", \"name\", PyUnicode_FromStringAndSize(it->second.c_str(), it->second.size())) == 0;\n";
782 }else{
783 body += "\t//TODO : implement the load from a message of type "+type+"\n";
784 body += "\treturn true;\n";
785 }
786
1/1
✓ Branch 1 taken 18 times.
18 body += "}\n\n";
787
788 36 return body;
789 18 }
790
791 ///Do the implementation of to message of one attribute
792 /** @param className : name of the current class
793 * @param attr : current attribute
794 * @return corresponding C++
795 */
796 18 PString project_wrapper_classAttributeToMessage(const PString & className, const PClassAttribute & attr){
797
1/1
✓ Branch 1 taken 18 times.
18 PString body;
798
2/2
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
18 const PString & attrName = attr.getName(), & type(attr.getType());
799
1/1
✓ Branch 1 taken 18 times.
18 bool isSimpleType(getIsSimpleType(type));
800
2/2
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
18 PString callAttr("self."+attrName);
801
5/5
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
✓ Branch 10 taken 18 times.
✓ Branch 13 taken 18 times.
18 body += "///Convert a "+className+"."+attrName+" to a DataStreamMsg\n";
802
3/3
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
18 body += "/**\t@param self : reference to the "+className+"\n";
803
1/1
✓ Branch 1 taken 18 times.
18 body += " * \t@param iter : DataStreamIter to be used\n";
804
1/1
✓ Branch 1 taken 18 times.
18 body += " * \t@return true on success, false otherwise\n";
805
1/1
✓ Branch 1 taken 18 times.
18 body += "*/\n";
806
7/7
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
✓ Branch 10 taken 18 times.
✓ Branch 13 taken 18 times.
✓ Branch 16 taken 18 times.
✓ Branch 19 taken 18 times.
18 body += "bool "+className+"_" + attrName + "_toMessage("+className+" & self, DataStreamIter & iter){\n";
807
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 6 times.
18 if(isSimpleType){
808
5/5
✓ Branch 1 taken 12 times.
✓ Branch 4 taken 12 times.
✓ Branch 7 taken 12 times.
✓ Branch 10 taken 12 times.
✓ Branch 13 taken 12 times.
12 body += "\treturn DataStream<DataStreamIter, DataStreamMode::WRITE, "+type+">::data_stream(iter, "+callAttr+");\n";
809
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 4 times.
6 }else if(type == "std::string"){
810 // body += "\tsize_t nbChar(PyUnicode_GetLength("+callAttr+"));\n"; //PyUnicode_GET_LENGTH
811
1/1
✓ Branch 1 taken 2 times.
2 body += "\tlong nbChar(0lu);\n";
812
3/3
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
2 body += "\tconst char * ptr = PyUnicode_AsUTF8AndSize("+callAttr+", &nbChar);\n";
813
814
1/1
✓ Branch 1 taken 2 times.
2 body += "\tif(!DataStream<DataStreamIter, DataStreamMode::WRITE, long>::data_stream(iter, nbChar)){return false;}\n";
815 // body += "\tconst char * ptr = PyBytes_AsString("+callAttr+");\n"; //PyBytes_AsString
816
1/1
✓ Branch 1 taken 2 times.
2 body += "\treturn DataStream<DataStreamIter, DataStreamMode::WRITE, char>::data_stream(iter, (char*)ptr, nbChar);\n";
817
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
4 }else if(type == "DataStreamMsg"){
818
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\tsize_t nbByte(PyByteArray_Size("+callAttr+"));\n";
819
1/1
✓ Branch 1 taken 1 times.
1 body += "\tif(!DataStream<DataStreamIter, DataStreamMode::WRITE, size_t>::data_stream(iter, nbByte)){return false;}\n";
820
1/1
✓ Branch 1 taken 1 times.
1 body += "\tif(nbByte == 0lu){return true;}\t//The bytearray can be empty\n";
821
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\tDataStreamIter dataPtr = (DataStreamIter)PyByteArray_AsString("+callAttr+");\n";
822
1/1
✓ Branch 1 taken 1 times.
1 body += "\treturn DataStream<DataStreamIter, DataStreamMode::WRITE, DataStreamType>::data_stream(iter, dataPtr, nbByte);\n";
823
3/3
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
3 }else if(generator_typeIsList(type)){
824
3/3
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
2 body += "\tsize_t nbElement(PyByteArray_Size("+callAttr+"));\n";
825
1/1
✓ Branch 1 taken 2 times.
2 body += "\tif(!DataStream<DataStreamIter, DataStreamMode::WRITE, size_t>::data_stream(iter, nbElement)){return false;}\n";
826
1/1
✓ Branch 1 taken 2 times.
2 body += "\tif(nbElement == 0lu){return true;}\t//The list can be empty\n";
827
1/1
✓ Branch 1 taken 2 times.
2 body += "\tfor(size_t i(0lu); i < nbElement; ++i){\t//Then the content of the list\n";
828
1/1
✓ Branch 1 taken 2 times.
2 PString nestedType(generator_getListNestedType(type));
829
3/3
✓ Branch 1 taken 2 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
2 if(getIsSimpleType(nestedType)){
830
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t\tPyObject * el = PyList_GET_ITEM("+callAttr+", i);\n";
831
6/6
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
✓ Branch 13 taken 1 times.
✓ Branch 16 taken 1 times.
1 body += "\t\t"+nestedType+" value = "+wrapper_getObjectToValue(nestedType)+"(el);\n";
832
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t\tif(!DataStream<DataStreamIter, DataStreamMode::WRITE, "+nestedType+">::data_stream(iter, value)){return false;}\n";
833 }else{
834
1/1
✓ Branch 1 taken 1 times.
1 body += "\t\t//If it is not a predefined type, we cannot deal with it\n";
835
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t\tPyObject * el = PyList_GET_ITEM("+callAttr+", i);\n";
836
5/5
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
✓ Branch 13 taken 1 times.
1 body += "\t\tif(!WP"+nestedType+"_toMessage((WP"+nestedType+"&)*el, iter)){return false;}\n";
837 }
838
1/1
✓ Branch 1 taken 2 times.
2 body += "\t}\n";
839
1/1
✓ Branch 1 taken 2 times.
2 body += "\treturn true;\n";
840
2/3
✓ Branch 2 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
3 }else if(attr.getIsEnum()){
841
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t//TODO : implement the save to a message of type "+type+"\n";
842
1/1
✓ Branch 1 taken 1 times.
1 body += "\t//We know, for sure it is an Enum but we have to figure out how we are supposed to deal with it inside the wrapper\n";
843
1/1
✓ Branch 1 taken 1 times.
1 body += "\t//And I really wanted to avoid to call the interpreter once more each time we want to serialise an Enum\n";
844
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\tPyObject * attrValue = PyObject_GetAttrString("+callAttr+", \"value\");\n";
845
1/1
✓ Branch 1 taken 1 times.
1 body += "\tif(attrValue == NULL){return false;}\n";
846
1/1
✓ Branch 1 taken 1 times.
1 body += "\t//Now we have to get the integer inside the attribute\n";
847
1/1
✓ Branch 1 taken 1 times.
1 body += "\tint enumValue = PyLong_AsInt(attrValue);\n";
848
1/1
✓ Branch 1 taken 1 times.
1 body += "\treturn DataStream<DataStreamIter, DataStreamMode::WRITE, int>::data_stream(iter, enumValue);\n";
849 }else{
850 body += "\t//TODO : implement the save to a message of type "+type+"\n";
851 body += "\treturn true;\n";
852 }
853
1/1
✓ Branch 1 taken 18 times.
18 body += "}\n\n";
854 36 return body;
855 18 }
856
857 ///Do the implementation of get size of one attribute
858 /** @param classConfig : class configuration
859 * @param className : name of the current class
860 * @return corresponding C++
861 */
862 18 PString project_wrapper_classAttributeGetSize(const PString & className, const PClassAttribute & attr){
863
1/1
✓ Branch 1 taken 18 times.
18 PString body;
864
2/2
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
18 const PString & attrName = attr.getName(), & type(attr.getType());
865
1/1
✓ Branch 1 taken 18 times.
18 bool isSimpleType(getIsSimpleType(type));
866
2/2
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
18 PString callAttr("self."+attrName);
867
5/5
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
✓ Branch 10 taken 18 times.
✓ Branch 13 taken 18 times.
18 body += "///Get the size of "+className+"."+attrName+" in bytes\n";
868
3/3
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
18 body += "/**\t@param self : reference to the "+className+"\n";
869
5/5
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
✓ Branch 10 taken 18 times.
✓ Branch 13 taken 18 times.
18 body += " * \t@return size of "+className+"."+attrName+" in bytes\n";
870
1/1
✓ Branch 1 taken 18 times.
18 body += "*/\n";
871
7/7
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 7 taken 18 times.
✓ Branch 10 taken 18 times.
✓ Branch 13 taken 18 times.
✓ Branch 16 taken 18 times.
✓ Branch 19 taken 18 times.
18 body += "size_t "+className+"_" + attrName + "_getSize("+className+" & self){\n";
872
1/1
✓ Branch 1 taken 18 times.
18 body += "\tsize_t nbByte(0lu);\n";
873
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 6 times.
18 if(isSimpleType){
874
5/5
✓ Branch 1 taken 12 times.
✓ Branch 4 taken 12 times.
✓ Branch 7 taken 12 times.
✓ Branch 10 taken 12 times.
✓ Branch 13 taken 12 times.
12 body += "\tDataStream<size_t, DataStreamMode::WRITE, "+type+">::data_stream(nbByte, "+callAttr+");\n";
875
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 4 times.
6 }else if(type == "std::string"){
876
3/3
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
2 body += "\tnbByte += sizeof(size_t) + PyUnicode_GetLength("+callAttr+");\n"; //PyBytes_Size
877
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
4 }else if(type == "DataStreamMsg"){
878
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\tnbByte += sizeof(size_t) + PyByteArray_Size("+callAttr+");\n"; //PyBytes_Size
879
3/3
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
3 }else if(generator_typeIsList(type)){
880
1/1
✓ Branch 1 taken 2 times.
2 body += "\tnbByte += sizeof(size_t);\t//First the size of the number of elements in the list\n";
881
1/1
✓ Branch 1 taken 2 times.
2 PString nestedType(generator_getListNestedType(type));
882
3/3
✓ Branch 1 taken 2 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
2 if(getIsSimpleType(nestedType)){
883
5/5
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
✓ Branch 13 taken 1 times.
1 body += "\tnbByte += sizeof("+nestedType+")*PyList_Size("+callAttr+");\t//Then the content of the list\n";
884 }else{
885
1/1
✓ Branch 1 taken 1 times.
1 body += "\t//If it is not a predefined type, we cannot deal with it\n";
886
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\tfor(long i(0l); i < PyList_Size("+callAttr+"); ++i){\t//Then the content of the list\n";
887
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t\tPyObject * el = PyList_GET_ITEM("+callAttr+", i);\n";
888
5/5
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
✓ Branch 13 taken 1 times.
1 body += "\t\tnbByte += WP"+nestedType+"_getSize((WP"+nestedType+"&)*el);\n";
889
1/1
✓ Branch 1 taken 1 times.
1 body += "\t}\n";
890 }
891
2/3
✓ Branch 2 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
3 }else if(attr.getIsEnum()){
892
1/1
✓ Branch 1 taken 1 times.
1 body += "\t//The size of an Enum is the size of an integer\n";
893
1/1
✓ Branch 1 taken 1 times.
1 body += "\tnbByte += sizeof(int);\n";
894 }else{
895 body += "\t//TODO : implement the get size of type "+type+"\n";
896 }
897
1/1
✓ Branch 1 taken 18 times.
18 body += "\treturn nbByte;\n";
898
1/1
✓ Branch 1 taken 18 times.
18 body += "}\n\n";
899 36 return body;
900 18 }
901
902 ///Do the implementation of data stream method for one class
903 /** @param classConfig : class configuration
904 * @param className : name of the current class
905 * @return corresponding C++
906 */
907 6 PString project_wrapper_dataStreamMethod(const PClassConfig & classConfig, const PString & className){
908 6 PString body;
909
2/2
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
6 body += project_wrapper_classPythonFromBytes(classConfig, className);
910
2/2
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
6 body += project_wrapper_classPythonToBytes(classConfig, className);
911
2/2
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
6 body += project_wrapper_classPythonGetSizeInBytes(classConfig, className);
912
1/1
✓ Branch 1 taken 6 times.
6 const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
913
2/2
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
914
2/2
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
18 body += project_wrapper_classAttributeFromMessage(className, *it);
915
2/2
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
18 body += project_wrapper_classAttributeToMessage(className, *it);
916
2/2
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
18 body += project_wrapper_classAttributeGetSize(className, *it);
917 }
918 6 return body;
919 }
920
921 ///Do the check call of an attribute of a given class
922 /** @param className : name of the class the attribute belongs to
923 * @param attr : class attribute to be checked
924 * @param moduleName : name of the module where the class should be defined
925 * @param expectedType : expected type by respected to the configuration .pdata
926 * @return corresponding C++
927 */
928 6 PString project_wrapper_callAttributeCheck(const PString & className, const PClassAttribute & attr, const PString & moduleName, const PString & expectedType){
929
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 PString body, attrType(attr.getType()), attrName(attr.getName());
930
2/2
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
6 PString typeNameVar(attrName+"Name");
931
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\tstd::string "+typeNameVar+"(PyUnicode_AsUTF8(PyType_GetName(Py_TYPE(obj."+attrName+"))));\n";
932
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\tif("+typeNameVar+" != \""+expectedType+"\"){\n";
933
9/9
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
✓ Branch 16 taken 6 times.
✓ Branch 19 taken 6 times.
✓ Branch 22 taken 6 times.
✓ Branch 25 taken 6 times.
6 body += "\t\terror << \"- Type of attribute "+className+"::"+attrName+" is '\"<<"+typeNameVar+"<<\"' and not expected '"+expectedType+"'\\n\";\n";
934
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\tb = false;\n";
935
1/1
✓ Branch 1 taken 6 times.
6 body += "\t}\n";
936 12 return body;
937 6 }
938
939 ///Do the check implementation of class
940 /** @param classConfig : class configuration
941 * @param moduleName : name of the module where the class should be defined
942 * @return corresponding C++
943 */
944 6 PString project_wrapper_classImplCheck(const PClassConfig & classConfig, const PString & moduleName){
945
4/4
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
6 PString body, className("WP"+classConfig.getName());
946
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Check if the "+className+" contains all the expected types\n";
947
1/1
✓ Branch 1 taken 6 times.
6 body += "/**\t@param[out] error : error to be set if there is one\n";
948
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += " * \t@param obj : reference to the "+className+"\n";
949
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += " * \t@return true if the class "+className+" contains expected types, false otherwise\n";
950
1/1
✓ Branch 1 taken 6 times.
6 body += "*/\n";
951
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "bool "+className+"_check(std::stringstream & error, const "+className+" & obj){\n";
952
1/1
✓ Branch 1 taken 6 times.
6 body += "\tbool b(true);\n";
953
1/1
✓ Branch 1 taken 6 times.
6 const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
954
2/2
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
955
2/2
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
18 PString attrType(it->getType());
956
3/3
✓ Branch 1 taken 18 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 6 times.
18 if(getIsSimpleType(attrType)){
957 12 continue;
958 }
959
2/2
✓ Branch 2 taken 6 times.
✓ Branch 5 taken 6 times.
6 PString attrName(it->getName());
960
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\t//Check of the attribute "+attrName+" of type "+attrType+"\n";
961
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 4 times.
6 if(attrType == "std::string"){
962
3/3
✓ Branch 1 taken 2 times.
✓ Branch 5 taken 2 times.
✓ Branch 8 taken 2 times.
2 body += project_wrapper_callAttributeCheck(className, *it, moduleName, "str");
963
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3 times.
4 }else if(attrType == "DataStreamMsg"){
964
3/3
✓ Branch 1 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
1 body += project_wrapper_callAttributeCheck(className, *it, moduleName, "bytearray");
965
3/3
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
3 }else if(generator_typeIsList(attrType)){
966
1/1
✓ Branch 1 taken 2 times.
2 PString nestedType(generator_getListNestedType(attrType));
967
3/3
✓ Branch 1 taken 2 times.
✓ Branch 5 taken 2 times.
✓ Branch 8 taken 2 times.
2 body += project_wrapper_callAttributeCheck(className, *it, moduleName, "list");
968
3/3
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
2 body += "\t//Now we have to check all elements of "+attrName+"\n";
969
3/3
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
2 body += "\tif(b){\t//If obj."+attrName+" is not a list we will have a problem\n";
970
3/3
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
2 body += "\t\tfor(long i(0l); i < PyList_Size(obj."+attrName+"); ++i){\n";
971
3/3
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
2 body += "\t\t\tPyObject * el = PyList_GET_ITEM(obj."+attrName+", i);\n";
972
1/1
✓ Branch 1 taken 2 times.
2 body += "\t\t\tstd::string elType(PyUnicode_AsUTF8(PyType_GetName(Py_TYPE(el))));\n";
973
3/3
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
4 PString expectedType(moduleName + "." + nestedType);
974
3/3
✓ Branch 1 taken 2 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
2 if(getIsSimpleType(nestedType)){
975
2/2
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
1 expectedType = wrapper_getExpectedType(nestedType);
976 }else{
977
7/7
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
✓ Branch 13 taken 1 times.
✓ Branch 16 taken 1 times.
✓ Branch 19 taken 1 times.
1 body += "\t\t\t//TODO : For some reason python and ipython agree to tell type("+nestedType+") is "+expectedType+" but during my test I get "+nestedType+" so I add it but I don't know why\n";
978 }
979
5/5
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
✓ Branch 10 taken 2 times.
✓ Branch 13 taken 2 times.
2 body += "\t\t\tif(elType != \""+expectedType+"\" && elType != \""+nestedType+"\"){\n";
980
7/7
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
✓ Branch 10 taken 2 times.
✓ Branch 13 taken 2 times.
✓ Branch 16 taken 2 times.
✓ Branch 19 taken 2 times.
2 body += "\t\t\t\terror << \"- Type of element "+className+"::"+attrName+"[\"<<i<<\"] is '\"+elType+\"' and not expected '"+expectedType+"'\\n\";\n";
981
1/1
✓ Branch 1 taken 2 times.
2 body += "\t\t\t\tb = false;\n";
982
1/1
✓ Branch 1 taken 2 times.
2 body += "\t\t\t}\n";
983
1/1
✓ Branch 1 taken 2 times.
2 body += "\t\t}\n";
984
1/1
✓ Branch 1 taken 2 times.
2 body += "\t}\n";
985
2/3
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
3 }else if(it->getIsEnum()){
986
1/1
✓ Branch 1 taken 1 times.
1 body += "\t//Let's check the enum\n";
987
3/3
✓ Branch 2 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 9 taken 1 times.
1 body += project_wrapper_callAttributeCheck(className, *it, moduleName, it->getType());
988 }
989
2/2
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 12 times.
18 }
990
1/1
✓ Branch 1 taken 6 times.
6 body += "\treturn b;\n";
991
1/1
✓ Branch 1 taken 6 times.
6 body += "}\n\n";
992 12 return body;
993 6 }
994
995 ///Create the Python type of the given class
996 /** @param classConfig : class to be used
997 * @param moduleName : name of the module where the class should be defined
998 * @param fromOtherType : name of an other PyTypeObject to inheritate
999 * @return corresponding C++
1000 */
1001 PString project_wrapper_enumImplPythonType(const PClassConfig & classConfig, const PString & moduleName, const PString & fromOtherType){
1002 PString body, className("WP"+classConfig.getName());
1003 //TODO : remove this function
1004 body += "///Define the type of the "+className+"\n";
1005 body += "PyTypeObject "+className+"Type = {\n";
1006 body += "\tPyVarObject_HEAD_INIT("+fromOtherType+", 0)\n";
1007 body += "\t\""+moduleName+"."+classConfig.getName()+"\", /* tp_name */\n";
1008 body += "\tsizeof("+className+"), /* tp_basicsize */\n";
1009 body += "\t0, /* tp_itemsize */\n";
1010 body += "\t(destructor)"+className+"_dealloc, /* tp_dealloc */\n";
1011 body += "\t0, /* tp_print */\n";
1012 body += "\t0, /* tp_getattr */\n";
1013 body += "\t0, /* tp_setattr */\n";
1014 body += "\t0, /* tp_reserved */\n";
1015 body += "\t0, /* tp_repr */\n";
1016 body += "\t0, /* tp_as_number */\n";
1017 body += "\t0, /* tp_as_sequence */\n";
1018 body += "\t0, /* tp_as_mapping */\n";
1019 body += "\t0, /* tp_hash */\n";
1020 body += "\t0, /* tp_call */\n";
1021 body += "\t0, /* tp_str */\n";
1022 body += "\tPyObject_GenericGetAttr, /* tp_getattro */\n";
1023 body += "\t0, /* tp_setattro */\n";
1024 body += "\t0, /* tp_as_buffer */\n";
1025 body += "\tPy_TPFLAGS_DEFAULT |\n";
1026 body += "\tPy_TPFLAGS_BASETYPE, /* tp_flags */\n";
1027 body += "\t\""+className+" doc : "+classConfig.getClassDocumentation().replace("///", "")+"\", /* tp_doc */\n";
1028 body += "\t0, /* tp_traverse */\n";
1029 body += "\t0, /* tp_clear */\n";
1030 body += "\t0, /* tp_richcompare */\n";
1031 body += "\t0, /* tp_weaklistoffset */\n";
1032 body += "\t0, /* tp_iter */\n";
1033 body += "\t0, /* tp_iternext */\n";
1034 body += "\t"+className+"_methods, /* tp_methods */\n";
1035 body += "\t"+className+"_members, /* tp_members */\n";
1036 body += "\t"+className+"_getseters,/* tp_getset */\n";
1037 body += "\t0, /* tp_base */\n";
1038 body += "\t0, /* tp_dict */\n";
1039 body += "\t0, /* tp_descr_get */\n";
1040 body += "\t0, /* tp_descr_set */\n";
1041 body += "\t0, /* tp_dictoffset */\n";
1042 body += "\t0, /* tp_init */\n";
1043 body += "\tPyType_GenericAlloc, /* tp_alloc */\n";
1044 body += "\t"+className+"_newC, /* tp_new */\n";
1045 body += "};\n\n";
1046 return body;
1047 }
1048
1049 ///Implement new and dealloc
1050 /** @param classConfig : class configuration
1051 * @param moduleName : name of the module where the class should be defined
1052 * @return corresponding C++
1053 */
1054 1 PString project_wrapper_enumImplNewc(const PClassConfig & classConfig){
1055
1/1
✓ Branch 1 taken 1 times.
1 const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
1056
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 PString body, pythonClassName(classConfig.getName());
1057
2/2
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
1 PString className("WP"+pythonClassName);
1058
1/8
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
1 if(vecAttr.size() == 0lu){return "#error \""+className+" error : Missing enum values as attribute !\"";}
1059
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "///Generic function to create a "+className+" or a variable\n";
1060
1/1
✓ Branch 1 taken 1 times.
1 body += "/**\t@param extraPythonCode : extra python code to be added to the existing one\n";
1061
1/1
✓ Branch 1 taken 1 times.
1 body += " * \t@param objectName : name of the object to get\n";
1062
1/1
✓ Branch 1 taken 1 times.
1 body += " * \t@return pointer to the asked object name or NULL if the object was not found\n";
1063
1/1
✓ Branch 1 taken 1 times.
1 body += "*/\n";
1064
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "PyObject* "+className+"_newGeneric(const std::string & extraPythonCode, const std::string & objectName){\n";
1065
1/1
✓ Branch 1 taken 1 times.
1 body += "\t//First let's write the python code in a string\n";
1066
1/1
✓ Branch 1 taken 1 times.
1 body += "\t//Important note : it there is no default value of the enumerate values, we get a nice segmentation fault because why not\n";
1067
1/1
✓ Branch 1 taken 1 times.
1 body += "\tstd::string pythonStr(\"from enum import Enum\\n\"\n";
1068
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t\t\"class "+pythonClassName+"(Enum):\\n\"\n";
1069
2/2
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 times.
3 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
1070
3/3
✓ Branch 2 taken 2 times.
✓ Branch 5 taken 2 times.
✓ Branch 8 taken 2 times.
2 body += "\t\t\"\t"+it->getName();
1071
3/3
✓ Branch 2 taken 2 times.
✓ Branch 5 taken 2 times.
✓ Branch 8 taken 2 times.
2 body += " = " + it->getDefaultValue();
1072
1/1
✓ Branch 1 taken 2 times.
2 body += "\\n\"\n";
1073 }
1074
1/1
✓ Branch 1 taken 1 times.
1 body += "\t\t\"\tdef getTypeName():\\n\"\n";
1075
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t\t\"\t\treturn \\\""+pythonClassName+"\\\"\\n\"\n";
1076
1/1
✓ Branch 1 taken 1 times.
1 body += "\t\t\"\");\n";
1077
1/1
✓ Branch 1 taken 1 times.
1 body += "\tpythonStr += extraPythonCode;\n";
1078
1/1
✓ Branch 1 taken 1 times.
1 body += "\t//Now, we create the global dictionnary of python\n";
1079
1/1
✓ Branch 1 taken 1 times.
1 body += "\tPyObject *global_dict = PyDict_New(), *outputEnum = NULL;\n";
1080
1/1
✓ Branch 1 taken 1 times.
1 body += "\tif(global_dict){\t//If we can create the global_dict\n";
1081
1/1
✓ Branch 1 taken 1 times.
1 body += "\t\tif(PyRun_String(pythonStr.c_str(), Py_file_input, global_dict, global_dict)){\t//If Python is happy\n";
1082
1/1
✓ Branch 1 taken 1 times.
1 body += "\t\t\t//We try to get our enum back from the interpretor\n";
1083
1/1
✓ Branch 1 taken 1 times.
1 body += "\t\t\toutputEnum = PyDict_GetItemString(global_dict, objectName.c_str());\n";
1084
1/1
✓ Branch 1 taken 1 times.
1 body += "\t\t}\n";
1085
1/1
✓ Branch 1 taken 1 times.
1 body += "\t}\n";
1086
1/1
✓ Branch 1 taken 1 times.
1 body += "\tif(!outputEnum){\n";
1087
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "\t\tPyErr_SetString(PyExc_KeyError, \""+className+"_newGeneric : could not get 'objectName' with the ugly trick due to the fact that using an enum in a wrapper is even worst than using numpy\");\n";
1088
1/1
✓ Branch 1 taken 1 times.
1 body += "\t}else{\n";
1089
1/1
✓ Branch 1 taken 1 times.
1 body += "\t\tPy_INCREF(outputEnum);\n";
1090
1/1
✓ Branch 1 taken 1 times.
1 body += "\t}\n";
1091
1/1
✓ Branch 1 taken 1 times.
1 body += "\tPy_XDECREF(global_dict);\n";
1092
1/1
✓ Branch 1 taken 1 times.
1 body += "\treturn outputEnum;\n";
1093
1/1
✓ Branch 1 taken 1 times.
1 body += "}\n\n";
1094
1095
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "///Allocate the "+className+"\n";
1096
1/1
✓ Branch 1 taken 1 times.
1 body += "/**\t@param type : type variable\n";
1097
1/1
✓ Branch 1 taken 1 times.
1 body += " * \t@param args : args variable\n";
1098
1/1
✓ Branch 1 taken 1 times.
1 body += " * \t@param kwds : kwds variable\n";
1099
1/1
✓ Branch 1 taken 1 times.
1 body += " * \t@return object to be allocated\n";
1100
1/1
✓ Branch 1 taken 1 times.
1 body += "*/\n";
1101
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "PyObject * "+className+"_newC(PyTypeObject * type, PyObject * args, PyObject * kwds){\n";
1102
1/1
✓ Branch 1 taken 1 times.
1 body += "\t//Here, we will use a very ugly trick but since we are doing python nobody will notice\n";
1103
5/5
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
✓ Branch 13 taken 1 times.
1 body += "\tPyObject* outputEnum = "+className+"_newGeneric(\"\", \""+pythonClassName+"\");\n";
1104
1/1
✓ Branch 1 taken 1 times.
1 body += "\treturn outputEnum;\n";
1105
1/1
✓ Branch 1 taken 1 times.
1 body += "}\n\n";
1106
1107
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "///Allocate the "+className+"\n";
1108
1/1
✓ Branch 1 taken 1 times.
1 body += "/**\t@param type : type variable\n";
1109
1/1
✓ Branch 1 taken 1 times.
1 body += " * \t@param args : args variable\n";
1110
1/1
✓ Branch 1 taken 1 times.
1 body += " * \t@param kwds : kwds variable\n";
1111
1/1
✓ Branch 1 taken 1 times.
1 body += " * \t@return object to be allocated\n";
1112
1/1
✓ Branch 1 taken 1 times.
1 body += "*/\n";
1113
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "PyObject * "+className+"_newAttributeC(){\n";
1114
1/1
✓ Branch 1 taken 1 times.
1 body += "\t//Here, we will use a very ugly trick but since we are doing python nobody will notice\n";
1115
8/8
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 8 taken 1 times.
✓ Branch 11 taken 1 times.
✓ Branch 14 taken 1 times.
✓ Branch 17 taken 1 times.
✓ Branch 20 taken 1 times.
✓ Branch 23 taken 1 times.
1 body += "\tPyObject* outputEnum = "+className+"_newGeneric(\"_var_______ = "+pythonClassName+"."+vecAttr.front().getName()+"\\n\\n\", \"_var_______\");\n";
1116
1/1
✓ Branch 1 taken 1 times.
1 body += "\treturn outputEnum;\n";
1117
1/1
✓ Branch 1 taken 1 times.
1 body += "}\n\n";
1118
1/1
✓ Branch 1 taken 1 times.
1 return body;
1119 1 }
1120
1121
1122 ///Do the implementation of one enum
1123 /** @param classConfig : class configuration
1124 * @param moduleName : name of the module where the class should be defined
1125 * @return corresponding C++
1126 */
1127 1 PString project_wrapper_enumImpl(const PClassConfig & classConfig, const PString & moduleName){
1128
4/4
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 10 taken 1 times.
1 PString body, className("WP"+classConfig.getName());
1129
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
1 body += "const std::map<int, std::string> "+className+"EnumValue = {\n";
1130
1/1
✓ Branch 1 taken 1 times.
1 body += "\t";
1131
1/1
✓ Branch 1 taken 1 times.
1 PString comma("");
1132
1/1
✓ Branch 1 taken 1 times.
1 const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
1133
2/2
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 times.
3 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
1134
1/1
✓ Branch 1 taken 2 times.
2 body += comma;
1135
7/7
✓ Branch 2 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 9 taken 2 times.
✓ Branch 12 taken 2 times.
✓ Branch 15 taken 2 times.
✓ Branch 18 taken 2 times.
✓ Branch 21 taken 2 times.
2 body += "{"+it->getDefaultValue()+", \""+it->getName()+"\"}";
1136
1/1
✓ Branch 1 taken 2 times.
2 comma = ",\n\t";
1137 }
1138
1/1
✓ Branch 1 taken 1 times.
1 body += "\n};\n\n";
1139
1140 // body += "///Getters and setters of the class "+className+"\n";
1141 // body += "PyGetSetDef "+className+"_getseters[] = {\n";
1142 // //Only for complex types
1143 // const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
1144 // for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
1145 // body += "\t{(char*)\""+it->getName()+"\", (getter)"+className+"_get"+it->getName()+", (setter)"+className+"_set"+it->getName()+", (char*)\""+it->getDocumentation().replace("///", "")+"\", NULL},\n";
1146 // }
1147 // body += "\t{NULL} /* Sentinel */\n";
1148 // body += "};\n\n";
1149 // body += "///Members of class "+className+"\n";
1150 // body += "PyMemberDef "+className+"_members[] = {\n";
1151 // body += "\t{NULL} /* Sentinel */\n";
1152 // body += "};\n\n";
1153 // body += "///Methods of class "+className+"\n";
1154 // body += "PyMethodDef "+className+"_methods[] = {\n";
1155 // body += "\t{\"getTypeName\", (PyCFunction)"+className+"_getTypeName, METH_NOARGS | METH_STATIC, \"Doc : Get the type name of "+className+" for TypeStream compatibility\"},\n";
1156 // body += "\t{\"fromBytes\", (PyCFunction)"+className+"_fromBytes, METH_VARARGS, \"Doc : load a "+className+" from PyByteArray\"},\n";
1157 // body += "\t{\"toBytes\", (PyCFunction)"+className+"_toBytes, METH_NOARGS, \"Doc : convert a "+className+" to PyByteArray\"},\n";
1158 // body += "\t{\"getSize\", (PyCFunction)"+className+"_getSizeInByte, METH_NOARGS, \"Doc : Get the size of "+className+" in bytes\"},\n";
1159
1160 //We have to put methods for DataStream and TypeStream here
1161 // body += "\t{NULL, NULL} /* Sentinel */\n";
1162 // body += "};\n\n";
1163 // body += project_wrapper_enumImplPythonType(classConfig, moduleName, "&PyEnum_Type");
1164 // body += "///Get the type name of "+className+" for TypeStream compatibility\n";
1165 // body += "/**\t@return type name of "+className+"\n";
1166 // body += "*/\n";
1167 // body += "PyObject * "+className+"_getTypeName(PyObject *self, PyObject *args){\n";
1168 // body += "\tstd::string name(\""+classConfig.getName()+"\");\n";
1169 // body += "\treturn Py_BuildValue(\"s\", name.c_str());\n";
1170 // body += "}\n\n";
1171
1172
2/2
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
1 body += project_wrapper_enumImplNewc(classConfig);
1173 // body += project_wrapper_classImplDealloc(classConfig);
1174 // body += project_wrapper_classImplGetterSetter(classConfig);
1175
1176 2 return body;
1177 1 }
1178
1179 ///Do the implementation of one classe
1180 /** @param classConfig : class configuration
1181 * @param moduleName : name of the module where the class should be defined
1182 * @return corresponding C++
1183 */
1184 6 PString project_wrapper_classImpl(const PClassConfig & classConfig, const PString & moduleName){
1185
4/4
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
6 PString body, className("WP"+classConfig.getName());
1186
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Getters and setters of the class "+className+"\n";
1187
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyGetSetDef "+className+"_getseters[] = {\n";
1188 //Only for complex types
1189
1/1
✓ Branch 1 taken 6 times.
6 const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
1190
2/2
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
1191
4/4
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
✓ Branch 7 taken 12 times.
✓ Branch 8 taken 6 times.
18 if(getIsSimpleType(it->getType())){
1192 12 continue;
1193 }
1194
20/20
✓ Branch 2 taken 6 times.
✓ Branch 5 taken 6 times.
✓ Branch 8 taken 6 times.
✓ Branch 11 taken 6 times.
✓ Branch 15 taken 6 times.
✓ Branch 19 taken 6 times.
✓ Branch 23 taken 6 times.
✓ Branch 26 taken 6 times.
✓ Branch 29 taken 6 times.
✓ Branch 32 taken 6 times.
✓ Branch 35 taken 6 times.
✓ Branch 38 taken 6 times.
✓ Branch 41 taken 6 times.
✓ Branch 44 taken 6 times.
✓ Branch 47 taken 6 times.
✓ Branch 50 taken 6 times.
✓ Branch 53 taken 6 times.
✓ Branch 56 taken 6 times.
✓ Branch 59 taken 6 times.
✓ Branch 62 taken 6 times.
6 body += "\t{(char*)\""+it->getName()+"\", (getter)"+className+"_get"+it->getName()+", (setter)"+className+"_set"+it->getName()+", (char*)\""+it->getDocumentation().replace("///", "")+"\", NULL},\n";
1195 }
1196
1197
1/1
✓ Branch 1 taken 6 times.
6 body += "\t{NULL} /* Sentinel */\n";
1198
1/1
✓ Branch 1 taken 6 times.
6 body += "};\n\n";
1199
1200 //Only for simple types
1201
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Members of class "+className+"\n";
1202
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyMemberDef "+className+"_members[] = {\n";
1203
2/2
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
1204
4/4
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 12 times.
18 if(!getIsSimpleType(it->getType())){
1205 6 continue;
1206 }
1207
19/19
✓ Branch 2 taken 12 times.
✓ Branch 5 taken 12 times.
✓ Branch 8 taken 12 times.
✓ Branch 11 taken 12 times.
✓ Branch 15 taken 12 times.
✓ Branch 19 taken 12 times.
✓ Branch 22 taken 12 times.
✓ Branch 26 taken 12 times.
✓ Branch 29 taken 12 times.
✓ Branch 32 taken 12 times.
✓ Branch 35 taken 12 times.
✓ Branch 38 taken 12 times.
✓ Branch 41 taken 12 times.
✓ Branch 44 taken 12 times.
✓ Branch 47 taken 12 times.
✓ Branch 50 taken 12 times.
✓ Branch 53 taken 12 times.
✓ Branch 56 taken 12 times.
✓ Branch 59 taken 12 times.
12 body += "\t{(char*)\""+it->getName()+"\", "+getPythonStrForPythonApiType(it->getType())+", offsetof("+className+", "+it->getName()+"), 0, (char*)\"Doc : "+it->getDocumentation().replace("///", "")+"\"},\n";
1208 }
1209
1/1
✓ Branch 1 taken 6 times.
6 body += "\t{NULL} /* Sentinel */\n";
1210
1/1
✓ Branch 1 taken 6 times.
6 body += "};\n\n";
1211 // METH_VARARGS
1212
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Methods of class "+className+"\n";
1213
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyMethodDef "+className+"_methods[] = {\n";
1214
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\t{\"getTypeName\", (PyCFunction)"+className+"_getTypeName, METH_NOARGS | METH_STATIC, \"Doc : Get the type name of "+className+" for TypeStream compatibility\"},\n";
1215
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\t{\"fromBytes\", (PyCFunction)"+className+"_fromBytes, METH_VARARGS, \"Doc : load a "+className+" from PyByteArray\"},\n";
1216
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\t{\"toBytes\", (PyCFunction)"+className+"_toBytes, METH_NOARGS, \"Doc : convert a "+className+" to PyByteArray\"},\n";
1217
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\t{\"getSize\", (PyCFunction)"+className+"_getSizeInByte, METH_NOARGS, \"Doc : Get the size of "+className+" in bytes\"},\n";
1218
1219 //We have to put methods for DataStream and TypeStream here
1220
1/1
✓ Branch 1 taken 6 times.
6 body += "\t{NULL, NULL} /* Sentinel */\n";
1221
1/1
✓ Branch 1 taken 6 times.
6 body += "};\n\n";
1222
1223
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += project_wrapper_classImplPythonType(classConfig, moduleName, "NULL");
1224
2/2
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
6 body += project_wrapper_classImplCheck(classConfig, moduleName);
1225
1226
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "///Get the type name of "+className+" for TypeStream compatibility\n";
1227
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "/**\t@return type name of "+className+"\n";
1228
1/1
✓ Branch 1 taken 6 times.
6 body += "*/\n";
1229
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "PyObject * "+className+"_getTypeName(PyObject *self, PyObject *args){\n";
1230
4/4
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
6 body += "\tstd::string name(\""+classConfig.getName()+"\");\n";
1231
1/1
✓ Branch 1 taken 6 times.
6 body += "\treturn Py_BuildValue(\"s\", name.c_str());\n";
1232
1/1
✓ Branch 1 taken 6 times.
6 body += "}\n\n";
1233
1234
2/2
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
6 body += project_wrapper_classImplNewc(classConfig);
1235
2/2
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
6 body += project_wrapper_classImplDealloc(classConfig);
1236
2/2
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
6 body += project_wrapper_classImplGetterSetter(classConfig);
1237
2/2
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
6 body += project_wrapper_dataStreamMethod(classConfig, className);
1238
1239 12 return body;
1240 6 }
1241
1242 ///Do the implementation of all classes
1243 /** @param vecClassConfig : vector of class configuration
1244 * @param moduleName : name of the module where the class should be defined
1245 * @return corresponding C++
1246 */
1247 5 PString project_wrapper_allClassImpl(const std::vector<PClassConfig> & vecClassConfig, const PString & moduleName){
1248 5 PString body;
1249
2/2
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 5 times.
12 for(std::vector<PClassConfig>::const_iterator it(vecClassConfig.begin()); it != vecClassConfig.end(); ++it){
1250
3/3
✓ Branch 2 taken 7 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 6 times.
7 if(it->getIsEnum()){
1251
2/2
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
1 body += project_wrapper_enumImpl(*it, moduleName);
1252 }else{
1253
2/2
✓ Branch 2 taken 6 times.
✓ Branch 5 taken 6 times.
6 body += project_wrapper_classImpl(*it, moduleName);
1254 }
1255 }
1256 5 return body;
1257 }
1258
1259 ///Create the wrapper module source
1260 /** @param wrapperSource : path of the wrapper source
1261 * @param projectConfig : config of the project
1262 * @param baseImplInclude : basic include of the module implementation
1263 * @param vecClassConfig : vector of class configuration
1264 * @param vecInclude : vector of includes
1265 * @return true on success, false otherwise
1266 */
1267 5 bool project_wrapper_moduleGeneratorWrapperImpl(const PPath & wrapperSource, const ProjectConfig & projectConfig, const PString & baseImplInclude, const std::vector<PClassConfig> & vecClassConfig, const PVecPath & vecInclude){
1268
1/1
✓ Branch 1 taken 5 times.
5 PString body;
1269
2/2
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
5 body += licenceSaveStr();
1270
1/1
✓ Branch 1 taken 5 times.
5 body += "\n";
1271
1272
1/1
✓ Branch 1 taken 5 times.
5 body += "#define NO_IMPORT_ARRAY\n";
1273
1274
1/1
✓ Branch 1 taken 5 times.
5 body += "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\n";
1275
1/1
✓ Branch 1 taken 5 times.
5 body += "#ifndef DISABLE_COOL_ARRAY\n";
1276
4/4
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
✓ Branch 10 taken 5 times.
5 body += "#\tdefine PY_ARRAY_UNIQUE_SYMBOL "+baseImplInclude.toLower()+"_ARRAY_API\n";
1277
1/1
✓ Branch 1 taken 5 times.
5 body += "#endif\n";
1278 // body += "#include \"numpy/ndarraytypes.h\"\n";
1279
1/1
✓ Branch 1 taken 5 times.
5 body += "#include \"numpy/arrayobject.h\"\n";
1280
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
5 body += "#include \""+ baseImplInclude + "_wrapper.h\"\n";
1281
1/1
✓ Branch 1 taken 5 times.
5 body += "\n";
1282
5/5
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
✓ Branch 10 taken 5 times.
✓ Branch 13 taken 5 times.
5 body += project_wrapper_allClassImpl(vecClassConfig, "py"+projectConfig.name.toLower());
1283
1/1
✓ Branch 1 taken 5 times.
5 body += "\n";
1284
1285
1/1
✓ Branch 1 taken 5 times.
10 return wrapperSource.saveFileContent(body);
1286 5 }
1287
1288 ///Create the wrapper module
1289 /** @param modulePath : path of the module
1290 * @param projectConfig : config of the project
1291 * @param baseImplInclude : basic include of the module implementation
1292 * @param vecClassConfig : vector of class configuration
1293 * @param vecInclude : vector of includes
1294 * @return true on success, false otherwise
1295 */
1296 5 bool project_wrapper_moduleGenerator(const PPath & modulePath, const ProjectConfig & projectConfig, const PString & baseImplInclude, const std::vector<PClassConfig> & vecClassConfig, const PVecPath & vecInclude){
1297
5/5
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
✓ Branch 10 taken 5 times.
✓ Branch 13 taken 5 times.
10 PPath mainModuleFile(modulePath / PPath(projectConfig.name.toLower() + "_module.cpp"));
1298
2/3
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
5 if(!project_wrapper_moduleGeneratorMain(mainModuleFile, projectConfig, baseImplInclude, vecClassConfig, vecInclude)){return false;}
1299 //TODO : Need to save the class definition, with struct, type, getter, setter, method to get the name of the type in TypeStream, magic with DataStream to avoid data copy
1300
1301
4/4
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
✓ Branch 10 taken 5 times.
10 PPath wrapperHeader(modulePath / PPath(baseImplInclude + "_wrapper.h"));
1302
2/3
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
5 if(!project_wrapper_moduleGeneratorWrapperHeader(wrapperHeader, projectConfig, baseImplInclude, vecClassConfig, vecInclude)){return false;}
1303
1304
4/4
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
✓ Branch 10 taken 5 times.
10 PPath wrapperSource(modulePath / PPath(baseImplInclude + "_wrapper.cpp"));
1305
2/3
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
5 if(!project_wrapper_moduleGeneratorWrapperImpl(wrapperSource, projectConfig, baseImplInclude, vecClassConfig, vecInclude)){return false;}
1306
1307 5 return true;
1308 5 }
1309
1310
1311