Constructors now check argument types to allow multiple constructors in MATLAB with the same number of arguments

release/4.3a0
Frank Dellaert 2012-01-10 05:06:46 +00:00
parent 659e524fa0
commit 0c03fd010d
12 changed files with 54 additions and 28 deletions

View File

@ -25,6 +25,13 @@
using namespace std;
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 {
ofs << " ";
@ -73,20 +80,14 @@ string ArgumentList::signature() const {
string sig;
bool cap=false;
BOOST_FOREACH(Argument arg, *this)
{
BOOST_FOREACH(Argument arg, *this) {
BOOST_FOREACH(char ch, arg.type)
if(isupper(ch))
{
if(isupper(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;
}
if(!cap)
sig += arg.type[0];
if(!cap) sig += arg.type[0];
//Reset to default
cap = false;
}

View File

@ -28,21 +28,31 @@ struct Argument {
std::string type;
std::string name;
std::vector<std::string> namespaces;
Argument() :
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++
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> {
std::vector<Argument> args; // why does it contain this?
/// create a comma-separated string listing all argument types (not used)
std::string types() const;
/// create a short "signature" string
std::string signature() const;
/// create a comma-separated string listing all argument names, used in m-files
std::string names() const;
// MATLAB code generation:

View File

@ -33,10 +33,22 @@ string Constructor::matlab_wrapper_name(const string& className) const {
/* ************************************************************************* */
void Constructor::matlab_proxy_fragment(ofstream& ofs, const string& className) const {
ofs << " if nargin == " << args.size() << ", obj.self = "
<< matlab_wrapper_name(className) << "(";
size_t nrArgs = args.size();
// check for number of arguments...
ofs << " if (nargin == " << nrArgs;
if (nrArgs>0) ofs << " & ";
// ...and their types
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 << ",";
ofs << "varargin{" << i+1 << "}";
first=false;

View File

@ -44,7 +44,10 @@ struct Constructor {
/// wrapper name
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;
/// m-file

View File

@ -4,8 +4,8 @@ classdef Point2
end
methods
function obj = Point2(varargin)
if nargin == 0, obj.self = new_Point2_(); end
if nargin == 2, obj.self = new_Point2_dd(varargin{1},varargin{2}); end
if (nargin == 0), obj.self = new_Point2_(); 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
end
function display(obj), obj.print(''); end

View File

@ -4,7 +4,7 @@ classdef Point3
end
methods
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
end
function display(obj), obj.print(''); end

View File

@ -4,8 +4,8 @@ classdef Test
end
methods
function obj = Test(varargin)
if nargin == 0, obj.self = new_Test_(); end
if nargin == 2, obj.self = new_Test_dM(varargin{1},varargin{2}); end
if (nargin == 0), obj.self = new_Test_(); 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
end
function display(obj), obj.print(''); end

View File

@ -4,7 +4,7 @@ classdef ns1ClassA
end
methods
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
end
function display(obj), obj.print(''); end

View File

@ -4,7 +4,7 @@ classdef ns1ClassB
end
methods
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
end
function display(obj), obj.print(''); end

View File

@ -4,7 +4,7 @@ classdef ns2ClassA
end
methods
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
end
function display(obj), obj.print(''); end

View File

@ -4,7 +4,7 @@ classdef ns2ClassC
end
methods
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
end
function display(obj), obj.print(''); end

View File

@ -4,7 +4,7 @@ classdef ns2ns3ClassB
end
methods
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
end
function display(obj), obj.print(''); end