diff --git a/gtsam.h b/gtsam.h index 487c8c96b..0878d831b 100644 --- a/gtsam.h +++ b/gtsam.h @@ -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: + * - 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 namespace planarSLAM { -#include class Values { Values(); void print(string s) const; @@ -300,7 +303,6 @@ class Values { void insertPoint(int key, const Point2& point); }; -#include class Graph { Graph(); @@ -321,7 +323,6 @@ class Graph { planarSLAM::Values optimize(const planarSLAM::Values& initialEstimate); }; -#include 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 namespace simulated2D { -#include class Values { Values(); void insertPose(int i, const Point2& p); @@ -345,7 +346,6 @@ class Values { Point2 point(int j); }; -#include class Graph { Graph(); }; @@ -355,9 +355,9 @@ class Graph { }///\namespace simulated2D // Simulated2DOriented Example Domain +#include namespace simulated2DOriented { -#include class Values { Values(); void insertPose(int i, const Pose2& p); @@ -368,7 +368,6 @@ class Values { Point2 point(int j); }; -#include class Graph { Graph(); }; diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp index d051c74ec..8a8112f99 100644 --- a/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp +++ b/wrap/tests/expected_namespaces/@ns2ClassA/memberFunction.cpp @@ -1,6 +1,7 @@ -// automatically generated by wrap on 2011-Dec-08 +// automatically generated by wrap on 2011-Dec-15 #include -#include +#include +#include void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("memberFunction",nargout,nargin-1,0); diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp new file mode 100644 index 000000000..9e9edcf78 --- /dev/null +++ b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.cpp @@ -0,0 +1,12 @@ +// automatically generated by wrap on 2011-Dec-15 +#include +#include +#include +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + checkArguments("nsArg",nargout,nargin-1,1); + shared_ptr 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); +} diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.m b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.m new file mode 100644 index 000000000..bdd4b387f --- /dev/null +++ b/wrap/tests/expected_namespaces/@ns2ClassA/nsArg.m @@ -0,0 +1,4 @@ +function result = nsArg(obj,arg) +% usage: obj.nsArg(arg) + error('need to compile nsArg.cpp'); +end diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp new file mode 100644 index 000000000..b7a967e2c --- /dev/null +++ b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.cpp @@ -0,0 +1,12 @@ +// automatically generated by wrap on 2011-Dec-15 +#include +#include +#include +void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) +{ + checkArguments("nsReturn",nargout,nargin-1,1); + shared_ptr 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"); +} diff --git a/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.m b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.m new file mode 100644 index 000000000..d0d093a37 --- /dev/null +++ b/wrap/tests/expected_namespaces/@ns2ClassA/nsReturn.m @@ -0,0 +1,4 @@ +function result = nsReturn(obj,q) +% usage: obj.nsReturn(q) + error('need to compile nsReturn.cpp'); +end diff --git a/wrap/tests/expected_namespaces/Makefile b/wrap/tests/expected_namespaces/Makefile index 4fe9b0655..8a6bc3af7 100644 --- a/wrap/tests/expected_namespaces/Makefile +++ b/wrap/tests/expected_namespaces/Makefile @@ -1,4 +1,4 @@ -# automatically generated by wrap on 2011-Dec-08 +# automatically generated by wrap on 2011-Dec-15 MEX = mex MEXENDING = mexa64 diff --git a/wrap/tests/expected_namespaces/make_testNamespaces.m b/wrap/tests/expected_namespaces/make_testNamespaces.m index 59d850c42..9a3ee5b6c 100644 --- a/wrap/tests/expected_namespaces/make_testNamespaces.m +++ b/wrap/tests/expected_namespaces/make_testNamespaces.m @@ -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'); diff --git a/wrap/tests/expected_namespaces/new_ClassD_.cpp b/wrap/tests/expected_namespaces/new_ClassD_.cpp index ec7212786..c39f7c3fe 100644 --- a/wrap/tests/expected_namespaces/new_ClassD_.cpp +++ b/wrap/tests/expected_namespaces/new_ClassD_.cpp @@ -1,4 +1,4 @@ -// automatically generated by wrap on 2011-Dec-08 +// automatically generated by wrap on 2011-Dec-15 #include #include void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) diff --git a/wrap/tests/expected_namespaces/new_ClassD_.m b/wrap/tests/expected_namespaces/new_ClassD_.m index c5f53f130..99f139acf 100644 --- a/wrap/tests/expected_namespaces/new_ClassD_.m +++ b/wrap/tests/expected_namespaces/new_ClassD_.m @@ -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 diff --git a/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp b/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp index 2db8ef767..84fbe45bf 100644 --- a/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp +++ b/wrap/tests/expected_namespaces/new_ns1ClassA_.cpp @@ -1,6 +1,6 @@ -// automatically generated by wrap on 2011-Dec-08 +// automatically generated by wrap on 2011-Dec-15 #include -#include +#include void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("new_ns1ClassA_",nargout,nargin,0); diff --git a/wrap/tests/expected_namespaces/new_ns1ClassA_.m b/wrap/tests/expected_namespaces/new_ns1ClassA_.m index 89cd8b0a2..ab53c21a2 100644 --- a/wrap/tests/expected_namespaces/new_ns1ClassA_.m +++ b/wrap/tests/expected_namespaces/new_ns1ClassA_.m @@ -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 diff --git a/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp b/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp index b4ac7038a..84670f1f1 100644 --- a/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp +++ b/wrap/tests/expected_namespaces/new_ns1ClassB_.cpp @@ -1,6 +1,7 @@ -// automatically generated by wrap on 2011-Dec-08 +// automatically generated by wrap on 2011-Dec-15 #include -#include +#include +#include void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("new_ns1ClassB_",nargout,nargin,0); diff --git a/wrap/tests/expected_namespaces/new_ns1ClassB_.m b/wrap/tests/expected_namespaces/new_ns1ClassB_.m index 5430f85aa..83f5daa6a 100644 --- a/wrap/tests/expected_namespaces/new_ns1ClassB_.m +++ b/wrap/tests/expected_namespaces/new_ns1ClassB_.m @@ -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 diff --git a/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp b/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp index cc4ec309b..a70341f17 100644 --- a/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp +++ b/wrap/tests/expected_namespaces/new_ns2ClassA_.cpp @@ -1,6 +1,7 @@ -// automatically generated by wrap on 2011-Dec-08 +// automatically generated by wrap on 2011-Dec-15 #include -#include +#include +#include void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("new_ns2ClassA_",nargout,nargin,0); diff --git a/wrap/tests/expected_namespaces/new_ns2ClassA_.m b/wrap/tests/expected_namespaces/new_ns2ClassA_.m index bb8b2a24a..171b839b9 100644 --- a/wrap/tests/expected_namespaces/new_ns2ClassA_.m +++ b/wrap/tests/expected_namespaces/new_ns2ClassA_.m @@ -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 diff --git a/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp b/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp index b43a7cd6b..04d58a187 100644 --- a/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp +++ b/wrap/tests/expected_namespaces/new_ns2ClassC_.cpp @@ -1,6 +1,6 @@ -// automatically generated by wrap on 2011-Dec-08 +// automatically generated by wrap on 2011-Dec-15 #include -#include +#include void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("new_ns2ClassC_",nargout,nargin,0); diff --git a/wrap/tests/expected_namespaces/new_ns2ClassC_.m b/wrap/tests/expected_namespaces/new_ns2ClassC_.m index 91e643c4b..1858c3ada 100644 --- a/wrap/tests/expected_namespaces/new_ns2ClassC_.m +++ b/wrap/tests/expected_namespaces/new_ns2ClassC_.m @@ -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 diff --git a/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp b/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp index 3916ed3ff..38970edf9 100644 --- a/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp +++ b/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.cpp @@ -1,6 +1,7 @@ -// automatically generated by wrap on 2011-Dec-08 +// automatically generated by wrap on 2011-Dec-15 #include -#include +#include +#include void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("new_ns2ns3ClassB_",nargout,nargin,0); diff --git a/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.m b/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.m index 54b38a16c..9842b55e8 100644 --- a/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.m +++ b/wrap/tests/expected_namespaces/new_ns2ns3ClassB_.m @@ -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 diff --git a/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp b/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp index dff68090a..4ef71fcf4 100644 --- a/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp +++ b/wrap/tests/expected_namespaces/ns2ClassA_afunction.cpp @@ -1,6 +1,7 @@ -// automatically generated by wrap on 2011-Dec-08 +// automatically generated by wrap on 2011-Dec-15 #include -#include +#include +#include void mexFunction(int nargout, mxArray *out[], int nargin, const mxArray *in[]) { checkArguments("ns2ClassA_afunction",nargout,nargin,0); diff --git a/wrap/tests/testWrap.cpp b/wrap/tests/testWrap.cpp index c3b2feafd..65edc11b5 100644 --- a/wrap/tests/testWrap.cpp +++ b/wrap/tests/testWrap.cpp @@ -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" )); } diff --git a/wrap/utilities.cpp b/wrap/utilities.cpp index 97d18f579..fb8309485 100644 --- a/wrap/utilities.cpp +++ b/wrap/utilities.cpp @@ -128,12 +128,15 @@ void generateUsingNamespace(ofstream& ofs, const vector& using_namespace void generateIncludes(ofstream& ofs, const string& class_name, const vector& includes) { ofs << "#include " << 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; } /* ************************************************************************* */