Create table of RTTI type names at wrap module creation time - will support code to create most derived type from base type in matlab wrapper
parent
ee5f4c3145
commit
af11b6c0a0
|
@ -412,7 +412,46 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co
|
|||
wrapperFile.oss << " " << collectorName << ".erase(iter++);\n";
|
||||
wrapperFile.oss << " }\n";
|
||||
}
|
||||
wrapperFile.oss << "}\n";
|
||||
wrapperFile.oss << "}\n\n";
|
||||
|
||||
// generate RTTI registry (for returning derived-most types)
|
||||
{
|
||||
// Generate static class and instance to get all RTTI type names
|
||||
wrapperFile.oss <<
|
||||
"static bool _RTTIRegister_" << name << "_done = false;\n"
|
||||
"void _" << name << "_RTTIRegister() {\n"
|
||||
" std::map<std::string, std::string> types;\n"
|
||||
" cout << \"in get\" << endl;\n";
|
||||
BOOST_FOREACH(const Class& cls, classes) {
|
||||
if(cls.isVirtual)
|
||||
wrapperFile.oss <<
|
||||
" types.insert(std::make_pair(typeid(" << cls.qualifiedName("::") << ").name(), \"" << cls.qualifiedName() << "\"));\n";
|
||||
}
|
||||
wrapperFile.oss << "\n";
|
||||
|
||||
// Generate another static class and instance to add RTTI types to a MATLAB global variable
|
||||
wrapperFile.oss <<
|
||||
" cout << \"in register\" << endl;\n"
|
||||
" mxArray *registry = mexGetVariable(\"global\", \"_gtsamwrap_rttiRegistry\");\n"
|
||||
" cout << \"registry = \" << registry << endl;\n"
|
||||
" if(!registry)\n"
|
||||
" registry = mxCreateStructMatrix(1, 1, 0, NULL);\n"
|
||||
" typedef std::pair<std::string, std::string> StringPair;\n"
|
||||
" BOOST_FOREACH(const StringPair& rtti_matlab, types) {\n"
|
||||
" cout << rtti_matlab.first << \" -> \" << rtti_matlab.second << endl;\n"
|
||||
" int fieldId = mxAddField(registry, rtti_matlab.first.c_str());\n"
|
||||
" if(fieldId < 0)\n"
|
||||
" mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n"
|
||||
" mxArray *matlabName = mxCreateString(rtti_matlab.second.c_str());\n"
|
||||
" mxSetFieldByNumber(registry, 0, fieldId, matlabName);\n"
|
||||
" }\n"
|
||||
" if(mexPutVariable(\"global\", \"gtsamwrap_rttiRegistry\", registry) != 0)\n"
|
||||
" mexErrMsgTxt(\"gtsam wrap: Error indexing RTTI types, inheritance will not work correctly\");\n"
|
||||
" cout << \"Stored\" << endl;\n"
|
||||
" mxDestroyArray(registry);\n"
|
||||
"}\n"
|
||||
"\n";
|
||||
}
|
||||
|
||||
// create proxy class and wrapper code
|
||||
BOOST_FOREACH(const Class& cls, classes) {
|
||||
|
@ -433,6 +472,10 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co
|
|||
file.oss << "{\n";
|
||||
file.oss << " mstream mout;\n"; // Send stdout to MATLAB console, see matlab.h
|
||||
file.oss << " std::streambuf *outbuf = std::cout.rdbuf(&mout);\n\n";
|
||||
file.oss << " if(!_RTTIRegister_" << name << "_done) {\n";
|
||||
file.oss << " _" << name << "_RTTIRegister();\n";
|
||||
file.oss << " _RTTIRegister_" << name << "_done = true;\n";
|
||||
file.oss << " }\n";
|
||||
file.oss << " int id = unwrap<int>(in[0]);\n\n";
|
||||
file.oss << " switch(id) {\n";
|
||||
for(size_t id = 0; id < functionNames.size(); ++id) {
|
||||
|
|
Loading…
Reference in New Issue