2011-10-14 02:41:56 +08:00
/* ----------------------------------------------------------------------------
* GTSAM Copyright 2010 , Georgia Tech Research Corporation ,
* Atlanta , Georgia 30332 - 0415
* All Rights Reserved
* Authors : Frank Dellaert , et al . ( see THANKS for the full author list )
* See LICENSE for the license information
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/**
2011-10-14 11:23:14 +08:00
* @ file Constructor . ccp
* @ author Frank Dellaert
2012-06-27 02:52:27 +08:00
* @ author Andrew Melim
2012-07-13 06:28:28 +08:00
* @ author Richard Roberts
2011-10-14 02:41:56 +08:00
* */
# include <iostream>
# include <fstream>
2012-06-27 02:52:27 +08:00
# include <algorithm>
2011-10-14 02:41:56 +08:00
# include <boost/foreach.hpp>
2012-07-05 22:04:36 +08:00
# include <boost/lexical_cast.hpp>
2011-10-14 02:41:56 +08:00
# include "utilities.h"
# include "Constructor.h"
using namespace std ;
2011-12-03 00:43:15 +08:00
using namespace wrap ;
2011-10-14 02:41:56 +08:00
2012-06-27 02:52:27 +08:00
2011-10-14 02:41:56 +08:00
/* ************************************************************************* */
2011-12-12 05:09:07 +08:00
string Constructor : : matlab_wrapper_name ( const string & className ) const {
2012-07-03 02:18:11 +08:00
string str = " new_ " + className ;
2011-10-14 02:41:56 +08:00
return str ;
}
/* ************************************************************************* */
2012-07-05 22:04:36 +08:00
void Constructor : : proxy_fragment ( FileWriter & file , const std : : string & wrapperName ,
2012-07-18 23:47:06 +08:00
bool hasParent , const int id , const ArgumentList args ) const {
2012-10-02 22:40:07 +08:00
size_t nrArgs = args . size ( ) ;
// check for number of arguments...
2012-07-05 22:04:36 +08:00
file . oss < < " elseif nargin == " < < nrArgs ;
2012-01-16 05:42:41 +08:00
if ( nrArgs > 0 ) file . oss < < " && " ;
2012-10-02 22:40:07 +08:00
// ...and their types
2011-10-14 02:41:56 +08:00
bool first = true ;
2012-01-10 13:06:46 +08:00
for ( size_t i = 0 ; i < nrArgs ; i + + ) {
2012-01-16 05:42:41 +08:00
if ( ! first ) file . oss < < " && " ;
2012-07-18 23:47:06 +08:00
file . oss < < " isa(varargin{ " < < i + 1 < < " },' " < < args [ i ] . matlabClass ( " . " ) < < " ') " ;
2012-01-10 13:06:46 +08:00
first = false ;
}
// emit code for calling constructor
2012-10-02 22:40:07 +08:00
if ( hasParent )
file . oss < < " \n [ my_ptr, base_ptr ] = " ;
else
file . oss < < " \n my_ptr = " ;
2012-07-09 08:02:43 +08:00
file . oss < < wrapperName < < " ( " < < id ;
2012-01-10 13:06:46 +08:00
// emit constructor arguments
for ( size_t i = 0 ; i < nrArgs ; i + + ) {
2012-07-08 20:27:39 +08:00
file . oss < < " , " ;
2012-01-16 05:42:41 +08:00
file . oss < < " varargin{ " < < i + 1 < < " } " ;
2011-10-14 02:41:56 +08:00
}
2012-07-05 22:04:36 +08:00
file . oss < < " ); \n " ;
2011-10-14 02:41:56 +08:00
}
/* ************************************************************************* */
2012-07-05 22:04:36 +08:00
string Constructor : : wrapper_fragment ( FileWriter & file ,
2012-10-02 22:40:07 +08:00
const string & cppClassName ,
const string & matlabUniqueName ,
const string & cppBaseClassName ,
int id ,
const ArgumentList & al ) const {
2012-07-05 22:04:57 +08:00
2012-10-02 22:40:07 +08:00
const string wrapFunctionName = matlabUniqueName + " _constructor_ " + boost : : lexical_cast < string > ( id ) ;
2012-07-05 22:04:36 +08:00
file . oss < < " void " < < wrapFunctionName < < " (int nargout, mxArray *out[], int nargin, const mxArray *in[]) " < < endl ;
file . oss < < " { \n " ;
2012-10-02 22:40:07 +08:00
file . oss < < " mexAtExit(&_deleteAllObjects); \n " ;
2012-06-27 02:52:27 +08:00
//Typedef boost::shared_ptr
2012-10-02 22:40:07 +08:00
file . oss < < " typedef boost::shared_ptr< " < < cppClassName < < " > Shared; \n " ;
file . oss < < " \n " ;
2012-06-27 02:52:27 +08:00
2012-10-02 22:40:07 +08:00
//Check to see if there will be any arguments and remove {} for consiseness
if ( al . size ( ) > 0 )
al . matlab_unwrap ( file ) ; // unwrap arguments
file . oss < < " Shared *self = new Shared(new " < < cppClassName < < " ( " < < al . names ( ) < < " )); " < < endl ;
file . oss < < " collector_ " < < matlabUniqueName < < " .insert(self); \n " ;
2012-07-05 22:04:36 +08:00
2012-10-02 22:40:07 +08:00
if ( verbose_ )
2012-07-05 22:04:36 +08:00
file . oss < < " std::cout << \" constructed \" << self << \" << std::endl; " < < endl ;
file . oss < < " out[0] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); " < < endl ;
file . oss < < " *reinterpret_cast<Shared**> (mxGetData(out[0])) = self; " < < endl ;
2012-06-27 02:52:27 +08:00
2012-10-02 22:40:07 +08:00
// If we have a base class, return the base class pointer (MATLAB will call the base class collectorInsertAndMakeBase to add this to the collector and recurse the heirarchy)
if ( ! cppBaseClassName . empty ( ) ) {
file . oss < < " \n " ;
file . oss < < " typedef boost::shared_ptr< " < < cppBaseClassName < < " > SharedBase; \n " ;
2012-07-09 08:02:43 +08:00
file . oss < < " out[1] = mxCreateNumericMatrix(1, 1, mxUINT32OR64_CLASS, mxREAL); \n " ;
2012-10-02 22:40:07 +08:00
file . oss < < " *reinterpret_cast<SharedBase**>(mxGetData(out[1])) = new SharedBase(*self); \n " ;
}
2012-07-09 08:02:43 +08:00
2012-01-16 05:42:41 +08:00
file . oss < < " } " < < endl ;
2011-10-14 02:41:56 +08:00
2012-10-02 22:40:07 +08:00
return wrapFunctionName ;
2011-10-14 02:41:56 +08:00
}
/* ************************************************************************* */