Added support for namespace includes to wrap

release/4.3a0
Alex Cunningham 2011-12-15 19:39:14 +00:00
parent ea1f1e8b65
commit 44aff08d56
23 changed files with 98 additions and 36 deletions

15
gtsam.h
View File

@ -36,7 +36,10 @@
* Static methods must start with a letter (upper or lowercase) and use the "static" keyword
* Includes in C++ wrappers
* - By default, the include will be <[classname].h>
* - To override, add a full include statement inside the class definition
* - All namespaces must have angle brackets: <path>
* - To override, add a full include statement just before the class statement
* - An override include can be added for a namespace by placing it just before the namespace statement
* - Both classes and namespace accept exactly one namespace
*/
/**
@ -288,9 +291,9 @@ class Ordering {
};
// Planar SLAM example domain
#include <gtsam/slam/planarSLAM.h>
namespace planarSLAM {
#include <gtsam/slam/planarSLAM.h>
class Values {
Values();
void print(string s) const;
@ -300,7 +303,6 @@ class Values {
void insertPoint(int key, const Point2& point);
};
#include <gtsam/slam/planarSLAM.h>
class Graph {
Graph();
@ -321,7 +323,6 @@ class Graph {
planarSLAM::Values optimize(const planarSLAM::Values& initialEstimate);
};
#include <gtsam/slam/planarSLAM.h>
class Odometry {
Odometry(int key1, int key2, const Pose2& measured,
const SharedNoiseModel& model);
@ -332,9 +333,9 @@ class Odometry {
}///\namespace planarSLAM
// Simulated2D Example Domain
#include <gtsam/slam/simulated2D.h>
namespace simulated2D {
#include <gtsam/slam/simulated2D.h>
class Values {
Values();
void insertPose(int i, const Point2& p);
@ -345,7 +346,6 @@ class Values {
Point2 point(int j);
};
#include <gtsam/slam/simulated2D.h>
class Graph {
Graph();
};
@ -355,9 +355,9 @@ class Graph {
}///\namespace simulated2D
// Simulated2DOriented Example Domain
#include <gtsam/slam/simulated2DOriented.h>
namespace simulated2DOriented {
#include <gtsam/slam/simulated2DOriented.h>
class Values {
Values();
void insertPose(int i, const Pose2& p);
@ -368,7 +368,6 @@ class Values {
Point2 point(int j);
};
#include <gtsam/slam/simulated2DOriented.h>
class Graph {
Graph();
};

View File

@ -1,6 +1,7 @@
// automatically generated by wrap on 2011-Dec-08
// automatically generated by wrap on 2011-Dec-15
#include <wrap/matlab.h>
#include <ClassA.h>
#include <path/to/ns2.h>
#include <path/to/ns2/ClassA.h>
void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])
{
checkArguments("memberFunction",nargout,nargin-1,0);

View File

@ -0,0 +1,12 @@
// automatically generated by wrap on 2011-Dec-15
#include <wrap/matlab.h>
#include <path/to/ns2.h>
#include <path/to/ns2/ClassA.h>
void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])
{
checkArguments("nsArg",nargout,nargin-1,1);
shared_ptr<ns2::ClassA> self = unwrap_shared_ptr< ns2::ClassA >(in[0],"ns2ClassA");
ns1::ClassB& arg = *unwrap_shared_ptr< ns1::ClassB >(in[1], "ns1ClassB");
int result = self->nsArg(arg);
out[0] = wrap< int >(result);
}

View File

@ -0,0 +1,4 @@
function result = nsArg(obj,arg)
% usage: obj.nsArg(arg)
error('need to compile nsArg.cpp');
end

View File

@ -0,0 +1,12 @@
// automatically generated by wrap on 2011-Dec-15
#include <wrap/matlab.h>
#include <path/to/ns2.h>
#include <path/to/ns2/ClassA.h>
void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])
{
checkArguments("nsReturn",nargout,nargin-1,1);
shared_ptr<ns2::ClassA> self = unwrap_shared_ptr< ns2::ClassA >(in[0],"ns2ClassA");
double q = unwrap< double >(in[1]);
ns2::ns3::ClassB result = self->nsReturn(q);
out[0] = wrap_shared_ptr(make_shared< ns2::ns3::ClassB >(result),"ns2ns3ClassB");
}

View File

@ -0,0 +1,4 @@
function result = nsReturn(obj,q)
% usage: obj.nsReturn(q)
error('need to compile nsReturn.cpp');
end

View File

@ -1,4 +1,4 @@
# automatically generated by wrap on 2011-Dec-08
# automatically generated by wrap on 2011-Dec-15
MEX = mex
MEXENDING = mexa64

View File

@ -1,4 +1,4 @@
% automatically generated by wrap on 2011-Dec-08
% automatically generated by wrap on 2011-Dec-15
echo on
toolboxpath = mfilename('fullpath');

View File

@ -1,4 +1,4 @@
// automatically generated by wrap on 2011-Dec-08
// automatically generated by wrap on 2011-Dec-15
#include <wrap/matlab.h>
#include <ClassD.h>
void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])

View File

@ -1,4 +1,4 @@
% automatically generated by wrap on 2011-Dec-08
% automatically generated by wrap on 2011-Dec-15
function result = new_ClassD_(obj)
error('need to compile new_ClassD_.cpp');
end

View File

@ -1,6 +1,6 @@
// automatically generated by wrap on 2011-Dec-08
// automatically generated by wrap on 2011-Dec-15
#include <wrap/matlab.h>
#include <ClassA.h>
#include <path/to/ns1.h>
void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])
{
checkArguments("new_ns1ClassA_",nargout,nargin,0);

View File

@ -1,4 +1,4 @@
% automatically generated by wrap on 2011-Dec-08
% automatically generated by wrap on 2011-Dec-15
function result = new_ns1ClassA_(obj)
error('need to compile new_ns1ClassA_.cpp');
end

View File

@ -1,6 +1,7 @@
// automatically generated by wrap on 2011-Dec-08
// automatically generated by wrap on 2011-Dec-15
#include <wrap/matlab.h>
#include <ClassB.h>
#include <path/to/ns1.h>
#include <path/to/ns1/ClassB.h>
void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])
{
checkArguments("new_ns1ClassB_",nargout,nargin,0);

View File

@ -1,4 +1,4 @@
% automatically generated by wrap on 2011-Dec-08
% automatically generated by wrap on 2011-Dec-15
function result = new_ns1ClassB_(obj)
error('need to compile new_ns1ClassB_.cpp');
end

View File

@ -1,6 +1,7 @@
// automatically generated by wrap on 2011-Dec-08
// automatically generated by wrap on 2011-Dec-15
#include <wrap/matlab.h>
#include <ClassA.h>
#include <path/to/ns2.h>
#include <path/to/ns2/ClassA.h>
void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])
{
checkArguments("new_ns2ClassA_",nargout,nargin,0);

View File

@ -1,4 +1,4 @@
% automatically generated by wrap on 2011-Dec-08
% automatically generated by wrap on 2011-Dec-15
function result = new_ns2ClassA_(obj)
error('need to compile new_ns2ClassA_.cpp');
end

View File

@ -1,6 +1,6 @@
// automatically generated by wrap on 2011-Dec-08
// automatically generated by wrap on 2011-Dec-15
#include <wrap/matlab.h>
#include <ClassC.h>
#include <path/to/ns2.h>
void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])
{
checkArguments("new_ns2ClassC_",nargout,nargin,0);

View File

@ -1,4 +1,4 @@
% automatically generated by wrap on 2011-Dec-08
% automatically generated by wrap on 2011-Dec-15
function result = new_ns2ClassC_(obj)
error('need to compile new_ns2ClassC_.cpp');
end

View File

@ -1,6 +1,7 @@
// automatically generated by wrap on 2011-Dec-08
// automatically generated by wrap on 2011-Dec-15
#include <wrap/matlab.h>
#include <ClassB.h>
#include <path/to/ns2.h>
#include <path/to/ns3.h>
void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])
{
checkArguments("new_ns2ns3ClassB_",nargout,nargin,0);

View File

@ -1,4 +1,4 @@
% automatically generated by wrap on 2011-Dec-08
% automatically generated by wrap on 2011-Dec-15
function result = new_ns2ns3ClassB_(obj)
error('need to compile new_ns2ns3ClassB_.cpp');
end

View File

@ -1,6 +1,7 @@
// automatically generated by wrap on 2011-Dec-08
// automatically generated by wrap on 2011-Dec-15
#include <wrap/matlab.h>
#include <ClassA.h>
#include <path/to/ns2.h>
#include <path/to/ns2/ClassA.h>
void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[])
{
checkArguments("ns2ClassA_afunction",nargout,nargin,0);

View File

@ -210,6 +210,29 @@ TEST( wrap, matlab_code_namespaces ) {
string act_path = "actual_namespaces/";
module.matlab_code("actual_namespaces", "mexa64", "-O5");
EXPECT(files_equal(exp_path + "new_ClassD_.cpp" , act_path + "new_ClassD_.cpp" ));
EXPECT(files_equal(exp_path + "new_ClassD_.m" , act_path + "new_ClassD_.m" ));
EXPECT(files_equal(exp_path + "new_ns1ClassA_.cpp" , act_path + "new_ns1ClassA_.cpp" ));
EXPECT(files_equal(exp_path + "new_ns1ClassA_.m" , act_path + "new_ns1ClassA_.m" ));
EXPECT(files_equal(exp_path + "new_ns1ClassB_.cpp" , act_path + "new_ns1ClassB_.cpp" ));
EXPECT(files_equal(exp_path + "new_ns1ClassB_.m" , act_path + "new_ns1ClassB_.m" ));
EXPECT(files_equal(exp_path + "new_ns2ClassA_.cpp" , act_path + "new_ns2ClassA_.cpp" ));
EXPECT(files_equal(exp_path + "new_ns2ClassA_.m" , act_path + "new_ns2ClassA_.m" ));
EXPECT(files_equal(exp_path + "new_ns2ClassC_.cpp" , act_path + "new_ns2ClassC_.cpp" ));
EXPECT(files_equal(exp_path + "new_ns2ClassC_.m" , act_path + "new_ns2ClassC_.m" ));
EXPECT(files_equal(exp_path + "new_ns2ns3ClassB_.cpp" , act_path + "new_ns2ns3ClassB_.cpp" ));
EXPECT(files_equal(exp_path + "new_ns2ns3ClassB_.m" , act_path + "new_ns2ns3ClassB_.m" ));
EXPECT(files_equal(exp_path + "ns2ClassA_afunction.cpp" , act_path + "ns2ClassA_afunction.cpp" ));
EXPECT(files_equal(exp_path + "ns2ClassA_afunction.m" , act_path + "ns2ClassA_afunction.m" ));
EXPECT(files_equal(exp_path + "@ns2ClassA/memberFunction.cpp", act_path + "@ns2ClassA/memberFunction.cpp"));
EXPECT(files_equal(exp_path + "@ns2ClassA/memberFunction.m" , act_path + "@ns2ClassA/memberFunction.m" ));
EXPECT(files_equal(exp_path + "@ns2ClassA/ns2ClassA.m" , act_path + "@ns2ClassA/ns2ClassA.m" ));
EXPECT(files_equal(exp_path + "@ns2ClassA/nsArg.cpp" , act_path + "@ns2ClassA/nsArg.cpp" ));
EXPECT(files_equal(exp_path + "@ns2ClassA/nsArg.m" , act_path + "@ns2ClassA/nsArg.m" ));
EXPECT(files_equal(exp_path + "@ns2ClassA/nsReturn.cpp" , act_path + "@ns2ClassA/nsReturn.cpp" ));
EXPECT(files_equal(exp_path + "@ns2ClassA/nsReturn.m" , act_path + "@ns2ClassA/nsReturn.m" ));
EXPECT(files_equal(exp_path + "make_testNamespaces.m", act_path + "make_testNamespaces.m"));
EXPECT(files_equal(exp_path + "Makefile" , act_path + "Makefile" ));
}

View File

@ -128,12 +128,15 @@ void generateUsingNamespace(ofstream& ofs, const vector<string>& using_namespace
void generateIncludes(ofstream& ofs, const string& class_name,
const vector<string>& includes) {
ofs << "#include <wrap/matlab.h>" << endl;
if (includes.empty()) // add a default include
ofs << "#include <" << class_name << ".h>" << endl;
else {
BOOST_FOREACH(const string& s, includes)
ofs << "#include <" << s << ">" << endl;
bool added_include = false;
BOOST_FOREACH(const string& s, includes) {
if (!s.empty()) {
ofs << "#include <" << s << ">" << endl;
added_include = true;
}
}
if (!added_include) // add default include
ofs << "#include <" << class_name << ".h>" << endl;
}
/* ************************************************************************* */