/** * @file GlobalFunction.cpp * * @date Jul 22, 2012 * @author Alex Cunningham */ #include "GlobalFunction.h" #include "utilities.h" #include #include namespace wrap { using namespace std; /* ************************************************************************* */ void GlobalFunction::addOverload(bool verbose, const std::string& name, const ArgumentList& args, const ReturnValue& retVal, const StrVec& ns_stack) { this->verbose_ = verbose; this->name = name; this->argLists.push_back(args); this->returnVals.push_back(retVal); this->namespaces.push_back(ns_stack); } /* ************************************************************************* */ void GlobalFunction::matlab_proxy(const std::string& toolboxPath, const std::string& wrapperName, const TypeAttributesTable& typeAttributes, FileWriter& wrapperFile, std::vector& functionNames) const { // cluster overloads with same namespace // create new GlobalFunction structures around namespaces - same namespaces and names are overloads // map of namespace to global function typedef map GlobalFunctionMap; GlobalFunctionMap grouped_functions; for (size_t i=0; i& functionNames) const { // create the folder for the namespace const StrVec& ns = namespaces.front(); createNamespaceStructure(ns, toolboxPath); // open destination mfunctionFileName string mfunctionFileName = toolboxPath; if(!ns.empty()) mfunctionFileName += "/+" + wrap::qualifiedName("/+", ns); mfunctionFileName += "/" + name + ".m"; FileWriter mfunctionFile(mfunctionFileName, verbose_, "%"); // get the name of actual matlab object const string matlabQualName = qualifiedName(".", ns, name), matlabUniqueName = qualifiedName("", ns, name), cppName = qualifiedName("::", ns, name); mfunctionFile.oss << "function varargout = " << name << "(varargin)\n"; for(size_t overload = 0; overload < argLists.size(); ++overload) { const ArgumentList& args = argLists[overload]; const ReturnValue& returnVal = returnVals[overload]; size_t nrArgs = args.size(); const int id = functionNames.size(); // Output proxy matlab code // check for number of arguments... mfunctionFile.oss << (overload==0?"":"else") << "if length(varargin) == " << nrArgs; if (nrArgs>0) mfunctionFile.oss << " && "; // ...and their types bool first = true; for(size_t i=0;i(id); // call wrapperFile.oss << "void " << wrapFunctionName << "(int nargout, mxArray *out[], int nargin, const mxArray *in[])\n"; // start wrapperFile.oss << "{\n"; returnVal.wrapTypeUnwrap(wrapperFile); // check arguments // NOTE: for static functions, there is no object passed wrapperFile.oss << " checkArguments(\"" << matlabUniqueName << "\",nargout,nargin," << args.size() << ");\n"; // unwrap arguments, see Argument.cpp args.matlab_unwrap(wrapperFile,0); // We start at 0 because there is no self object // call method with default type and wrap result if (returnVal.type1!="void") returnVal.wrap_result(cppName+"("+args.names()+")", wrapperFile, typeAttributes); else wrapperFile.oss << cppName+"("+args.names()+");\n"; // finish wrapperFile.oss << "}\n"; // Add to function list functionNames.push_back(wrapFunctionName); } mfunctionFile.oss << "else\n"; mfunctionFile.oss << " error('Arguments do not match any overload of function " << matlabQualName << "');" << endl; mfunctionFile.oss << "end" << endl; // Close file mfunctionFile.emit(true); } /* ************************************************************************* */ } // \namespace wrap