Added a check that all wrapped classes involved in a heirarchy are marked virtual

release/4.3a0
Richard Roberts 2012-07-10 22:38:21 +00:00
parent e337ab8b1d
commit 0c384dc35a
3 changed files with 436 additions and 417 deletions

10
gtsam.h
View File

@ -702,17 +702,17 @@ class VariableIndex {
#include <gtsam/linear/NoiseModel.h> #include <gtsam/linear/NoiseModel.h>
namespace noiseModel { namespace noiseModel {
class Base { virtual class Base {
}; };
class Gaussian : gtsam::noiseModel::Base { virtual class Gaussian : gtsam::noiseModel::Base {
static gtsam::noiseModel::Gaussian* SqrtInformation(Matrix R); static gtsam::noiseModel::Gaussian* SqrtInformation(Matrix R);
static gtsam::noiseModel::Gaussian* Covariance(Matrix R); static gtsam::noiseModel::Gaussian* Covariance(Matrix R);
// Matrix R() const; // FIXME: cannot parse!!! // Matrix R() const; // FIXME: cannot parse!!!
void print(string s) const; void print(string s) const;
}; };
class Diagonal : gtsam::noiseModel::Gaussian { virtual class Diagonal : gtsam::noiseModel::Gaussian {
static gtsam::noiseModel::Diagonal* Sigmas(Vector sigmas); static gtsam::noiseModel::Diagonal* Sigmas(Vector sigmas);
static gtsam::noiseModel::Diagonal* Variances(Vector variances); static gtsam::noiseModel::Diagonal* Variances(Vector variances);
static gtsam::noiseModel::Diagonal* Precisions(Vector precisions); static gtsam::noiseModel::Diagonal* Precisions(Vector precisions);
@ -720,14 +720,14 @@ class Diagonal : gtsam::noiseModel::Gaussian {
void print(string s) const; void print(string s) const;
}; };
class Isotropic : gtsam::noiseModel::Gaussian { virtual class Isotropic : gtsam::noiseModel::Gaussian {
static gtsam::noiseModel::Isotropic* Sigma(size_t dim, double sigma); static gtsam::noiseModel::Isotropic* Sigma(size_t dim, double sigma);
static gtsam::noiseModel::Isotropic* Variance(size_t dim, double varianace); static gtsam::noiseModel::Isotropic* Variance(size_t dim, double varianace);
static gtsam::noiseModel::Isotropic* Precision(size_t dim, double precision); static gtsam::noiseModel::Isotropic* Precision(size_t dim, double precision);
void print(string s) const; void print(string s) const;
}; };
class Unit : gtsam::noiseModel::Gaussian { virtual class Unit : gtsam::noiseModel::Gaussian {
static gtsam::noiseModel::Unit* Create(size_t dim); static gtsam::noiseModel::Unit* Create(size_t dim);
void print(string s) const; void print(string s) const;
}; };

View File

@ -359,8 +359,16 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co
BOOST_FOREACH(const Class& cls, classes) { BOOST_FOREACH(const Class& cls, classes) {
if(!typeAttributes.insert(make_pair(cls.qualifiedName("::"), ReturnValue::TypeAttributes(cls.isVirtual))).second) if(!typeAttributes.insert(make_pair(cls.qualifiedName("::"), ReturnValue::TypeAttributes(cls.isVirtual))).second)
throw DuplicateDefinition("class " + cls.qualifiedName("::")); throw DuplicateDefinition("class " + cls.qualifiedName("::"));
}
// Check attributes
BOOST_FOREACH(const Class& cls, classes) {
// Check that class is virtual if it has a parent // Check that class is virtual if it has a parent
if(!cls.qualifiedParent.empty() && !cls.isVirtual)
throw AttributeError(cls.qualifiedName("::"), "Has a base class so needs to be declared virtual, change to 'virtual class "+cls.name+" ...'");
// Check that parent is virtual as well
if(!cls.qualifiedParent.empty() && !typeAttributes.at(wrap::qualifiedName("::", cls.qualifiedParent)).isVirtual)
throw AttributeError(wrap::qualifiedName("::", cls.qualifiedParent),
"Is the base class of " + cls.qualifiedName("::") + ", so needs to be declared virtual");
} }
// Check that all classes have been defined somewhere // Check that all classes have been defined somewhere
@ -391,7 +399,7 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co
} }
// generate mexAtExit cleanup function // generate mexAtExit cleanup function
wrapperFile.oss << "void _deleteAllObjects()\n"; wrapperFile.oss << "\nvoid _deleteAllObjects()\n";
wrapperFile.oss << "{\n"; wrapperFile.oss << "{\n";
BOOST_FOREACH(const Class& cls, classes) { BOOST_FOREACH(const Class& cls, classes) {
const string matlabName = cls.qualifiedName(); const string matlabName = cls.qualifiedName();
@ -413,6 +421,7 @@ void Module::matlab_code(const string& toolboxPath, const string& headerPath) co
} }
// finish wrapper file // finish wrapper file
wrapperFile.oss << "\n";
finish_wrapper(wrapperFile, functionNames); finish_wrapper(wrapperFile, functionNames);
wrapperFile.emit(true); wrapperFile.emit(true);

View File

@ -69,6 +69,16 @@ public:
virtual const char* what() const throw() { return what_.c_str(); } virtual const char* what() const throw() { return what_.c_str(); }
}; };
class AttributeError : public std::exception {
private:
const std::string what_;
public:
AttributeError(const std::string& name, const std::string& problem) :
what_("Class " + name + ": " + problem) {}
~AttributeError() throw() {}
virtual const char* what() const throw() { return what_.c_str(); }
};
/** Special "magic number" passed into MATLAB constructor to indicate creating /** Special "magic number" passed into MATLAB constructor to indicate creating
* a MATLAB object from a shared_ptr allocated in C++ * a MATLAB object from a shared_ptr allocated in C++
*/ */