Constructors now check argument types to allow multiple constructors in MATLAB with the same number of arguments
parent
659e524fa0
commit
0c03fd010d
|
@ -25,6 +25,13 @@
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace wrap;
|
using namespace wrap;
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
string Argument::matlabClass() const {
|
||||||
|
if (type=="Vector") return string("double");
|
||||||
|
if (type=="Matrix") return string("double");
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
void Argument::matlab_unwrap(ofstream& ofs, const string& matlabName) const {
|
void Argument::matlab_unwrap(ofstream& ofs, const string& matlabName) const {
|
||||||
ofs << " ";
|
ofs << " ";
|
||||||
|
@ -62,7 +69,7 @@ string Argument::qualifiedType(const string& delim) const {
|
||||||
string ArgumentList::types() const {
|
string ArgumentList::types() const {
|
||||||
string str;
|
string str;
|
||||||
bool first=true;
|
bool first=true;
|
||||||
BOOST_FOREACH(Argument arg, *this) {
|
BOOST_FOREACH(Argument arg, *this) {
|
||||||
if (!first) str += ","; str += arg.type; first=false;
|
if (!first) str += ","; str += arg.type; first=false;
|
||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
|
@ -73,20 +80,14 @@ string ArgumentList::signature() const {
|
||||||
string sig;
|
string sig;
|
||||||
bool cap=false;
|
bool cap=false;
|
||||||
|
|
||||||
BOOST_FOREACH(Argument arg, *this)
|
BOOST_FOREACH(Argument arg, *this) {
|
||||||
{
|
|
||||||
|
|
||||||
BOOST_FOREACH(char ch, arg.type)
|
BOOST_FOREACH(char ch, arg.type)
|
||||||
if(isupper(ch))
|
if(isupper(ch)) {
|
||||||
{
|
|
||||||
sig += ch;
|
sig += ch;
|
||||||
//If there is a capital letter, we don't want to readd it below
|
//If there is a capital letter, we don't want to read it below
|
||||||
cap=true;
|
cap=true;
|
||||||
}
|
}
|
||||||
|
if(!cap) sig += arg.type[0];
|
||||||
if(!cap)
|
|
||||||
sig += arg.type[0];
|
|
||||||
|
|
||||||
//Reset to default
|
//Reset to default
|
||||||
cap = false;
|
cap = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,21 +28,31 @@ struct Argument {
|
||||||
std::string type;
|
std::string type;
|
||||||
std::string name;
|
std::string name;
|
||||||
std::vector<std::string> namespaces;
|
std::vector<std::string> namespaces;
|
||||||
|
|
||||||
Argument() :
|
Argument() :
|
||||||
is_const(false), is_ref(false), is_ptr(false) {
|
is_const(false), is_ref(false), is_ptr(false) {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string qualifiedType(const std::string& delim = "") const; // adds namespaces to type
|
/// return MATLAB class for use in isa(x,class)
|
||||||
|
std::string matlabClass() const;
|
||||||
|
|
||||||
|
/// adds namespaces to type
|
||||||
|
std::string qualifiedType(const std::string& delim = "") const;
|
||||||
|
|
||||||
/// MATLAB code generation, MATLAB to C++
|
/// MATLAB code generation, MATLAB to C++
|
||||||
void matlab_unwrap(std::ofstream& ofs, const std::string& matlabName) const;
|
void matlab_unwrap(std::ofstream& ofs, const std::string& matlabName) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Argument list
|
/// Argument list is just a container with Arguments
|
||||||
struct ArgumentList: public std::vector<Argument> {
|
struct ArgumentList: public std::vector<Argument> {
|
||||||
std::vector<Argument> args; // why does it contain this?
|
|
||||||
|
/// create a comma-separated string listing all argument types (not used)
|
||||||
std::string types() const;
|
std::string types() const;
|
||||||
|
|
||||||
|
/// create a short "signature" string
|
||||||
std::string signature() const;
|
std::string signature() const;
|
||||||
|
|
||||||
|
/// create a comma-separated string listing all argument names, used in m-files
|
||||||
std::string names() const;
|
std::string names() const;
|
||||||
|
|
||||||
// MATLAB code generation:
|
// MATLAB code generation:
|
||||||
|
|
|
@ -33,10 +33,22 @@ string Constructor::matlab_wrapper_name(const string& className) const {
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
void Constructor::matlab_proxy_fragment(ofstream& ofs, const string& className) const {
|
void Constructor::matlab_proxy_fragment(ofstream& ofs, const string& className) const {
|
||||||
ofs << " if nargin == " << args.size() << ", obj.self = "
|
size_t nrArgs = args.size();
|
||||||
<< matlab_wrapper_name(className) << "(";
|
// check for number of arguments...
|
||||||
|
ofs << " if (nargin == " << nrArgs;
|
||||||
|
if (nrArgs>0) ofs << " & ";
|
||||||
|
// ...and their types
|
||||||
bool first = true;
|
bool first = true;
|
||||||
for(size_t i=0;i<args.size();i++) {
|
for(size_t i=0;i<nrArgs;i++) {
|
||||||
|
if (!first) ofs << " & ";
|
||||||
|
ofs << "isa(varargin{" << i+1 << "},'" << args[i].matlabClass() << "')";
|
||||||
|
first=false;
|
||||||
|
}
|
||||||
|
// emit code for calling constructor
|
||||||
|
ofs << "), obj.self = " << matlab_wrapper_name(className) << "(";
|
||||||
|
// emit constructor arguments
|
||||||
|
first = true;
|
||||||
|
for(size_t i=0;i<nrArgs;i++) {
|
||||||
if (!first) ofs << ",";
|
if (!first) ofs << ",";
|
||||||
ofs << "varargin{" << i+1 << "}";
|
ofs << "varargin{" << i+1 << "}";
|
||||||
first=false;
|
first=false;
|
||||||
|
|
|
@ -44,7 +44,10 @@ struct Constructor {
|
||||||
/// wrapper name
|
/// wrapper name
|
||||||
std::string matlab_wrapper_name(const std::string& className) const;
|
std::string matlab_wrapper_name(const std::string& className) const;
|
||||||
|
|
||||||
/// proxy class fragment
|
/**
|
||||||
|
* Create fragment to select constructor in proxy class, e.g.,
|
||||||
|
* if nargin == 2, obj.self = new_Pose3_RP(varargin{1},varargin{2}); end
|
||||||
|
*/
|
||||||
void matlab_proxy_fragment(std::ofstream& ofs, const std::string& className) const;
|
void matlab_proxy_fragment(std::ofstream& ofs, const std::string& className) const;
|
||||||
|
|
||||||
/// m-file
|
/// m-file
|
||||||
|
|
|
@ -4,8 +4,8 @@ classdef Point2
|
||||||
end
|
end
|
||||||
methods
|
methods
|
||||||
function obj = Point2(varargin)
|
function obj = Point2(varargin)
|
||||||
if nargin == 0, obj.self = new_Point2_(); end
|
if (nargin == 0), obj.self = new_Point2_(); end
|
||||||
if nargin == 2, obj.self = new_Point2_dd(varargin{1},varargin{2}); end
|
if (nargin == 2 & isa(varargin{1},'double') & isa(varargin{2},'double')), obj.self = new_Point2_dd(varargin{1},varargin{2}); end
|
||||||
if nargin ~= 13 && obj.self == 0, error('Point2 constructor failed'); end
|
if nargin ~= 13 && obj.self == 0, error('Point2 constructor failed'); end
|
||||||
end
|
end
|
||||||
function display(obj), obj.print(''); end
|
function display(obj), obj.print(''); end
|
||||||
|
|
|
@ -4,7 +4,7 @@ classdef Point3
|
||||||
end
|
end
|
||||||
methods
|
methods
|
||||||
function obj = Point3(varargin)
|
function obj = Point3(varargin)
|
||||||
if nargin == 3, obj.self = new_Point3_ddd(varargin{1},varargin{2},varargin{3}); end
|
if (nargin == 3 & isa(varargin{1},'double') & isa(varargin{2},'double') & isa(varargin{3},'double')), obj.self = new_Point3_ddd(varargin{1},varargin{2},varargin{3}); end
|
||||||
if nargin ~= 13 && obj.self == 0, error('Point3 constructor failed'); end
|
if nargin ~= 13 && obj.self == 0, error('Point3 constructor failed'); end
|
||||||
end
|
end
|
||||||
function display(obj), obj.print(''); end
|
function display(obj), obj.print(''); end
|
||||||
|
|
|
@ -4,8 +4,8 @@ classdef Test
|
||||||
end
|
end
|
||||||
methods
|
methods
|
||||||
function obj = Test(varargin)
|
function obj = Test(varargin)
|
||||||
if nargin == 0, obj.self = new_Test_(); end
|
if (nargin == 0), obj.self = new_Test_(); end
|
||||||
if nargin == 2, obj.self = new_Test_dM(varargin{1},varargin{2}); end
|
if (nargin == 2 & isa(varargin{1},'double') & isa(varargin{2},'double')), obj.self = new_Test_dM(varargin{1},varargin{2}); end
|
||||||
if nargin ~= 13 && obj.self == 0, error('Test constructor failed'); end
|
if nargin ~= 13 && obj.self == 0, error('Test constructor failed'); end
|
||||||
end
|
end
|
||||||
function display(obj), obj.print(''); end
|
function display(obj), obj.print(''); end
|
||||||
|
|
|
@ -4,7 +4,7 @@ classdef ns1ClassA
|
||||||
end
|
end
|
||||||
methods
|
methods
|
||||||
function obj = ns1ClassA(varargin)
|
function obj = ns1ClassA(varargin)
|
||||||
if nargin == 0, obj.self = new_ns1ClassA_(); end
|
if (nargin == 0), obj.self = new_ns1ClassA_(); end
|
||||||
if nargin ~= 13 && obj.self == 0, error('ns1ClassA constructor failed'); end
|
if nargin ~= 13 && obj.self == 0, error('ns1ClassA constructor failed'); end
|
||||||
end
|
end
|
||||||
function display(obj), obj.print(''); end
|
function display(obj), obj.print(''); end
|
||||||
|
|
|
@ -4,7 +4,7 @@ classdef ns1ClassB
|
||||||
end
|
end
|
||||||
methods
|
methods
|
||||||
function obj = ns1ClassB(varargin)
|
function obj = ns1ClassB(varargin)
|
||||||
if nargin == 0, obj.self = new_ns1ClassB_(); end
|
if (nargin == 0), obj.self = new_ns1ClassB_(); end
|
||||||
if nargin ~= 13 && obj.self == 0, error('ns1ClassB constructor failed'); end
|
if nargin ~= 13 && obj.self == 0, error('ns1ClassB constructor failed'); end
|
||||||
end
|
end
|
||||||
function display(obj), obj.print(''); end
|
function display(obj), obj.print(''); end
|
||||||
|
|
|
@ -4,7 +4,7 @@ classdef ns2ClassA
|
||||||
end
|
end
|
||||||
methods
|
methods
|
||||||
function obj = ns2ClassA(varargin)
|
function obj = ns2ClassA(varargin)
|
||||||
if nargin == 0, obj.self = new_ns2ClassA_(); end
|
if (nargin == 0), obj.self = new_ns2ClassA_(); end
|
||||||
if nargin ~= 13 && obj.self == 0, error('ns2ClassA constructor failed'); end
|
if nargin ~= 13 && obj.self == 0, error('ns2ClassA constructor failed'); end
|
||||||
end
|
end
|
||||||
function display(obj), obj.print(''); end
|
function display(obj), obj.print(''); end
|
||||||
|
|
|
@ -4,7 +4,7 @@ classdef ns2ClassC
|
||||||
end
|
end
|
||||||
methods
|
methods
|
||||||
function obj = ns2ClassC(varargin)
|
function obj = ns2ClassC(varargin)
|
||||||
if nargin == 0, obj.self = new_ns2ClassC_(); end
|
if (nargin == 0), obj.self = new_ns2ClassC_(); end
|
||||||
if nargin ~= 13 && obj.self == 0, error('ns2ClassC constructor failed'); end
|
if nargin ~= 13 && obj.self == 0, error('ns2ClassC constructor failed'); end
|
||||||
end
|
end
|
||||||
function display(obj), obj.print(''); end
|
function display(obj), obj.print(''); end
|
||||||
|
|
|
@ -4,7 +4,7 @@ classdef ns2ns3ClassB
|
||||||
end
|
end
|
||||||
methods
|
methods
|
||||||
function obj = ns2ns3ClassB(varargin)
|
function obj = ns2ns3ClassB(varargin)
|
||||||
if nargin == 0, obj.self = new_ns2ns3ClassB_(); end
|
if (nargin == 0), obj.self = new_ns2ns3ClassB_(); end
|
||||||
if nargin ~= 13 && obj.self == 0, error('ns2ns3ClassB constructor failed'); end
|
if nargin ~= 13 && obj.self == 0, error('ns2ns3ClassB constructor failed'); end
|
||||||
end
|
end
|
||||||
function display(obj), obj.print(''); end
|
function display(obj), obj.print(''); end
|
||||||
|
|
Loading…
Reference in New Issue