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 |