Made TemplateSubstitution into an operator, and added stream operator
parent
fe481dc775
commit
482dbd9226
|
@ -31,11 +31,7 @@ using namespace wrap;
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
Argument Argument::expandTemplate(const TemplateSubstitution& ts) const {
|
Argument Argument::expandTemplate(const TemplateSubstitution& ts) const {
|
||||||
Argument instArg = *this;
|
Argument instArg = *this;
|
||||||
if (type.name == ts.templateArg) {
|
instArg.type = ts(type);
|
||||||
instArg.type = ts.qualifiedType;
|
|
||||||
} else if (type.name == "This") {
|
|
||||||
instArg.type = ts.expandedClass;
|
|
||||||
}
|
|
||||||
return instArg;
|
return instArg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -274,13 +274,15 @@ void Class::addMethod(bool verbose, bool is_const, Str methodName,
|
||||||
Str templateArgName, const vector<Qualified>& templateArgValues) {
|
Str templateArgName, const vector<Qualified>& templateArgValues) {
|
||||||
// Check if templated
|
// Check if templated
|
||||||
if (!templateArgName.empty() && templateArgValues.size() > 0) {
|
if (!templateArgName.empty() && templateArgValues.size() > 0) {
|
||||||
|
cout << methodName << endl;
|
||||||
// Create method to expand
|
// Create method to expand
|
||||||
// For all values of the template argument, create a new method
|
// For all values of the template argument, create a new method
|
||||||
BOOST_FOREACH(const Qualified& instName, templateArgValues) {
|
BOOST_FOREACH(const Qualified& instName, templateArgValues) {
|
||||||
const TemplateSubstitution ts(templateArgName, instName, this->name);
|
const TemplateSubstitution ts(templateArgName, instName, this->name);
|
||||||
|
cout << ts << endl;
|
||||||
// substitute template in arguments
|
// substitute template in arguments
|
||||||
ArgumentList expandedArgs = argumentList.expandTemplate(ts);
|
ArgumentList expandedArgs = argumentList.expandTemplate(ts);
|
||||||
// do the same for return types
|
// do the same for return type
|
||||||
ReturnValue expandedRetVal = returnValue.expandTemplate(ts);
|
ReturnValue expandedRetVal = returnValue.expandTemplate(ts);
|
||||||
// Now stick in new overload stack with expandedMethodName key
|
// Now stick in new overload stack with expandedMethodName key
|
||||||
// but note we use the same, unexpanded methodName in overload
|
// but note we use the same, unexpanded methodName in overload
|
||||||
|
|
|
@ -88,7 +88,7 @@ public:
|
||||||
std::string fullType = arg.type.qualifiedName("::");
|
std::string fullType = arg.type.qualifiedName("::");
|
||||||
if (find(validArgs.begin(), validArgs.end(), fullType)
|
if (find(validArgs.begin(), validArgs.end(), fullType)
|
||||||
== validArgs.end())
|
== validArgs.end())
|
||||||
throw DependencyMissing(fullType, s);
|
throw DependencyMissing(fullType, "checking argument of " + s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -125,7 +125,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO use transform ?
|
// TODO use transform ?
|
||||||
std::vector<ReturnValue> ExpandReturnValuesTemplate(
|
std::vector<ReturnValue> expandReturnValuesTemplate(
|
||||||
const TemplateSubstitution& ts) const {
|
const TemplateSubstitution& ts) const {
|
||||||
std::vector<ReturnValue> result;
|
std::vector<ReturnValue> result;
|
||||||
BOOST_FOREACH(const ReturnValue& retVal, returnVals_) {
|
BOOST_FOREACH(const ReturnValue& retVal, returnVals_) {
|
||||||
|
@ -140,7 +140,7 @@ public:
|
||||||
// substitute template in arguments
|
// substitute template in arguments
|
||||||
argLists_ = expandArgumentListsTemplate(ts);
|
argLists_ = expandArgumentListsTemplate(ts);
|
||||||
// do the same for return types
|
// do the same for return types
|
||||||
returnVals_ = ExpandReturnValuesTemplate(ts);
|
returnVals_ = expandReturnValuesTemplate(ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
// emit a list of comments, one for each overload
|
// emit a list of comments, one for each overload
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
/**
|
||||||
|
* @file ReturnType.cpp
|
||||||
|
* @date Nov 13, 2014
|
||||||
|
* @author Frank Dellaert
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ReturnType.h"
|
||||||
|
#include "utilities.h"
|
||||||
|
#include <boost/foreach.hpp>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace wrap;
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
string ReturnType::str(bool add_ptr) const {
|
||||||
|
return maybe_shared_ptr(add_ptr && isPtr, qualifiedName("::"), name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
void ReturnType::wrap_result(const string& out, const string& result,
|
||||||
|
FileWriter& wrapperFile, const TypeAttributesTable& typeAttributes) const {
|
||||||
|
|
||||||
|
string cppType = qualifiedName("::"), matlabType = qualifiedName(".");
|
||||||
|
|
||||||
|
if (category == CLASS) {
|
||||||
|
string objCopy, ptrType;
|
||||||
|
ptrType = "Shared" + name;
|
||||||
|
const bool isVirtual = typeAttributes.at(cppType).isVirtual;
|
||||||
|
if (isVirtual) {
|
||||||
|
if (isPtr)
|
||||||
|
objCopy = result;
|
||||||
|
else
|
||||||
|
objCopy = result + ".clone()";
|
||||||
|
} else {
|
||||||
|
if (isPtr)
|
||||||
|
objCopy = result;
|
||||||
|
else
|
||||||
|
objCopy = ptrType + "(new " + cppType + "(" + result + "))";
|
||||||
|
}
|
||||||
|
wrapperFile.oss << out << " = wrap_shared_ptr(" << objCopy << ",\""
|
||||||
|
<< matlabType << "\", " << (isVirtual ? "true" : "false") << ");\n";
|
||||||
|
} else if (isPtr) {
|
||||||
|
wrapperFile.oss << " Shared" << name << "* ret = new Shared" << name << "("
|
||||||
|
<< result << ");" << endl;
|
||||||
|
wrapperFile.oss << out << " = wrap_shared_ptr(ret,\"" << matlabType
|
||||||
|
<< "\");\n";
|
||||||
|
} else if (matlabType != "void")
|
||||||
|
wrapperFile.oss << out << " = wrap< " << str(false) << " >(" << result
|
||||||
|
<< ");\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
void ReturnType::wrapTypeUnwrap(FileWriter& wrapperFile) const {
|
||||||
|
if (category == CLASS)
|
||||||
|
wrapperFile.oss << " typedef boost::shared_ptr<" << qualifiedName("::")
|
||||||
|
<< "> Shared" << name << ";" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
/**
|
||||||
|
* @file ReturnValue.h
|
||||||
|
* @brief Encapsulates a return type of a method
|
||||||
|
* @date Nov 13, 2014
|
||||||
|
* @author Frank Dellaert
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Qualified.h"
|
||||||
|
#include "FileWriter.h"
|
||||||
|
#include "TypeAttributesTable.h"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace wrap {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encapsulates return value of a method or function
|
||||||
|
*/
|
||||||
|
struct ReturnType: Qualified {
|
||||||
|
|
||||||
|
/// the different supported return value categories
|
||||||
|
typedef enum {
|
||||||
|
CLASS = 1, EIGEN = 2, BASIS = 3, VOID = 4
|
||||||
|
} return_category;
|
||||||
|
|
||||||
|
bool isPtr;
|
||||||
|
return_category category;
|
||||||
|
|
||||||
|
ReturnType() :
|
||||||
|
isPtr(false), category(CLASS) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnType(const std::string& name) :
|
||||||
|
isPtr(false), category(CLASS) {
|
||||||
|
Qualified::name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rename(const Qualified& q) {
|
||||||
|
name = q.name;
|
||||||
|
namespaces = q.namespaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check if this type is in a set of valid types
|
||||||
|
template<class TYPES>
|
||||||
|
void verify(TYPES validtypes, const std::string& s) const {
|
||||||
|
std::string key = qualifiedName("::");
|
||||||
|
if (find(validtypes.begin(), validtypes.end(), key) == validtypes.end())
|
||||||
|
throw DependencyMissing(key, "checking return type of " + s);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
friend struct ReturnValue;
|
||||||
|
|
||||||
|
std::string str(bool add_ptr) const;
|
||||||
|
|
||||||
|
/// Example: out[1] = wrap_shared_ptr(pairResult.second,"Test", false);
|
||||||
|
void wrap_result(const std::string& out, const std::string& result,
|
||||||
|
FileWriter& wrapperFile, const TypeAttributesTable& typeAttributes) const;
|
||||||
|
|
||||||
|
/// Creates typedef
|
||||||
|
void wrapTypeUnwrap(FileWriter& wrapperFile) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} // \namespace wrap
|
|
@ -1,6 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* @file ReturnValue.cpp
|
* @file ReturnValue.cpp
|
||||||
*
|
|
||||||
* @date Dec 1, 2011
|
* @date Dec 1, 2011
|
||||||
* @author Alex Cunningham
|
* @author Alex Cunningham
|
||||||
* @author Andrew Melim
|
* @author Andrew Melim
|
||||||
|
@ -15,62 +14,11 @@
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace wrap;
|
using namespace wrap;
|
||||||
|
|
||||||
/* ************************************************************************* */
|
|
||||||
string ReturnType::str(bool add_ptr) const {
|
|
||||||
return maybe_shared_ptr(add_ptr && isPtr, qualifiedName("::"), name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ************************************************************************* */
|
|
||||||
void ReturnType::wrap_result(const string& out, const string& result,
|
|
||||||
FileWriter& file, const TypeAttributesTable& typeAttributes) const {
|
|
||||||
|
|
||||||
string cppType = qualifiedName("::"), matlabType = qualifiedName(".");
|
|
||||||
|
|
||||||
if (category == CLASS) {
|
|
||||||
string objCopy, ptrType;
|
|
||||||
ptrType = "Shared" + name;
|
|
||||||
const bool isVirtual = typeAttributes.at(cppType).isVirtual;
|
|
||||||
if (isVirtual) {
|
|
||||||
if (isPtr)
|
|
||||||
objCopy = result;
|
|
||||||
else
|
|
||||||
objCopy = result + ".clone()";
|
|
||||||
} else {
|
|
||||||
if (isPtr)
|
|
||||||
objCopy = result;
|
|
||||||
else
|
|
||||||
objCopy = ptrType + "(new " + cppType + "(" + result + "))";
|
|
||||||
}
|
|
||||||
file.oss << out << " = wrap_shared_ptr(" << objCopy << ",\"" << matlabType
|
|
||||||
<< "\", " << (isVirtual ? "true" : "false") << ");\n";
|
|
||||||
} else if (isPtr) {
|
|
||||||
file.oss << " Shared" << name << "* ret = new Shared" << name << "("
|
|
||||||
<< result << ");" << endl;
|
|
||||||
file.oss << out << " = wrap_shared_ptr(ret,\"" << matlabType << "\");\n";
|
|
||||||
} else if (matlabType != "void")
|
|
||||||
file.oss << out << " = wrap< " << str(false) << " >(" << result << ");\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ************************************************************************* */
|
|
||||||
void ReturnType::wrapTypeUnwrap(FileWriter& wrapperFile) const {
|
|
||||||
if (category == CLASS)
|
|
||||||
wrapperFile.oss << " typedef boost::shared_ptr<" << qualifiedName("::")
|
|
||||||
<< "> Shared" << name << ";" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
ReturnValue ReturnValue::expandTemplate(const TemplateSubstitution& ts) const {
|
ReturnValue ReturnValue::expandTemplate(const TemplateSubstitution& ts) const {
|
||||||
ReturnValue instRetVal = *this;
|
ReturnValue instRetVal = *this;
|
||||||
if (type1.name == ts.templateArg) {
|
instRetVal.type1 = ts(type1);
|
||||||
instRetVal.type1.rename(ts.qualifiedType);
|
if (isPair) instRetVal.type2 = ts(type2);
|
||||||
} else if (type1.name == "This") {
|
|
||||||
instRetVal.type1.rename(ts.expandedClass);
|
|
||||||
}
|
|
||||||
if (type2.name == ts.templateArg) {
|
|
||||||
instRetVal.type2.rename(ts.qualifiedType);
|
|
||||||
} else if (type2.name == "This") {
|
|
||||||
instRetVal.type2.rename(ts.expandedClass);
|
|
||||||
}
|
|
||||||
return instRetVal;
|
return instRetVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
* @file ReturnValue.h
|
* @file ReturnValue.h
|
||||||
*
|
*
|
||||||
* @brief Encapsulates a return value from a method
|
* @brief Encapsulates a return value from a method
|
||||||
*
|
|
||||||
* @date Dec 1, 2011
|
* @date Dec 1, 2011
|
||||||
* @author Alex Cunningham
|
* @author Alex Cunningham
|
||||||
* @author Richard Roberts
|
* @author Richard Roberts
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "ReturnType.h"
|
||||||
#include "TemplateSubstitution.h"
|
#include "TemplateSubstitution.h"
|
||||||
#include "FileWriter.h"
|
#include "FileWriter.h"
|
||||||
#include "TypeAttributesTable.h"
|
#include "TypeAttributesTable.h"
|
||||||
|
@ -18,57 +18,7 @@
|
||||||
namespace wrap {
|
namespace wrap {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encapsulates return value of a method or function
|
* Encapsulates return type of a method or function, possibly a pair
|
||||||
*/
|
|
||||||
struct ReturnType: Qualified {
|
|
||||||
|
|
||||||
/// the different supported return value categories
|
|
||||||
typedef enum {
|
|
||||||
CLASS = 1, EIGEN = 2, BASIS = 3, VOID = 4
|
|
||||||
} return_category;
|
|
||||||
|
|
||||||
bool isPtr;
|
|
||||||
return_category category;
|
|
||||||
|
|
||||||
ReturnType() :
|
|
||||||
isPtr(false), category(CLASS) {
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnType(const std::string& name) :
|
|
||||||
isPtr(false), category(CLASS) {
|
|
||||||
Qualified::name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
void rename(const Qualified& q) {
|
|
||||||
name = q.name;
|
|
||||||
namespaces = q.namespaces;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Check if this type is in a set of valid types
|
|
||||||
template<class TYPES>
|
|
||||||
void verify(TYPES validtypes, const std::string& s) const {
|
|
||||||
std::string key = qualifiedName("::");
|
|
||||||
if (find(validtypes.begin(), validtypes.end(), key) == validtypes.end())
|
|
||||||
throw DependencyMissing(key, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
friend struct ReturnValue;
|
|
||||||
|
|
||||||
std::string str(bool add_ptr) const;
|
|
||||||
|
|
||||||
/// Example: out[1] = wrap_shared_ptr(pairResult.second,"Test", false);
|
|
||||||
void wrap_result(const std::string& out, const std::string& result,
|
|
||||||
FileWriter& file, const TypeAttributesTable& typeAttributes) const;
|
|
||||||
|
|
||||||
/// Creates typedef
|
|
||||||
void wrapTypeUnwrap(FileWriter& wrapperFile) const;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encapsulates return value of a method or function, possibly a pair
|
|
||||||
*/
|
*/
|
||||||
struct ReturnValue {
|
struct ReturnValue {
|
||||||
|
|
||||||
|
|
|
@ -11,28 +11,61 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file TemplateSubstitution.h
|
* @file TemplateSubstitution.h
|
||||||
* @brief Auxiliary class for template sunstitutions
|
* @brief Auxiliary class for template substitutions
|
||||||
* @author Frank Dellaert
|
* @author Frank Dellaert
|
||||||
* @date Nov 13, 2014
|
* @date Nov 13, 2014
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Qualified.h"
|
#include "ReturnType.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
namespace wrap {
|
namespace wrap {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* e.g. TemplateSubstitution("T", gtsam::Point2, gtsam::PriorFactorPoint2)
|
* e.g. TemplateSubstitution("T", gtsam::Point2, gtsam::PriorFactorPoint2)
|
||||||
*/
|
*/
|
||||||
struct TemplateSubstitution {
|
class TemplateSubstitution {
|
||||||
|
|
||||||
|
std::string templateArg_;
|
||||||
|
Qualified qualifiedType_, expandedClass_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
TemplateSubstitution(const std::string& a, const Qualified& t,
|
TemplateSubstitution(const std::string& a, const Qualified& t,
|
||||||
const Qualified& e) :
|
const Qualified& e) :
|
||||||
templateArg(a), qualifiedType(t), expandedClass(e) {
|
templateArg_(a), qualifiedType_(t), expandedClass_(e) {
|
||||||
}
|
}
|
||||||
std::string templateArg;
|
|
||||||
Qualified qualifiedType, expandedClass;
|
// Substitute if needed
|
||||||
|
Qualified operator()(const Qualified& type) const {
|
||||||
|
if (type.name == templateArg_ && type.namespaces.empty())
|
||||||
|
return qualifiedType_;
|
||||||
|
else if (type.name == "This")
|
||||||
|
return expandedClass_;
|
||||||
|
else
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Substitute if needed
|
||||||
|
ReturnType operator()(const ReturnType& type) const {
|
||||||
|
ReturnType instType;
|
||||||
|
if (type.name == templateArg_ && type.namespaces.empty())
|
||||||
|
instType.rename(qualifiedType_);
|
||||||
|
else if (type.name == "This")
|
||||||
|
instType.rename(expandedClass_);
|
||||||
|
return instType;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend std::ostream& operator<<(std::ostream& os,
|
||||||
|
const TemplateSubstitution& ts) {
|
||||||
|
os << ts.templateArg_ << '/' << ts.qualifiedType_.qualifiedName("::")
|
||||||
|
<< " (" << ts.expandedClass_.qualifiedName("::") << ")";
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // \namespace wrap
|
} // \namespace wrap
|
||||||
|
|
Loading…
Reference in New Issue