5163 lines
212 KiB
C++
5163 lines
212 KiB
C++
// Copyright (C) 2012 Massachusetts Institute of Technology, Lincoln Laboratory
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
// Authors: Davis E. King (davis@dlib.net)
|
|
/*
|
|
READ THIS FIRST
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
\############/
|
|
\##########/
|
|
\########/
|
|
\######/
|
|
\####/
|
|
\##/
|
|
\/
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
See example_mex_function.cpp for a discussion of how to use the mex wrapper.
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
/\
|
|
/##\
|
|
/####\
|
|
/######\
|
|
/########\
|
|
/##########\
|
|
/############\
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
######
|
|
READ THIS FIRST
|
|
*/
|
|
|
|
// Copyright (C) 2012 Massachusetts Institute of Technology, Lincoln Laboratory
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
// Authors: Davis E. King (davis@dlib.net)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
// BEGIN IMPLEMENTATION DETAILS
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
#include "../matrix.h"
|
|
#include "../array2d.h"
|
|
#include "../array.h"
|
|
#include "../image_transforms.h"
|
|
#include "../is_kind.h"
|
|
#include "../string.h"
|
|
#include "../any.h" // for sig_traits
|
|
#include "../hash.h"
|
|
#include <tuple>
|
|
#include <map>
|
|
|
|
#if defined(_MSC_VER)
|
|
#define DLL_EXPORT_SYM __declspec(dllexport)
|
|
#endif
|
|
#include "mex.h"
|
|
#include <sstream>
|
|
#include "call_matlab.h"
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
#ifdef ARG_1_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_1 else A1 = ARG_1_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_1
|
|
#endif
|
|
|
|
#ifdef ARG_2_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_2 else A2 = ARG_2_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_2
|
|
#endif
|
|
|
|
#ifdef ARG_3_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_3 else A3 = ARG_3_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_3
|
|
#endif
|
|
|
|
#ifdef ARG_4_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_4 else A4 = ARG_4_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_4
|
|
#endif
|
|
|
|
#ifdef ARG_5_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_5 else A5 = ARG_5_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_5
|
|
#endif
|
|
|
|
#ifdef ARG_6_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_6 else A6 = ARG_6_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_6
|
|
#endif
|
|
|
|
#ifdef ARG_7_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_7 else A7 = ARG_7_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_7
|
|
#endif
|
|
|
|
#ifdef ARG_8_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_8 else A8 = ARG_8_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_8
|
|
#endif
|
|
|
|
#ifdef ARG_9_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_9 else A9 = ARG_9_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_9
|
|
#endif
|
|
|
|
#ifdef ARG_10_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_10 else A10 = ARG_10_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_10
|
|
#endif
|
|
|
|
#ifdef ARG_11_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_11 else A11 = ARG_11_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_11
|
|
#endif
|
|
|
|
#ifdef ARG_12_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_12 else A12 = ARG_12_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_12
|
|
#endif
|
|
|
|
#ifdef ARG_13_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_13 else A13 = ARG_13_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_13
|
|
#endif
|
|
|
|
#ifdef ARG_14_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_14 else A14 = ARG_14_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_14
|
|
#endif
|
|
|
|
#ifdef ARG_15_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_15 else A15 = ARG_15_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_15
|
|
#endif
|
|
|
|
#ifdef ARG_16_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_16 else A16 = ARG_16_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_16
|
|
#endif
|
|
|
|
#ifdef ARG_17_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_17 else A17 = ARG_17_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_17
|
|
#endif
|
|
|
|
#ifdef ARG_18_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_18 else A18 = ARG_18_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_18
|
|
#endif
|
|
|
|
#ifdef ARG_19_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_19 else A19 = ARG_19_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_19
|
|
#endif
|
|
|
|
#ifdef ARG_20_DEFAULT
|
|
#define ELSE_ASSIGN_ARG_20 else A20 = ARG_20_DEFAULT;
|
|
#else
|
|
#define ELSE_ASSIGN_ARG_20
|
|
#endif
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
namespace mex_binding
|
|
{
|
|
using namespace dlib;
|
|
|
|
template <typename T>
|
|
struct is_input_type
|
|
{
|
|
const static unsigned long value = (!is_same_type<void,T>::value && (!is_reference_type<T>::value || is_const_type<T>::value )) ? 1 : 0;
|
|
};
|
|
template <typename T>
|
|
struct is_output_type
|
|
{
|
|
const static unsigned long value = (!is_same_type<void,T>::value && is_reference_type<T>::value && !is_const_type<T>::value) ? 1 : 0;
|
|
};
|
|
|
|
|
|
template <typename funct>
|
|
struct funct_traits
|
|
{
|
|
const static unsigned long num_inputs = is_input_type<typename sig_traits<funct>::arg1_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg2_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg3_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg4_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg5_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg6_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg7_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg8_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg9_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg10_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg11_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg12_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg13_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg14_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg15_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg16_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg17_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg18_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg19_type>::value +
|
|
is_input_type<typename sig_traits<funct>::arg20_type>::value;
|
|
|
|
const static unsigned long num_outputs= is_output_type<typename sig_traits<funct>::arg1_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg2_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg3_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg4_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg5_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg6_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg7_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg8_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg9_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg10_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg11_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg12_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg13_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg14_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg15_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg16_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg17_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg18_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg19_type>::value +
|
|
is_output_type<typename sig_traits<funct>::arg20_type>::value;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <typename T>
|
|
struct is_array_type
|
|
{
|
|
// true if T is std::vector or dlib::array
|
|
const static bool value = is_std_vector<T>::value || dlib::is_array<T>::value;
|
|
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename T,
|
|
typename enabled = void
|
|
>
|
|
struct inner_type
|
|
{
|
|
typedef T type;
|
|
};
|
|
|
|
template < typename T>
|
|
struct inner_type<T, typename dlib::enable_if_c<is_matrix<T>::value || is_array2d<T>::value || dlib::is_array<T>::value >::type>
|
|
{
|
|
typedef typename T::type type;
|
|
};
|
|
|
|
template < typename T>
|
|
struct inner_type<T, typename dlib::enable_if<is_std_vector<T> >::type>
|
|
{
|
|
typedef typename T::value_type type;
|
|
};
|
|
|
|
|
|
// -------------------------------------------------------
|
|
|
|
struct user_hit_ctrl_c {};
|
|
|
|
// -------------------------------------------------------
|
|
|
|
template <typename T>
|
|
void validate_and_populate_arg (
|
|
long arg_idx,
|
|
const mxArray *prhs,
|
|
T& arg
|
|
);
|
|
|
|
void validate_and_populate_arg(
|
|
long arg_idx,
|
|
const mxArray *prhs,
|
|
matlab_struct& arg
|
|
);
|
|
|
|
void validate_and_populate_arg(
|
|
long arg_idx,
|
|
const mxArray *prhs,
|
|
matlab_object& arg
|
|
);
|
|
|
|
void validate_and_populate_arg(
|
|
long arg_idx,
|
|
const mxArray *prhs,
|
|
std::string& arg
|
|
);
|
|
|
|
// -------------------------------------------------------
|
|
|
|
template <typename T>
|
|
struct is_column_major_matrix : public default_is_kind_value {};
|
|
|
|
template <
|
|
typename T,
|
|
long num_rows,
|
|
long num_cols,
|
|
typename mem_manager
|
|
>
|
|
struct is_column_major_matrix<matrix<T,num_rows,num_cols,mem_manager,column_major_layout> >
|
|
{ static const bool value = true; };
|
|
|
|
// -------------------------------------------------------
|
|
|
|
string escape_percent(const string& str)
|
|
{
|
|
string temp;
|
|
for(auto c : str)
|
|
{
|
|
if (c != '%')
|
|
{
|
|
temp += c;
|
|
}
|
|
else
|
|
{
|
|
temp += c;
|
|
temp += c;
|
|
}
|
|
}
|
|
return temp;
|
|
}
|
|
|
|
string escape_percent(const std::ostringstream& sout)
|
|
{
|
|
return escape_percent(sout.str());
|
|
}
|
|
|
|
// -------------------------------------------------------
|
|
|
|
template <
|
|
typename matrix_type
|
|
>
|
|
typename dlib::enable_if_c<is_matrix<matrix_type>::value || is_array2d<matrix_type>::value >::type
|
|
clear_mat (
|
|
matrix_type& m
|
|
)
|
|
{
|
|
m.set_size(0,0);
|
|
}
|
|
|
|
template <
|
|
typename matrix_type
|
|
>
|
|
typename dlib::disable_if_c<is_matrix<matrix_type>::value || is_array2d<matrix_type>::value >::type
|
|
clear_mat (
|
|
matrix_type&
|
|
)
|
|
{
|
|
}
|
|
|
|
// -------------------------------------------------------
|
|
|
|
template <
|
|
typename matrix_type,
|
|
typename EXP
|
|
>
|
|
typename dlib::enable_if_c<is_matrix<matrix_type>::value && is_same_type<typename inner_type<matrix_type>::type,typename EXP::type>::value >::type
|
|
assign_mat (
|
|
const long arg_idx,
|
|
matrix_type& m,
|
|
const matrix_exp<EXP>& src
|
|
)
|
|
{
|
|
if (matrix_type::NR != 0 && matrix_type::NR != src.nc())
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Argument " << arg_idx+1 << " expects a matrix with " << matrix_type::NR << " rows but got one with " << src.nc();
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
if (matrix_type::NC != 0 && matrix_type::NC != src.nr())
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Argument " << arg_idx+1 << " expects a matrix with " << matrix_type::NC << " columns but got one with " << src.nr();
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
|
|
m = trans(src);
|
|
}
|
|
|
|
template <
|
|
typename matrix_type,
|
|
typename EXP
|
|
>
|
|
typename dlib::enable_if_c<is_array2d<matrix_type>::value && is_same_type<typename inner_type<matrix_type>::type,typename EXP::type>::value >::type
|
|
assign_mat (
|
|
const long arg_idx,
|
|
matrix_type& m,
|
|
const matrix_exp<EXP>& src
|
|
)
|
|
{
|
|
assign_image(m , trans(src));
|
|
}
|
|
|
|
template <
|
|
typename matrix_type,
|
|
typename EXP
|
|
>
|
|
typename disable_if_c<(is_array2d<matrix_type>::value || is_matrix<matrix_type>::value) &&
|
|
is_same_type<typename inner_type<matrix_type>::type,typename EXP::type>::value >::type
|
|
assign_mat (
|
|
const long arg_idx,
|
|
matrix_type& ,
|
|
const matrix_exp<EXP>&
|
|
)
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "mex_function has some bug in it related to processing input argument " << arg_idx+1;
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
|
|
// -------------------------------------------------------
|
|
|
|
template <
|
|
typename T,
|
|
typename U
|
|
>
|
|
typename dlib::enable_if_c<is_built_in_scalar_type<T>::value || is_same_type<T,bool>::value >::type
|
|
assign_scalar (
|
|
const long arg_idx,
|
|
T& dest,
|
|
const U& src
|
|
)
|
|
{
|
|
if (is_signed_type<U>::value && src < 0 && is_unsigned_type<T>::value)
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Error, input argument " << arg_idx+1 << " must be a non-negative number.";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
else
|
|
{
|
|
dest = src;
|
|
}
|
|
}
|
|
|
|
template <
|
|
typename T,
|
|
typename U
|
|
>
|
|
typename dlib::disable_if_c<is_built_in_scalar_type<T>::value || is_same_type<T,bool>::value >::type
|
|
assign_scalar (
|
|
const long arg_idx,
|
|
T& ,
|
|
const U&
|
|
)
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "mex_function has some bug in it related to processing input argument " << arg_idx+1;
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
|
|
// -------------------------------------------------------
|
|
|
|
void assign_function_handle (
|
|
const long arg_idx,
|
|
function_handle& dest,
|
|
const mxArray* src
|
|
)
|
|
{
|
|
const_cast<void*&>(dest.h) = (void*)src;
|
|
}
|
|
|
|
template <
|
|
typename T
|
|
>
|
|
void assign_function_handle (
|
|
const long arg_idx,
|
|
T& ,
|
|
const mxArray*
|
|
)
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "mex_function has some bug in it related to processing input argument " << arg_idx+1;
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
|
|
// -------------------------------------------------------
|
|
|
|
template <
|
|
typename T
|
|
>
|
|
typename dlib::enable_if<is_array_type<T> >::type
|
|
assign_std_vector (
|
|
const long arg_idx,
|
|
T& dest,
|
|
const mxArray* src
|
|
)
|
|
{
|
|
const long nr = mxGetM(src);
|
|
const long nc = mxGetN(src);
|
|
|
|
typedef typename inner_type<T>::type type;
|
|
|
|
if (!mxIsCell(src))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a cell array";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
if (nr != 1 && nc != 1)
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a cell array with exactly 1 row or 1 column (i.e. a row or column vector)";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
const long size = nr*nc;
|
|
dest.resize(size);
|
|
|
|
for (unsigned long i = 0; i < dest.size(); ++i)
|
|
{
|
|
try
|
|
{
|
|
validate_and_populate_arg(i, mxGetCell(src, i), dest[i]);
|
|
}
|
|
catch (invalid_args_exception& e)
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Error in argument " << arg_idx+1 << ": element " << i+1 << " of cell array not the expected type.\n";
|
|
sout << "\t" << e.what();
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
template <
|
|
typename T
|
|
>
|
|
typename disable_if<is_array_type<T> >::type
|
|
assign_std_vector (
|
|
const long arg_idx,
|
|
T& ,
|
|
const mxArray*
|
|
)
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "mex_function has some bug in it related to processing input argument " << arg_idx+1;
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
// -------------------------------------------------------
|
|
|
|
template <typename T>
|
|
void assign_image (
|
|
const long arg_idx,
|
|
T&,
|
|
const dlib::uint8* data,
|
|
long nr,
|
|
long nc
|
|
)
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "mex_function has some bug in it related to processing input argument " << arg_idx+1;
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
template <typename MM>
|
|
void assign_image(
|
|
const long ,
|
|
array2d<dlib::rgb_pixel,MM>& img,
|
|
const dlib::uint8* data,
|
|
long nr,
|
|
long nc
|
|
)
|
|
{
|
|
img.set_size(nr, nc);
|
|
for (long c = 0; c < img.nc(); ++c)
|
|
for (long r = 0; r < img.nr(); ++r)
|
|
img[r][c].red = *data++;
|
|
for (long c = 0; c < img.nc(); ++c)
|
|
for (long r = 0; r < img.nr(); ++r)
|
|
img[r][c].green = *data++;
|
|
for (long c = 0; c < img.nc(); ++c)
|
|
for (long r = 0; r < img.nr(); ++r)
|
|
img[r][c].blue = *data++;
|
|
}
|
|
|
|
// -------------------------------------------------------
|
|
|
|
template <typename T>
|
|
void call_private_set_mxArray(T&, mxArray*) {}
|
|
void call_private_set_mxArray(matrix_colmajor& item, mxArray* m) { item._private_set_mxArray(m); }
|
|
void call_private_set_mxArray(fmatrix_colmajor& item, mxArray* m) { item._private_set_mxArray(m); }
|
|
|
|
// -------------------------------------------------------
|
|
|
|
template <typename T>
|
|
void validate_and_populate_arg (
|
|
long arg_idx,
|
|
const mxArray *prhs,
|
|
T& arg
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
if (is_built_in_scalar_type<T>::value || is_same_type<T,bool>::value)
|
|
{
|
|
if( !(mxIsDouble(prhs) || mxIsSingle(prhs) || mxIsLogical(prhs) ) ||
|
|
mxIsComplex(prhs) ||
|
|
mxGetNumberOfElements(prhs)!=1 )
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a scalar";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
assign_scalar(arg_idx, arg , mxGetScalar(prhs));
|
|
}
|
|
else if (is_matrix<T>::value || is_array2d<T>::value)
|
|
{
|
|
if (prhs == NULL)
|
|
{
|
|
clear_mat(arg);
|
|
return;
|
|
}
|
|
|
|
typedef typename inner_type<T>::type type;
|
|
|
|
const int num_dims = mxGetNumberOfDimensions(prhs);
|
|
const long nr = mxGetM(prhs);
|
|
const long nc = mxGetN(prhs);
|
|
|
|
if (is_same_type<type,dlib::rgb_pixel>::value)
|
|
{
|
|
if (!(num_dims == 3 && mxGetDimensions(prhs)[2] == 3 && mxIsUint8(prhs)))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a 3-D NxMx3 image matrix of uint8";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
const long rows = mxGetDimensions(prhs)[0];
|
|
const long cols = mxGetDimensions(prhs)[1];
|
|
assign_image(arg_idx, arg , (const dlib::uint8*)mxGetData(prhs), rows, cols);
|
|
return;
|
|
}
|
|
|
|
if (num_dims != 2)
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a 2-D matrix (got a " << num_dims << "-D matrix)";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
|
|
if (is_same_type<type,double>::value)
|
|
{
|
|
if (!mxIsDouble(prhs) || mxIsComplex(prhs))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a matrix of doubles";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
if (is_column_major_matrix<T>::value)
|
|
call_private_set_mxArray(arg, (mxArray*)prhs);
|
|
else
|
|
assign_mat(arg_idx, arg , pointer_to_matrix(mxGetPr(prhs), nc, nr));
|
|
}
|
|
else if (is_same_type<type, float>::value)
|
|
{
|
|
if (!mxIsSingle(prhs) || mxIsComplex(prhs))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a matrix of single/float";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
if (is_column_major_matrix<T>::value)
|
|
call_private_set_mxArray(arg,(mxArray*)prhs);
|
|
else
|
|
assign_mat(arg_idx, arg , pointer_to_matrix((const float*)mxGetData(prhs), nc, nr));
|
|
}
|
|
else if (is_same_type<type, bool>::value)
|
|
{
|
|
if (!mxIsLogical(prhs))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a matrix of logical elements.";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
DLIB_CASSERT(sizeof(mxLogical) == sizeof(bool),"logical matrices are not supported by the mex wrapper when mxLogical isn't a bool.");
|
|
|
|
assign_mat(arg_idx, arg , pointer_to_matrix((const bool*)mxGetData(prhs), nc, nr));
|
|
}
|
|
else if (is_same_type<type, dlib::uint8>::value)
|
|
{
|
|
if (!mxIsUint8(prhs) || mxIsComplex(prhs))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a matrix of uint8";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
assign_mat(arg_idx, arg , pointer_to_matrix((const dlib::uint8*)mxGetData(prhs), nc, nr));
|
|
}
|
|
else if (is_same_type<type, dlib::int8>::value)
|
|
{
|
|
if (!mxIsInt8(prhs) || mxIsComplex(prhs))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a matrix of int8";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
assign_mat(arg_idx, arg , pointer_to_matrix((const dlib::int8*)mxGetData(prhs), nc, nr));
|
|
}
|
|
else if (is_same_type<type, dlib::int16>::value ||
|
|
(is_same_type<type, short>::value && sizeof(short) == sizeof(dlib::int16)))
|
|
{
|
|
if (!mxIsInt16(prhs) || mxIsComplex(prhs))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a matrix of int16";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
assign_mat(arg_idx, arg , pointer_to_matrix((const type*)mxGetData(prhs), nc, nr));
|
|
}
|
|
else if (is_same_type<type, dlib::uint16>::value ||
|
|
(is_same_type<type, unsigned short>::value && sizeof(unsigned short) == sizeof(dlib::uint16)))
|
|
{
|
|
if (!mxIsUint16(prhs) || mxIsComplex(prhs))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a matrix of uint16";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
assign_mat(arg_idx, arg , pointer_to_matrix((const type*)mxGetData(prhs), nc, nr));
|
|
}
|
|
else if (is_same_type<type, dlib::int32>::value ||
|
|
(is_same_type<type, int>::value && sizeof(int) == sizeof(dlib::int32)) ||
|
|
(is_same_type<type, long>::value && sizeof(long) == sizeof(dlib::int32)))
|
|
{
|
|
if (!mxIsInt32(prhs) || mxIsComplex(prhs))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a matrix of int32";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
assign_mat(arg_idx, arg , pointer_to_matrix((const type*)mxGetData(prhs), nc, nr));
|
|
}
|
|
else if (is_same_type<type, dlib::uint32>::value ||
|
|
(is_same_type<type, unsigned int>::value && sizeof(unsigned int) == sizeof(dlib::uint32)) ||
|
|
(is_same_type<type, unsigned long>::value && sizeof(unsigned long) == sizeof(dlib::uint32)))
|
|
{
|
|
if (!mxIsUint32(prhs) || mxIsComplex(prhs))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a matrix of uint32";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
assign_mat(arg_idx, arg , pointer_to_matrix((const type*)mxGetData(prhs), nc, nr));
|
|
}
|
|
else if (is_same_type<type, dlib::uint64>::value ||
|
|
(is_same_type<type, unsigned int>::value && sizeof(unsigned int) == sizeof(dlib::uint64)) ||
|
|
(is_same_type<type, unsigned long>::value && sizeof(unsigned long) == sizeof(dlib::uint64)))
|
|
{
|
|
if (!mxIsUint64(prhs) || mxIsComplex(prhs))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a matrix of uint64";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
assign_mat(arg_idx, arg , pointer_to_matrix((const type*)mxGetData(prhs), nc, nr));
|
|
}
|
|
else if (is_same_type<type, dlib::int64>::value ||
|
|
(is_same_type<type, int>::value && sizeof(int) == sizeof(dlib::int64)) ||
|
|
(is_same_type<type, long>::value && sizeof(long) == sizeof(dlib::int64)))
|
|
{
|
|
if (!mxIsInt64(prhs) || mxIsComplex(prhs))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a matrix of int64";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
assign_mat(arg_idx, arg , pointer_to_matrix((const type*)mxGetData(prhs), nc, nr));
|
|
}
|
|
else
|
|
{
|
|
throw invalid_args_exception("mex_function uses unsupported matrix type");
|
|
}
|
|
}
|
|
else if (is_array_type<T>::value)
|
|
{
|
|
assign_std_vector(arg_idx, arg, prhs);
|
|
|
|
}
|
|
else if (is_same_type<T,function_handle>::value)
|
|
{
|
|
if (!mxIsClass(prhs, "function_handle"))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a function handle.";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
assign_function_handle(arg_idx, arg, prhs);
|
|
}
|
|
else
|
|
{
|
|
throw invalid_args_exception("mex_function uses unsupported input argument type");
|
|
}
|
|
}
|
|
|
|
void validate_and_populate_arg(
|
|
long arg_idx,
|
|
const mxArray *prhs,
|
|
matlab_struct& arg
|
|
)
|
|
{
|
|
if (!mxIsStruct(prhs))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a struct";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
arg.set_struct_handle(arg_idx, prhs);
|
|
}
|
|
|
|
|
|
void validate_and_populate_arg(
|
|
long arg_idx,
|
|
const mxArray *prhs,
|
|
matlab_object& arg
|
|
)
|
|
{
|
|
arg.set_object_handle(arg_idx, prhs);
|
|
}
|
|
|
|
|
|
void validate_and_populate_arg(
|
|
long arg_idx,
|
|
const mxArray *prhs,
|
|
std::string& arg
|
|
)
|
|
{
|
|
if (!mxIsChar(prhs))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " must be a char string";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
|
|
const long nr = mxGetM(prhs);
|
|
const long nc = mxGetN(prhs);
|
|
const long size = nr*nc;
|
|
arg.resize(size+1);
|
|
if (mxGetString(prhs, &arg[0], arg.size()))
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Input argument " << arg_idx+1 << " encountered an error while calling mxGetString()";
|
|
throw invalid_args_exception(sout);
|
|
}
|
|
arg.resize(size);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <typename EXP>
|
|
typename dlib::enable_if<is_same_type<dlib::rgb_pixel,typename EXP::type> >::type assign_image_to_matlab (
|
|
dlib::uint8* mat,
|
|
const matrix_exp<EXP>& item
|
|
)
|
|
{
|
|
for (long c = 0; c < item.nc(); ++c)
|
|
for (long r = 0; r < item.nr(); ++r)
|
|
*mat++ = item(r,c).red;
|
|
for (long c = 0; c < item.nc(); ++c)
|
|
for (long r = 0; r < item.nr(); ++r)
|
|
*mat++ = item(r,c).green;
|
|
for (long c = 0; c < item.nc(); ++c)
|
|
for (long r = 0; r < item.nr(); ++r)
|
|
*mat++ = item(r,c).blue;
|
|
}
|
|
|
|
template <typename T, typename EXP>
|
|
typename disable_if<is_same_type<dlib::rgb_pixel,typename EXP::type> >::type assign_image_to_matlab (
|
|
T* mat,
|
|
const matrix_exp<EXP>&
|
|
)
|
|
{
|
|
mexErrMsgIdAndTxt("mex_function:validate_and_populate_arg",
|
|
"mex_function uses unsupported output image argument type");
|
|
}
|
|
|
|
template <typename T>
|
|
typename dlib::enable_if<is_matrix<T> >::type assign_to_matlab(
|
|
mxArray*& plhs,
|
|
const T& item
|
|
)
|
|
{
|
|
typedef typename T::type type;
|
|
|
|
type* mat = 0;
|
|
|
|
if (is_same_type<double, type>::value)
|
|
{
|
|
plhs = mxCreateDoubleMatrix(item.nr(),
|
|
item.nc(),
|
|
mxREAL);
|
|
|
|
mat = (type*)mxGetPr(plhs);
|
|
}
|
|
else if (is_same_type<float, type>::value )
|
|
{
|
|
plhs = mxCreateNumericMatrix(item.nr(),
|
|
item.nc(),
|
|
mxSINGLE_CLASS,
|
|
mxREAL);
|
|
|
|
mat = (type*)mxGetData(plhs);
|
|
}
|
|
else if (is_same_type<bool, type>::value )
|
|
{
|
|
plhs = mxCreateLogicalMatrix(item.nr(),
|
|
item.nc());
|
|
|
|
mat = (type*)mxGetData(plhs);
|
|
}
|
|
else if (is_same_type<dlib::uint8, type>::value )
|
|
{
|
|
plhs = mxCreateNumericMatrix(item.nr(),
|
|
item.nc(),
|
|
mxUINT8_CLASS,
|
|
mxREAL);
|
|
|
|
mat = (type*)mxGetData(plhs);
|
|
}
|
|
else if (is_same_type<dlib::int8, type>::value )
|
|
{
|
|
plhs = mxCreateNumericMatrix(item.nr(),
|
|
item.nc(),
|
|
mxINT8_CLASS,
|
|
mxREAL);
|
|
|
|
mat = (type*)mxGetData(plhs);
|
|
}
|
|
else if (is_same_type<dlib::int16, type>::value ||
|
|
(is_same_type<short,type>::value && sizeof(short) == sizeof(dlib::int16)))
|
|
{
|
|
plhs = mxCreateNumericMatrix(item.nr(),
|
|
item.nc(),
|
|
mxINT16_CLASS,
|
|
mxREAL);
|
|
|
|
mat = (type*)mxGetData(plhs);
|
|
}
|
|
else if (is_same_type<dlib::uint16, type>::value ||
|
|
(is_same_type<unsigned short,type>::value && sizeof(unsigned short) == sizeof(dlib::uint16)))
|
|
{
|
|
plhs = mxCreateNumericMatrix(item.nr(),
|
|
item.nc(),
|
|
mxUINT16_CLASS,
|
|
mxREAL);
|
|
|
|
mat = (type*)mxGetData(plhs);
|
|
}
|
|
else if (is_same_type<dlib::int32, type>::value ||
|
|
(is_same_type<long,type>::value && sizeof(long) == sizeof(dlib::int32)))
|
|
{
|
|
plhs = mxCreateNumericMatrix(item.nr(),
|
|
item.nc(),
|
|
mxINT32_CLASS,
|
|
mxREAL);
|
|
|
|
mat = (type*)mxGetData(plhs);
|
|
}
|
|
else if (is_same_type<dlib::uint32, type>::value ||
|
|
(is_same_type<unsigned long,type>::value && sizeof(unsigned long) == sizeof(dlib::uint32)))
|
|
{
|
|
plhs = mxCreateNumericMatrix(item.nr(),
|
|
item.nc(),
|
|
mxUINT32_CLASS,
|
|
mxREAL);
|
|
|
|
mat = (type*)mxGetData(plhs);
|
|
}
|
|
else if (is_same_type<dlib::uint64, type>::value ||
|
|
(is_same_type<unsigned long,type>::value && sizeof(unsigned long) == sizeof(dlib::uint64)))
|
|
{
|
|
plhs = mxCreateNumericMatrix(item.nr(),
|
|
item.nc(),
|
|
mxUINT64_CLASS,
|
|
mxREAL);
|
|
|
|
mat = (type*)mxGetData(plhs);
|
|
}
|
|
else if (is_same_type<dlib::int64, type>::value ||
|
|
(is_same_type<long,type>::value && sizeof(long) == sizeof(dlib::int64)))
|
|
{
|
|
plhs = mxCreateNumericMatrix(item.nr(),
|
|
item.nc(),
|
|
mxINT64_CLASS,
|
|
mxREAL);
|
|
|
|
mat = (type*)mxGetData(plhs);
|
|
}
|
|
else if (is_same_type<dlib::rgb_pixel, type>::value)
|
|
{
|
|
mwSize dims[3] = {(mwSize)item.nr(), (mwSize)item.nc(), 3};
|
|
plhs = mxCreateNumericArray(3, dims, mxUINT8_CLASS, mxREAL);
|
|
|
|
assign_image_to_matlab((dlib::uint8*)mxGetData(plhs), item);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
mexErrMsgIdAndTxt("mex_function:validate_and_populate_arg",
|
|
"mex_function uses unsupported output argument type");
|
|
}
|
|
|
|
|
|
const_temp_matrix<T> m(item);
|
|
|
|
for (long c = 0; c < m.nc(); ++c)
|
|
{
|
|
for ( long r = 0; r < m.nr(); ++r)
|
|
{
|
|
*mat++ = m(r,c);
|
|
}
|
|
}
|
|
}
|
|
|
|
void assign_to_matlab(
|
|
mxArray*& plhs,
|
|
matrix_colmajor& item
|
|
)
|
|
{
|
|
if(item._private_is_owned_by_matlab())
|
|
{
|
|
// Don't need to do a copy if it's this kind of matrix since we can just
|
|
// pull the underlying mxArray out directly and thus avoid a copy.
|
|
plhs = item._private_release_mxArray();
|
|
// If there isn't anything there because the matrix is empty then set it to an
|
|
// empty matrix.
|
|
if (!plhs)
|
|
plhs = mxCreateDoubleMatrix(item.nr(),
|
|
item.nc(),
|
|
mxREAL);
|
|
}
|
|
else
|
|
{
|
|
plhs = mxCreateDoubleMatrix(item.nr(),
|
|
item.nc(),
|
|
mxREAL);
|
|
if (item.size() != 0)
|
|
memcpy(mxGetPr(plhs), &item(0,0), item.size()*sizeof(double));
|
|
}
|
|
}
|
|
|
|
void assign_to_matlab(
|
|
mxArray*& plhs,
|
|
fmatrix_colmajor& item
|
|
)
|
|
{
|
|
if(item._private_is_owned_by_matlab())
|
|
{
|
|
// Don't need to do a copy if it's this kind of matrix since we can just
|
|
// pull the underlying mxArray out directly and thus avoid a copy.
|
|
plhs = item._private_release_mxArray();
|
|
// If there isn't anything there because the matrix is empty then set it to an
|
|
// empty matrix.
|
|
if (!plhs)
|
|
plhs = mxCreateNumericMatrix(item.nr(),
|
|
item.nc(),
|
|
mxSINGLE_CLASS,
|
|
mxREAL);
|
|
}
|
|
else
|
|
{
|
|
plhs = mxCreateNumericMatrix(item.nr(),
|
|
item.nc(),
|
|
mxSINGLE_CLASS,
|
|
mxREAL);
|
|
if (item.size() != 0)
|
|
memcpy(mxGetPr(plhs), &item(0,0), item.size()*sizeof(float));
|
|
}
|
|
}
|
|
|
|
void assign_to_matlab(
|
|
mxArray*& plhs,
|
|
matlab_struct& item
|
|
)
|
|
{
|
|
plhs = (mxArray*)item.release_struct_to_matlab();
|
|
}
|
|
|
|
void assign_to_matlab(
|
|
mxArray*& plhs,
|
|
matlab_object& item
|
|
)
|
|
{
|
|
plhs = (mxArray*)item.release_object_to_matlab();
|
|
}
|
|
|
|
void assign_to_matlab(
|
|
mxArray*& plhs,
|
|
const std::string& item
|
|
)
|
|
{
|
|
plhs = mxCreateString(item.c_str());
|
|
}
|
|
|
|
template <typename T, typename MM>
|
|
void assign_to_matlab(
|
|
mxArray*& plhs,
|
|
const array2d<T,MM>& item
|
|
)
|
|
{
|
|
assign_to_matlab(plhs,array_to_matrix(item));
|
|
}
|
|
|
|
template <typename T>
|
|
typename dlib::disable_if_c<is_matrix<T>::value || is_array_type<T>::value ||
|
|
is_same_type<T,function_handle>::value>::type assign_to_matlab(
|
|
mxArray*& plhs,
|
|
const T& item
|
|
)
|
|
{
|
|
plhs = mxCreateDoubleScalar(item);
|
|
}
|
|
|
|
|
|
void assign_to_matlab (
|
|
mxArray*& plhs,
|
|
const char* str
|
|
)
|
|
{
|
|
assign_to_matlab(plhs, std::string(str));
|
|
}
|
|
|
|
void assign_to_matlab(
|
|
mxArray*& plhs,
|
|
const function_handle& h
|
|
)
|
|
{
|
|
}
|
|
|
|
template <typename T>
|
|
typename dlib::enable_if<is_array_type<T> >::type assign_to_matlab(
|
|
mxArray*& plhs,
|
|
const T& item
|
|
)
|
|
{
|
|
mwSize dims[1] = {item.size()};
|
|
plhs = mxCreateCellArray(1,dims);
|
|
for (unsigned long i = 0; i < item.size(); ++i)
|
|
{
|
|
mxArray* next = 0;
|
|
assign_to_matlab(next, item[i]);
|
|
mxSetCell(plhs, i, next);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <typename T>
|
|
void mark_owned_by_matlab (const T&){}
|
|
|
|
void mark_owned_by_matlab(matrix_colmajor& item) { item._private_mark_owned_by_matlab(); }
|
|
void mark_owned_by_matlab(fmatrix_colmajor& item) { item._private_mark_owned_by_matlab(); }
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
unsigned long num_args
|
|
>
|
|
struct call_mex_function_helper;
|
|
|
|
template <>
|
|
struct call_mex_function_helper<0>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int , mxArray **,
|
|
int , const mxArray **
|
|
) const
|
|
{
|
|
f();
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<1>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
|
|
f(A1);
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<2>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
|
|
f(A1,A2);
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<3>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
|
|
f(A1,A2,A3);
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<4>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
|
|
f(A1,A2,A3,A4);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<5>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
|
|
f(A1,A2,A3,A4,A5);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
}
|
|
};
|
|
|
|
|
|
template <>
|
|
struct call_mex_function_helper<6>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
|
|
f(A1,A2,A3,A4,A5,A6);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
}
|
|
};
|
|
|
|
|
|
template <>
|
|
struct call_mex_function_helper<7>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
}
|
|
};
|
|
|
|
|
|
template <>
|
|
struct call_mex_function_helper<8>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
typedef typename sig_traits<funct>::arg8_type arg8_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
typename basic_type<arg8_type>::type A8;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
mark_owned_by_matlab(A8);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
if (i < nrhs && is_input_type<arg8_type>::value) {validate_and_populate_arg(i,prhs[i],A8); ++i;} ELSE_ASSIGN_ARG_8;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7,A8);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
if (is_output_type<arg8_type>::value) {assign_to_matlab(plhs[i],A8); ++i;}
|
|
}
|
|
};
|
|
|
|
|
|
template <>
|
|
struct call_mex_function_helper<9>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
typedef typename sig_traits<funct>::arg8_type arg8_type;
|
|
typedef typename sig_traits<funct>::arg9_type arg9_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
typename basic_type<arg8_type>::type A8;
|
|
typename basic_type<arg9_type>::type A9;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
mark_owned_by_matlab(A8);
|
|
mark_owned_by_matlab(A9);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
if (i < nrhs && is_input_type<arg8_type>::value) {validate_and_populate_arg(i,prhs[i],A8); ++i;} ELSE_ASSIGN_ARG_8;
|
|
if (i < nrhs && is_input_type<arg9_type>::value) {validate_and_populate_arg(i,prhs[i],A9); ++i;} ELSE_ASSIGN_ARG_9;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7,A8,A9);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
if (is_output_type<arg8_type>::value) {assign_to_matlab(plhs[i],A8); ++i;}
|
|
if (is_output_type<arg9_type>::value) {assign_to_matlab(plhs[i],A9); ++i;}
|
|
}
|
|
};
|
|
|
|
|
|
|
|
template <>
|
|
struct call_mex_function_helper<10>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
typedef typename sig_traits<funct>::arg8_type arg8_type;
|
|
typedef typename sig_traits<funct>::arg9_type arg9_type;
|
|
typedef typename sig_traits<funct>::arg10_type arg10_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
typename basic_type<arg8_type>::type A8;
|
|
typename basic_type<arg9_type>::type A9;
|
|
typename basic_type<arg10_type>::type A10;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
mark_owned_by_matlab(A8);
|
|
mark_owned_by_matlab(A9);
|
|
mark_owned_by_matlab(A10);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
if (i < nrhs && is_input_type<arg8_type>::value) {validate_and_populate_arg(i,prhs[i],A8); ++i;} ELSE_ASSIGN_ARG_8;
|
|
if (i < nrhs && is_input_type<arg9_type>::value) {validate_and_populate_arg(i,prhs[i],A9); ++i;} ELSE_ASSIGN_ARG_9;
|
|
if (i < nrhs && is_input_type<arg10_type>::value) {validate_and_populate_arg(i,prhs[i],A10); ++i;} ELSE_ASSIGN_ARG_10;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
if (is_output_type<arg8_type>::value) {assign_to_matlab(plhs[i],A8); ++i;}
|
|
if (is_output_type<arg9_type>::value) {assign_to_matlab(plhs[i],A9); ++i;}
|
|
if (is_output_type<arg10_type>::value) {assign_to_matlab(plhs[i],A10); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<11>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
typedef typename sig_traits<funct>::arg8_type arg8_type;
|
|
typedef typename sig_traits<funct>::arg9_type arg9_type;
|
|
typedef typename sig_traits<funct>::arg10_type arg10_type;
|
|
typedef typename sig_traits<funct>::arg11_type arg11_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
typename basic_type<arg8_type>::type A8;
|
|
typename basic_type<arg9_type>::type A9;
|
|
typename basic_type<arg10_type>::type A10;
|
|
typename basic_type<arg11_type>::type A11;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
mark_owned_by_matlab(A8);
|
|
mark_owned_by_matlab(A9);
|
|
mark_owned_by_matlab(A10);
|
|
mark_owned_by_matlab(A11);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
if (i < nrhs && is_input_type<arg8_type>::value) {validate_and_populate_arg(i,prhs[i],A8); ++i;} ELSE_ASSIGN_ARG_8;
|
|
if (i < nrhs && is_input_type<arg9_type>::value) {validate_and_populate_arg(i,prhs[i],A9); ++i;} ELSE_ASSIGN_ARG_9;
|
|
if (i < nrhs && is_input_type<arg10_type>::value) {validate_and_populate_arg(i,prhs[i],A10); ++i;} ELSE_ASSIGN_ARG_10;
|
|
if (i < nrhs && is_input_type<arg11_type>::value) {validate_and_populate_arg(i,prhs[i],A11); ++i;} ELSE_ASSIGN_ARG_11;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
if (is_output_type<arg8_type>::value) {assign_to_matlab(plhs[i],A8); ++i;}
|
|
if (is_output_type<arg9_type>::value) {assign_to_matlab(plhs[i],A9); ++i;}
|
|
if (is_output_type<arg10_type>::value) {assign_to_matlab(plhs[i],A10); ++i;}
|
|
if (is_output_type<arg11_type>::value) {assign_to_matlab(plhs[i],A11); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<12>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
typedef typename sig_traits<funct>::arg8_type arg8_type;
|
|
typedef typename sig_traits<funct>::arg9_type arg9_type;
|
|
typedef typename sig_traits<funct>::arg10_type arg10_type;
|
|
typedef typename sig_traits<funct>::arg11_type arg11_type;
|
|
typedef typename sig_traits<funct>::arg12_type arg12_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
typename basic_type<arg8_type>::type A8;
|
|
typename basic_type<arg9_type>::type A9;
|
|
typename basic_type<arg10_type>::type A10;
|
|
typename basic_type<arg11_type>::type A11;
|
|
typename basic_type<arg12_type>::type A12;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
mark_owned_by_matlab(A8);
|
|
mark_owned_by_matlab(A9);
|
|
mark_owned_by_matlab(A10);
|
|
mark_owned_by_matlab(A11);
|
|
mark_owned_by_matlab(A12);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
if (i < nrhs && is_input_type<arg8_type>::value) {validate_and_populate_arg(i,prhs[i],A8); ++i;} ELSE_ASSIGN_ARG_8;
|
|
if (i < nrhs && is_input_type<arg9_type>::value) {validate_and_populate_arg(i,prhs[i],A9); ++i;} ELSE_ASSIGN_ARG_9;
|
|
if (i < nrhs && is_input_type<arg10_type>::value) {validate_and_populate_arg(i,prhs[i],A10); ++i;} ELSE_ASSIGN_ARG_10;
|
|
if (i < nrhs && is_input_type<arg11_type>::value) {validate_and_populate_arg(i,prhs[i],A11); ++i;} ELSE_ASSIGN_ARG_11;
|
|
if (i < nrhs && is_input_type<arg12_type>::value) {validate_and_populate_arg(i,prhs[i],A12); ++i;} ELSE_ASSIGN_ARG_12;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
if (is_output_type<arg8_type>::value) {assign_to_matlab(plhs[i],A8); ++i;}
|
|
if (is_output_type<arg9_type>::value) {assign_to_matlab(plhs[i],A9); ++i;}
|
|
if (is_output_type<arg10_type>::value) {assign_to_matlab(plhs[i],A10); ++i;}
|
|
if (is_output_type<arg11_type>::value) {assign_to_matlab(plhs[i],A11); ++i;}
|
|
if (is_output_type<arg12_type>::value) {assign_to_matlab(plhs[i],A12); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<13>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
typedef typename sig_traits<funct>::arg8_type arg8_type;
|
|
typedef typename sig_traits<funct>::arg9_type arg9_type;
|
|
typedef typename sig_traits<funct>::arg10_type arg10_type;
|
|
typedef typename sig_traits<funct>::arg11_type arg11_type;
|
|
typedef typename sig_traits<funct>::arg12_type arg12_type;
|
|
typedef typename sig_traits<funct>::arg13_type arg13_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
typename basic_type<arg8_type>::type A8;
|
|
typename basic_type<arg9_type>::type A9;
|
|
typename basic_type<arg10_type>::type A10;
|
|
typename basic_type<arg11_type>::type A11;
|
|
typename basic_type<arg12_type>::type A12;
|
|
typename basic_type<arg13_type>::type A13;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
mark_owned_by_matlab(A8);
|
|
mark_owned_by_matlab(A9);
|
|
mark_owned_by_matlab(A10);
|
|
mark_owned_by_matlab(A11);
|
|
mark_owned_by_matlab(A12);
|
|
mark_owned_by_matlab(A13);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
if (i < nrhs && is_input_type<arg8_type>::value) {validate_and_populate_arg(i,prhs[i],A8); ++i;} ELSE_ASSIGN_ARG_8;
|
|
if (i < nrhs && is_input_type<arg9_type>::value) {validate_and_populate_arg(i,prhs[i],A9); ++i;} ELSE_ASSIGN_ARG_9;
|
|
if (i < nrhs && is_input_type<arg10_type>::value) {validate_and_populate_arg(i,prhs[i],A10); ++i;} ELSE_ASSIGN_ARG_10;
|
|
if (i < nrhs && is_input_type<arg11_type>::value) {validate_and_populate_arg(i,prhs[i],A11); ++i;} ELSE_ASSIGN_ARG_11;
|
|
if (i < nrhs && is_input_type<arg12_type>::value) {validate_and_populate_arg(i,prhs[i],A12); ++i;} ELSE_ASSIGN_ARG_12;
|
|
if (i < nrhs && is_input_type<arg13_type>::value) {validate_and_populate_arg(i,prhs[i],A13); ++i;} ELSE_ASSIGN_ARG_13;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
if (is_output_type<arg8_type>::value) {assign_to_matlab(plhs[i],A8); ++i;}
|
|
if (is_output_type<arg9_type>::value) {assign_to_matlab(plhs[i],A9); ++i;}
|
|
if (is_output_type<arg10_type>::value) {assign_to_matlab(plhs[i],A10); ++i;}
|
|
if (is_output_type<arg11_type>::value) {assign_to_matlab(plhs[i],A11); ++i;}
|
|
if (is_output_type<arg12_type>::value) {assign_to_matlab(plhs[i],A12); ++i;}
|
|
if (is_output_type<arg13_type>::value) {assign_to_matlab(plhs[i],A13); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<14>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
typedef typename sig_traits<funct>::arg8_type arg8_type;
|
|
typedef typename sig_traits<funct>::arg9_type arg9_type;
|
|
typedef typename sig_traits<funct>::arg10_type arg10_type;
|
|
typedef typename sig_traits<funct>::arg11_type arg11_type;
|
|
typedef typename sig_traits<funct>::arg12_type arg12_type;
|
|
typedef typename sig_traits<funct>::arg13_type arg13_type;
|
|
typedef typename sig_traits<funct>::arg14_type arg14_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
typename basic_type<arg8_type>::type A8;
|
|
typename basic_type<arg9_type>::type A9;
|
|
typename basic_type<arg10_type>::type A10;
|
|
typename basic_type<arg11_type>::type A11;
|
|
typename basic_type<arg12_type>::type A12;
|
|
typename basic_type<arg13_type>::type A13;
|
|
typename basic_type<arg14_type>::type A14;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
mark_owned_by_matlab(A8);
|
|
mark_owned_by_matlab(A9);
|
|
mark_owned_by_matlab(A10);
|
|
mark_owned_by_matlab(A11);
|
|
mark_owned_by_matlab(A12);
|
|
mark_owned_by_matlab(A13);
|
|
mark_owned_by_matlab(A14);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
if (i < nrhs && is_input_type<arg8_type>::value) {validate_and_populate_arg(i,prhs[i],A8); ++i;} ELSE_ASSIGN_ARG_8;
|
|
if (i < nrhs && is_input_type<arg9_type>::value) {validate_and_populate_arg(i,prhs[i],A9); ++i;} ELSE_ASSIGN_ARG_9;
|
|
if (i < nrhs && is_input_type<arg10_type>::value) {validate_and_populate_arg(i,prhs[i],A10); ++i;} ELSE_ASSIGN_ARG_10;
|
|
if (i < nrhs && is_input_type<arg11_type>::value) {validate_and_populate_arg(i,prhs[i],A11); ++i;} ELSE_ASSIGN_ARG_11;
|
|
if (i < nrhs && is_input_type<arg12_type>::value) {validate_and_populate_arg(i,prhs[i],A12); ++i;} ELSE_ASSIGN_ARG_12;
|
|
if (i < nrhs && is_input_type<arg13_type>::value) {validate_and_populate_arg(i,prhs[i],A13); ++i;} ELSE_ASSIGN_ARG_13;
|
|
if (i < nrhs && is_input_type<arg14_type>::value) {validate_and_populate_arg(i,prhs[i],A14); ++i;} ELSE_ASSIGN_ARG_14;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
if (is_output_type<arg8_type>::value) {assign_to_matlab(plhs[i],A8); ++i;}
|
|
if (is_output_type<arg9_type>::value) {assign_to_matlab(plhs[i],A9); ++i;}
|
|
if (is_output_type<arg10_type>::value) {assign_to_matlab(plhs[i],A10); ++i;}
|
|
if (is_output_type<arg11_type>::value) {assign_to_matlab(plhs[i],A11); ++i;}
|
|
if (is_output_type<arg12_type>::value) {assign_to_matlab(plhs[i],A12); ++i;}
|
|
if (is_output_type<arg13_type>::value) {assign_to_matlab(plhs[i],A13); ++i;}
|
|
if (is_output_type<arg14_type>::value) {assign_to_matlab(plhs[i],A14); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<15>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
typedef typename sig_traits<funct>::arg8_type arg8_type;
|
|
typedef typename sig_traits<funct>::arg9_type arg9_type;
|
|
typedef typename sig_traits<funct>::arg10_type arg10_type;
|
|
typedef typename sig_traits<funct>::arg11_type arg11_type;
|
|
typedef typename sig_traits<funct>::arg12_type arg12_type;
|
|
typedef typename sig_traits<funct>::arg13_type arg13_type;
|
|
typedef typename sig_traits<funct>::arg14_type arg14_type;
|
|
typedef typename sig_traits<funct>::arg15_type arg15_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
typename basic_type<arg8_type>::type A8;
|
|
typename basic_type<arg9_type>::type A9;
|
|
typename basic_type<arg10_type>::type A10;
|
|
typename basic_type<arg11_type>::type A11;
|
|
typename basic_type<arg12_type>::type A12;
|
|
typename basic_type<arg13_type>::type A13;
|
|
typename basic_type<arg14_type>::type A14;
|
|
typename basic_type<arg15_type>::type A15;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
mark_owned_by_matlab(A8);
|
|
mark_owned_by_matlab(A9);
|
|
mark_owned_by_matlab(A10);
|
|
mark_owned_by_matlab(A11);
|
|
mark_owned_by_matlab(A12);
|
|
mark_owned_by_matlab(A13);
|
|
mark_owned_by_matlab(A14);
|
|
mark_owned_by_matlab(A15);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
if (i < nrhs && is_input_type<arg8_type>::value) {validate_and_populate_arg(i,prhs[i],A8); ++i;} ELSE_ASSIGN_ARG_8;
|
|
if (i < nrhs && is_input_type<arg9_type>::value) {validate_and_populate_arg(i,prhs[i],A9); ++i;} ELSE_ASSIGN_ARG_9;
|
|
if (i < nrhs && is_input_type<arg10_type>::value) {validate_and_populate_arg(i,prhs[i],A10); ++i;} ELSE_ASSIGN_ARG_10;
|
|
if (i < nrhs && is_input_type<arg11_type>::value) {validate_and_populate_arg(i,prhs[i],A11); ++i;} ELSE_ASSIGN_ARG_11;
|
|
if (i < nrhs && is_input_type<arg12_type>::value) {validate_and_populate_arg(i,prhs[i],A12); ++i;} ELSE_ASSIGN_ARG_12;
|
|
if (i < nrhs && is_input_type<arg13_type>::value) {validate_and_populate_arg(i,prhs[i],A13); ++i;} ELSE_ASSIGN_ARG_13;
|
|
if (i < nrhs && is_input_type<arg14_type>::value) {validate_and_populate_arg(i,prhs[i],A14); ++i;} ELSE_ASSIGN_ARG_14;
|
|
if (i < nrhs && is_input_type<arg15_type>::value) {validate_and_populate_arg(i,prhs[i],A15); ++i;} ELSE_ASSIGN_ARG_15;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
if (is_output_type<arg8_type>::value) {assign_to_matlab(plhs[i],A8); ++i;}
|
|
if (is_output_type<arg9_type>::value) {assign_to_matlab(plhs[i],A9); ++i;}
|
|
if (is_output_type<arg10_type>::value) {assign_to_matlab(plhs[i],A10); ++i;}
|
|
if (is_output_type<arg11_type>::value) {assign_to_matlab(plhs[i],A11); ++i;}
|
|
if (is_output_type<arg12_type>::value) {assign_to_matlab(plhs[i],A12); ++i;}
|
|
if (is_output_type<arg13_type>::value) {assign_to_matlab(plhs[i],A13); ++i;}
|
|
if (is_output_type<arg14_type>::value) {assign_to_matlab(plhs[i],A14); ++i;}
|
|
if (is_output_type<arg15_type>::value) {assign_to_matlab(plhs[i],A15); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<16>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
typedef typename sig_traits<funct>::arg8_type arg8_type;
|
|
typedef typename sig_traits<funct>::arg9_type arg9_type;
|
|
typedef typename sig_traits<funct>::arg10_type arg10_type;
|
|
typedef typename sig_traits<funct>::arg11_type arg11_type;
|
|
typedef typename sig_traits<funct>::arg12_type arg12_type;
|
|
typedef typename sig_traits<funct>::arg13_type arg13_type;
|
|
typedef typename sig_traits<funct>::arg14_type arg14_type;
|
|
typedef typename sig_traits<funct>::arg15_type arg15_type;
|
|
typedef typename sig_traits<funct>::arg16_type arg16_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
typename basic_type<arg8_type>::type A8;
|
|
typename basic_type<arg9_type>::type A9;
|
|
typename basic_type<arg10_type>::type A10;
|
|
typename basic_type<arg11_type>::type A11;
|
|
typename basic_type<arg12_type>::type A12;
|
|
typename basic_type<arg13_type>::type A13;
|
|
typename basic_type<arg14_type>::type A14;
|
|
typename basic_type<arg15_type>::type A15;
|
|
typename basic_type<arg16_type>::type A16;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
mark_owned_by_matlab(A8);
|
|
mark_owned_by_matlab(A9);
|
|
mark_owned_by_matlab(A10);
|
|
mark_owned_by_matlab(A11);
|
|
mark_owned_by_matlab(A12);
|
|
mark_owned_by_matlab(A13);
|
|
mark_owned_by_matlab(A14);
|
|
mark_owned_by_matlab(A15);
|
|
mark_owned_by_matlab(A16);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
if (i < nrhs && is_input_type<arg8_type>::value) {validate_and_populate_arg(i,prhs[i],A8); ++i;} ELSE_ASSIGN_ARG_8;
|
|
if (i < nrhs && is_input_type<arg9_type>::value) {validate_and_populate_arg(i,prhs[i],A9); ++i;} ELSE_ASSIGN_ARG_9;
|
|
if (i < nrhs && is_input_type<arg10_type>::value) {validate_and_populate_arg(i,prhs[i],A10); ++i;} ELSE_ASSIGN_ARG_10;
|
|
if (i < nrhs && is_input_type<arg11_type>::value) {validate_and_populate_arg(i,prhs[i],A11); ++i;} ELSE_ASSIGN_ARG_11;
|
|
if (i < nrhs && is_input_type<arg12_type>::value) {validate_and_populate_arg(i,prhs[i],A12); ++i;} ELSE_ASSIGN_ARG_12;
|
|
if (i < nrhs && is_input_type<arg13_type>::value) {validate_and_populate_arg(i,prhs[i],A13); ++i;} ELSE_ASSIGN_ARG_13;
|
|
if (i < nrhs && is_input_type<arg14_type>::value) {validate_and_populate_arg(i,prhs[i],A14); ++i;} ELSE_ASSIGN_ARG_14;
|
|
if (i < nrhs && is_input_type<arg15_type>::value) {validate_and_populate_arg(i,prhs[i],A15); ++i;} ELSE_ASSIGN_ARG_15;
|
|
if (i < nrhs && is_input_type<arg16_type>::value) {validate_and_populate_arg(i,prhs[i],A16); ++i;} ELSE_ASSIGN_ARG_16;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
if (is_output_type<arg8_type>::value) {assign_to_matlab(plhs[i],A8); ++i;}
|
|
if (is_output_type<arg9_type>::value) {assign_to_matlab(plhs[i],A9); ++i;}
|
|
if (is_output_type<arg10_type>::value) {assign_to_matlab(plhs[i],A10); ++i;}
|
|
if (is_output_type<arg11_type>::value) {assign_to_matlab(plhs[i],A11); ++i;}
|
|
if (is_output_type<arg12_type>::value) {assign_to_matlab(plhs[i],A12); ++i;}
|
|
if (is_output_type<arg13_type>::value) {assign_to_matlab(plhs[i],A13); ++i;}
|
|
if (is_output_type<arg14_type>::value) {assign_to_matlab(plhs[i],A14); ++i;}
|
|
if (is_output_type<arg15_type>::value) {assign_to_matlab(plhs[i],A15); ++i;}
|
|
if (is_output_type<arg16_type>::value) {assign_to_matlab(plhs[i],A16); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<17>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
typedef typename sig_traits<funct>::arg8_type arg8_type;
|
|
typedef typename sig_traits<funct>::arg9_type arg9_type;
|
|
typedef typename sig_traits<funct>::arg10_type arg10_type;
|
|
typedef typename sig_traits<funct>::arg11_type arg11_type;
|
|
typedef typename sig_traits<funct>::arg12_type arg12_type;
|
|
typedef typename sig_traits<funct>::arg13_type arg13_type;
|
|
typedef typename sig_traits<funct>::arg14_type arg14_type;
|
|
typedef typename sig_traits<funct>::arg15_type arg15_type;
|
|
typedef typename sig_traits<funct>::arg16_type arg16_type;
|
|
typedef typename sig_traits<funct>::arg17_type arg17_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
typename basic_type<arg8_type>::type A8;
|
|
typename basic_type<arg9_type>::type A9;
|
|
typename basic_type<arg10_type>::type A10;
|
|
typename basic_type<arg11_type>::type A11;
|
|
typename basic_type<arg12_type>::type A12;
|
|
typename basic_type<arg13_type>::type A13;
|
|
typename basic_type<arg14_type>::type A14;
|
|
typename basic_type<arg15_type>::type A15;
|
|
typename basic_type<arg16_type>::type A16;
|
|
typename basic_type<arg17_type>::type A17;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
mark_owned_by_matlab(A8);
|
|
mark_owned_by_matlab(A9);
|
|
mark_owned_by_matlab(A10);
|
|
mark_owned_by_matlab(A11);
|
|
mark_owned_by_matlab(A12);
|
|
mark_owned_by_matlab(A13);
|
|
mark_owned_by_matlab(A14);
|
|
mark_owned_by_matlab(A15);
|
|
mark_owned_by_matlab(A16);
|
|
mark_owned_by_matlab(A17);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
if (i < nrhs && is_input_type<arg8_type>::value) {validate_and_populate_arg(i,prhs[i],A8); ++i;} ELSE_ASSIGN_ARG_8;
|
|
if (i < nrhs && is_input_type<arg9_type>::value) {validate_and_populate_arg(i,prhs[i],A9); ++i;} ELSE_ASSIGN_ARG_9;
|
|
if (i < nrhs && is_input_type<arg10_type>::value) {validate_and_populate_arg(i,prhs[i],A10); ++i;} ELSE_ASSIGN_ARG_10;
|
|
if (i < nrhs && is_input_type<arg11_type>::value) {validate_and_populate_arg(i,prhs[i],A11); ++i;} ELSE_ASSIGN_ARG_11;
|
|
if (i < nrhs && is_input_type<arg12_type>::value) {validate_and_populate_arg(i,prhs[i],A12); ++i;} ELSE_ASSIGN_ARG_12;
|
|
if (i < nrhs && is_input_type<arg13_type>::value) {validate_and_populate_arg(i,prhs[i],A13); ++i;} ELSE_ASSIGN_ARG_13;
|
|
if (i < nrhs && is_input_type<arg14_type>::value) {validate_and_populate_arg(i,prhs[i],A14); ++i;} ELSE_ASSIGN_ARG_14;
|
|
if (i < nrhs && is_input_type<arg15_type>::value) {validate_and_populate_arg(i,prhs[i],A15); ++i;} ELSE_ASSIGN_ARG_15;
|
|
if (i < nrhs && is_input_type<arg16_type>::value) {validate_and_populate_arg(i,prhs[i],A16); ++i;} ELSE_ASSIGN_ARG_16;
|
|
if (i < nrhs && is_input_type<arg17_type>::value) {validate_and_populate_arg(i,prhs[i],A17); ++i;} ELSE_ASSIGN_ARG_17;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
if (is_output_type<arg8_type>::value) {assign_to_matlab(plhs[i],A8); ++i;}
|
|
if (is_output_type<arg9_type>::value) {assign_to_matlab(plhs[i],A9); ++i;}
|
|
if (is_output_type<arg10_type>::value) {assign_to_matlab(plhs[i],A10); ++i;}
|
|
if (is_output_type<arg11_type>::value) {assign_to_matlab(plhs[i],A11); ++i;}
|
|
if (is_output_type<arg12_type>::value) {assign_to_matlab(plhs[i],A12); ++i;}
|
|
if (is_output_type<arg13_type>::value) {assign_to_matlab(plhs[i],A13); ++i;}
|
|
if (is_output_type<arg14_type>::value) {assign_to_matlab(plhs[i],A14); ++i;}
|
|
if (is_output_type<arg15_type>::value) {assign_to_matlab(plhs[i],A15); ++i;}
|
|
if (is_output_type<arg16_type>::value) {assign_to_matlab(plhs[i],A16); ++i;}
|
|
if (is_output_type<arg17_type>::value) {assign_to_matlab(plhs[i],A17); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<18>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
typedef typename sig_traits<funct>::arg8_type arg8_type;
|
|
typedef typename sig_traits<funct>::arg9_type arg9_type;
|
|
typedef typename sig_traits<funct>::arg10_type arg10_type;
|
|
typedef typename sig_traits<funct>::arg11_type arg11_type;
|
|
typedef typename sig_traits<funct>::arg12_type arg12_type;
|
|
typedef typename sig_traits<funct>::arg13_type arg13_type;
|
|
typedef typename sig_traits<funct>::arg14_type arg14_type;
|
|
typedef typename sig_traits<funct>::arg15_type arg15_type;
|
|
typedef typename sig_traits<funct>::arg16_type arg16_type;
|
|
typedef typename sig_traits<funct>::arg17_type arg17_type;
|
|
typedef typename sig_traits<funct>::arg18_type arg18_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
typename basic_type<arg8_type>::type A8;
|
|
typename basic_type<arg9_type>::type A9;
|
|
typename basic_type<arg10_type>::type A10;
|
|
typename basic_type<arg11_type>::type A11;
|
|
typename basic_type<arg12_type>::type A12;
|
|
typename basic_type<arg13_type>::type A13;
|
|
typename basic_type<arg14_type>::type A14;
|
|
typename basic_type<arg15_type>::type A15;
|
|
typename basic_type<arg16_type>::type A16;
|
|
typename basic_type<arg17_type>::type A17;
|
|
typename basic_type<arg18_type>::type A18;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
mark_owned_by_matlab(A8);
|
|
mark_owned_by_matlab(A9);
|
|
mark_owned_by_matlab(A10);
|
|
mark_owned_by_matlab(A11);
|
|
mark_owned_by_matlab(A12);
|
|
mark_owned_by_matlab(A13);
|
|
mark_owned_by_matlab(A14);
|
|
mark_owned_by_matlab(A15);
|
|
mark_owned_by_matlab(A16);
|
|
mark_owned_by_matlab(A17);
|
|
mark_owned_by_matlab(A18);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
if (i < nrhs && is_input_type<arg8_type>::value) {validate_and_populate_arg(i,prhs[i],A8); ++i;} ELSE_ASSIGN_ARG_8;
|
|
if (i < nrhs && is_input_type<arg9_type>::value) {validate_and_populate_arg(i,prhs[i],A9); ++i;} ELSE_ASSIGN_ARG_9;
|
|
if (i < nrhs && is_input_type<arg10_type>::value) {validate_and_populate_arg(i,prhs[i],A10); ++i;} ELSE_ASSIGN_ARG_10;
|
|
if (i < nrhs && is_input_type<arg11_type>::value) {validate_and_populate_arg(i,prhs[i],A11); ++i;} ELSE_ASSIGN_ARG_11;
|
|
if (i < nrhs && is_input_type<arg12_type>::value) {validate_and_populate_arg(i,prhs[i],A12); ++i;} ELSE_ASSIGN_ARG_12;
|
|
if (i < nrhs && is_input_type<arg13_type>::value) {validate_and_populate_arg(i,prhs[i],A13); ++i;} ELSE_ASSIGN_ARG_13;
|
|
if (i < nrhs && is_input_type<arg14_type>::value) {validate_and_populate_arg(i,prhs[i],A14); ++i;} ELSE_ASSIGN_ARG_14;
|
|
if (i < nrhs && is_input_type<arg15_type>::value) {validate_and_populate_arg(i,prhs[i],A15); ++i;} ELSE_ASSIGN_ARG_15;
|
|
if (i < nrhs && is_input_type<arg16_type>::value) {validate_and_populate_arg(i,prhs[i],A16); ++i;} ELSE_ASSIGN_ARG_16;
|
|
if (i < nrhs && is_input_type<arg17_type>::value) {validate_and_populate_arg(i,prhs[i],A17); ++i;} ELSE_ASSIGN_ARG_17;
|
|
if (i < nrhs && is_input_type<arg18_type>::value) {validate_and_populate_arg(i,prhs[i],A18); ++i;} ELSE_ASSIGN_ARG_18;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
if (is_output_type<arg8_type>::value) {assign_to_matlab(plhs[i],A8); ++i;}
|
|
if (is_output_type<arg9_type>::value) {assign_to_matlab(plhs[i],A9); ++i;}
|
|
if (is_output_type<arg10_type>::value) {assign_to_matlab(plhs[i],A10); ++i;}
|
|
if (is_output_type<arg11_type>::value) {assign_to_matlab(plhs[i],A11); ++i;}
|
|
if (is_output_type<arg12_type>::value) {assign_to_matlab(plhs[i],A12); ++i;}
|
|
if (is_output_type<arg13_type>::value) {assign_to_matlab(plhs[i],A13); ++i;}
|
|
if (is_output_type<arg14_type>::value) {assign_to_matlab(plhs[i],A14); ++i;}
|
|
if (is_output_type<arg15_type>::value) {assign_to_matlab(plhs[i],A15); ++i;}
|
|
if (is_output_type<arg16_type>::value) {assign_to_matlab(plhs[i],A16); ++i;}
|
|
if (is_output_type<arg17_type>::value) {assign_to_matlab(plhs[i],A17); ++i;}
|
|
if (is_output_type<arg18_type>::value) {assign_to_matlab(plhs[i],A18); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<19>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
typedef typename sig_traits<funct>::arg8_type arg8_type;
|
|
typedef typename sig_traits<funct>::arg9_type arg9_type;
|
|
typedef typename sig_traits<funct>::arg10_type arg10_type;
|
|
typedef typename sig_traits<funct>::arg11_type arg11_type;
|
|
typedef typename sig_traits<funct>::arg12_type arg12_type;
|
|
typedef typename sig_traits<funct>::arg13_type arg13_type;
|
|
typedef typename sig_traits<funct>::arg14_type arg14_type;
|
|
typedef typename sig_traits<funct>::arg15_type arg15_type;
|
|
typedef typename sig_traits<funct>::arg16_type arg16_type;
|
|
typedef typename sig_traits<funct>::arg17_type arg17_type;
|
|
typedef typename sig_traits<funct>::arg18_type arg18_type;
|
|
typedef typename sig_traits<funct>::arg19_type arg19_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
typename basic_type<arg8_type>::type A8;
|
|
typename basic_type<arg9_type>::type A9;
|
|
typename basic_type<arg10_type>::type A10;
|
|
typename basic_type<arg11_type>::type A11;
|
|
typename basic_type<arg12_type>::type A12;
|
|
typename basic_type<arg13_type>::type A13;
|
|
typename basic_type<arg14_type>::type A14;
|
|
typename basic_type<arg15_type>::type A15;
|
|
typename basic_type<arg16_type>::type A16;
|
|
typename basic_type<arg17_type>::type A17;
|
|
typename basic_type<arg18_type>::type A18;
|
|
typename basic_type<arg19_type>::type A19;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
mark_owned_by_matlab(A8);
|
|
mark_owned_by_matlab(A9);
|
|
mark_owned_by_matlab(A10);
|
|
mark_owned_by_matlab(A11);
|
|
mark_owned_by_matlab(A12);
|
|
mark_owned_by_matlab(A13);
|
|
mark_owned_by_matlab(A14);
|
|
mark_owned_by_matlab(A15);
|
|
mark_owned_by_matlab(A16);
|
|
mark_owned_by_matlab(A17);
|
|
mark_owned_by_matlab(A18);
|
|
mark_owned_by_matlab(A19);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
if (i < nrhs && is_input_type<arg8_type>::value) {validate_and_populate_arg(i,prhs[i],A8); ++i;} ELSE_ASSIGN_ARG_8;
|
|
if (i < nrhs && is_input_type<arg9_type>::value) {validate_and_populate_arg(i,prhs[i],A9); ++i;} ELSE_ASSIGN_ARG_9;
|
|
if (i < nrhs && is_input_type<arg10_type>::value) {validate_and_populate_arg(i,prhs[i],A10); ++i;} ELSE_ASSIGN_ARG_10;
|
|
if (i < nrhs && is_input_type<arg11_type>::value) {validate_and_populate_arg(i,prhs[i],A11); ++i;} ELSE_ASSIGN_ARG_11;
|
|
if (i < nrhs && is_input_type<arg12_type>::value) {validate_and_populate_arg(i,prhs[i],A12); ++i;} ELSE_ASSIGN_ARG_12;
|
|
if (i < nrhs && is_input_type<arg13_type>::value) {validate_and_populate_arg(i,prhs[i],A13); ++i;} ELSE_ASSIGN_ARG_13;
|
|
if (i < nrhs && is_input_type<arg14_type>::value) {validate_and_populate_arg(i,prhs[i],A14); ++i;} ELSE_ASSIGN_ARG_14;
|
|
if (i < nrhs && is_input_type<arg15_type>::value) {validate_and_populate_arg(i,prhs[i],A15); ++i;} ELSE_ASSIGN_ARG_15;
|
|
if (i < nrhs && is_input_type<arg16_type>::value) {validate_and_populate_arg(i,prhs[i],A16); ++i;} ELSE_ASSIGN_ARG_16;
|
|
if (i < nrhs && is_input_type<arg17_type>::value) {validate_and_populate_arg(i,prhs[i],A17); ++i;} ELSE_ASSIGN_ARG_17;
|
|
if (i < nrhs && is_input_type<arg18_type>::value) {validate_and_populate_arg(i,prhs[i],A18); ++i;} ELSE_ASSIGN_ARG_18;
|
|
if (i < nrhs && is_input_type<arg19_type>::value) {validate_and_populate_arg(i,prhs[i],A19); ++i;} ELSE_ASSIGN_ARG_19;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
if (is_output_type<arg8_type>::value) {assign_to_matlab(plhs[i],A8); ++i;}
|
|
if (is_output_type<arg9_type>::value) {assign_to_matlab(plhs[i],A9); ++i;}
|
|
if (is_output_type<arg10_type>::value) {assign_to_matlab(plhs[i],A10); ++i;}
|
|
if (is_output_type<arg11_type>::value) {assign_to_matlab(plhs[i],A11); ++i;}
|
|
if (is_output_type<arg12_type>::value) {assign_to_matlab(plhs[i],A12); ++i;}
|
|
if (is_output_type<arg13_type>::value) {assign_to_matlab(plhs[i],A13); ++i;}
|
|
if (is_output_type<arg14_type>::value) {assign_to_matlab(plhs[i],A14); ++i;}
|
|
if (is_output_type<arg15_type>::value) {assign_to_matlab(plhs[i],A15); ++i;}
|
|
if (is_output_type<arg16_type>::value) {assign_to_matlab(plhs[i],A16); ++i;}
|
|
if (is_output_type<arg17_type>::value) {assign_to_matlab(plhs[i],A17); ++i;}
|
|
if (is_output_type<arg18_type>::value) {assign_to_matlab(plhs[i],A18); ++i;}
|
|
if (is_output_type<arg19_type>::value) {assign_to_matlab(plhs[i],A19); ++i;}
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct call_mex_function_helper<20>
|
|
{
|
|
template <typename funct>
|
|
void callit(
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
) const
|
|
{
|
|
typedef typename sig_traits<funct>::arg1_type arg1_type;
|
|
typedef typename sig_traits<funct>::arg2_type arg2_type;
|
|
typedef typename sig_traits<funct>::arg3_type arg3_type;
|
|
typedef typename sig_traits<funct>::arg4_type arg4_type;
|
|
typedef typename sig_traits<funct>::arg5_type arg5_type;
|
|
typedef typename sig_traits<funct>::arg6_type arg6_type;
|
|
typedef typename sig_traits<funct>::arg7_type arg7_type;
|
|
typedef typename sig_traits<funct>::arg8_type arg8_type;
|
|
typedef typename sig_traits<funct>::arg9_type arg9_type;
|
|
typedef typename sig_traits<funct>::arg10_type arg10_type;
|
|
typedef typename sig_traits<funct>::arg11_type arg11_type;
|
|
typedef typename sig_traits<funct>::arg12_type arg12_type;
|
|
typedef typename sig_traits<funct>::arg13_type arg13_type;
|
|
typedef typename sig_traits<funct>::arg14_type arg14_type;
|
|
typedef typename sig_traits<funct>::arg15_type arg15_type;
|
|
typedef typename sig_traits<funct>::arg16_type arg16_type;
|
|
typedef typename sig_traits<funct>::arg17_type arg17_type;
|
|
typedef typename sig_traits<funct>::arg18_type arg18_type;
|
|
typedef typename sig_traits<funct>::arg19_type arg19_type;
|
|
typedef typename sig_traits<funct>::arg20_type arg20_type;
|
|
|
|
typename basic_type<arg1_type>::type A1;
|
|
typename basic_type<arg2_type>::type A2;
|
|
typename basic_type<arg3_type>::type A3;
|
|
typename basic_type<arg4_type>::type A4;
|
|
typename basic_type<arg5_type>::type A5;
|
|
typename basic_type<arg6_type>::type A6;
|
|
typename basic_type<arg7_type>::type A7;
|
|
typename basic_type<arg8_type>::type A8;
|
|
typename basic_type<arg9_type>::type A9;
|
|
typename basic_type<arg10_type>::type A10;
|
|
typename basic_type<arg11_type>::type A11;
|
|
typename basic_type<arg12_type>::type A12;
|
|
typename basic_type<arg13_type>::type A13;
|
|
typename basic_type<arg14_type>::type A14;
|
|
typename basic_type<arg15_type>::type A15;
|
|
typename basic_type<arg16_type>::type A16;
|
|
typename basic_type<arg17_type>::type A17;
|
|
typename basic_type<arg18_type>::type A18;
|
|
typename basic_type<arg19_type>::type A19;
|
|
typename basic_type<arg20_type>::type A20;
|
|
|
|
mark_owned_by_matlab(A1);
|
|
mark_owned_by_matlab(A2);
|
|
mark_owned_by_matlab(A3);
|
|
mark_owned_by_matlab(A4);
|
|
mark_owned_by_matlab(A5);
|
|
mark_owned_by_matlab(A6);
|
|
mark_owned_by_matlab(A7);
|
|
mark_owned_by_matlab(A8);
|
|
mark_owned_by_matlab(A9);
|
|
mark_owned_by_matlab(A10);
|
|
mark_owned_by_matlab(A11);
|
|
mark_owned_by_matlab(A12);
|
|
mark_owned_by_matlab(A13);
|
|
mark_owned_by_matlab(A14);
|
|
mark_owned_by_matlab(A15);
|
|
mark_owned_by_matlab(A16);
|
|
mark_owned_by_matlab(A17);
|
|
mark_owned_by_matlab(A18);
|
|
mark_owned_by_matlab(A19);
|
|
mark_owned_by_matlab(A20);
|
|
|
|
int i = 0;
|
|
if (i < nrhs && is_input_type<arg1_type>::value) {validate_and_populate_arg(i,prhs[i],A1); ++i;} ELSE_ASSIGN_ARG_1;
|
|
if (i < nrhs && is_input_type<arg2_type>::value) {validate_and_populate_arg(i,prhs[i],A2); ++i;} ELSE_ASSIGN_ARG_2;
|
|
if (i < nrhs && is_input_type<arg3_type>::value) {validate_and_populate_arg(i,prhs[i],A3); ++i;} ELSE_ASSIGN_ARG_3;
|
|
if (i < nrhs && is_input_type<arg4_type>::value) {validate_and_populate_arg(i,prhs[i],A4); ++i;} ELSE_ASSIGN_ARG_4;
|
|
if (i < nrhs && is_input_type<arg5_type>::value) {validate_and_populate_arg(i,prhs[i],A5); ++i;} ELSE_ASSIGN_ARG_5;
|
|
if (i < nrhs && is_input_type<arg6_type>::value) {validate_and_populate_arg(i,prhs[i],A6); ++i;} ELSE_ASSIGN_ARG_6;
|
|
if (i < nrhs && is_input_type<arg7_type>::value) {validate_and_populate_arg(i,prhs[i],A7); ++i;} ELSE_ASSIGN_ARG_7;
|
|
if (i < nrhs && is_input_type<arg8_type>::value) {validate_and_populate_arg(i,prhs[i],A8); ++i;} ELSE_ASSIGN_ARG_8;
|
|
if (i < nrhs && is_input_type<arg9_type>::value) {validate_and_populate_arg(i,prhs[i],A9); ++i;} ELSE_ASSIGN_ARG_9;
|
|
if (i < nrhs && is_input_type<arg10_type>::value) {validate_and_populate_arg(i,prhs[i],A10); ++i;} ELSE_ASSIGN_ARG_10;
|
|
if (i < nrhs && is_input_type<arg11_type>::value) {validate_and_populate_arg(i,prhs[i],A11); ++i;} ELSE_ASSIGN_ARG_11;
|
|
if (i < nrhs && is_input_type<arg12_type>::value) {validate_and_populate_arg(i,prhs[i],A12); ++i;} ELSE_ASSIGN_ARG_12;
|
|
if (i < nrhs && is_input_type<arg13_type>::value) {validate_and_populate_arg(i,prhs[i],A13); ++i;} ELSE_ASSIGN_ARG_13;
|
|
if (i < nrhs && is_input_type<arg14_type>::value) {validate_and_populate_arg(i,prhs[i],A14); ++i;} ELSE_ASSIGN_ARG_14;
|
|
if (i < nrhs && is_input_type<arg15_type>::value) {validate_and_populate_arg(i,prhs[i],A15); ++i;} ELSE_ASSIGN_ARG_15;
|
|
if (i < nrhs && is_input_type<arg16_type>::value) {validate_and_populate_arg(i,prhs[i],A16); ++i;} ELSE_ASSIGN_ARG_16;
|
|
if (i < nrhs && is_input_type<arg17_type>::value) {validate_and_populate_arg(i,prhs[i],A17); ++i;} ELSE_ASSIGN_ARG_17;
|
|
if (i < nrhs && is_input_type<arg18_type>::value) {validate_and_populate_arg(i,prhs[i],A18); ++i;} ELSE_ASSIGN_ARG_18;
|
|
if (i < nrhs && is_input_type<arg19_type>::value) {validate_and_populate_arg(i,prhs[i],A19); ++i;} ELSE_ASSIGN_ARG_19;
|
|
if (i < nrhs && is_input_type<arg20_type>::value) {validate_and_populate_arg(i,prhs[i],A20); ++i;} ELSE_ASSIGN_ARG_20;
|
|
|
|
f(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20);
|
|
|
|
|
|
i = 0;
|
|
if (is_output_type<arg1_type>::value) {assign_to_matlab(plhs[i],A1); ++i;}
|
|
if (is_output_type<arg2_type>::value) {assign_to_matlab(plhs[i],A2); ++i;}
|
|
if (is_output_type<arg3_type>::value) {assign_to_matlab(plhs[i],A3); ++i;}
|
|
if (is_output_type<arg4_type>::value) {assign_to_matlab(plhs[i],A4); ++i;}
|
|
if (is_output_type<arg5_type>::value) {assign_to_matlab(plhs[i],A5); ++i;}
|
|
if (is_output_type<arg6_type>::value) {assign_to_matlab(plhs[i],A6); ++i;}
|
|
if (is_output_type<arg7_type>::value) {assign_to_matlab(plhs[i],A7); ++i;}
|
|
if (is_output_type<arg8_type>::value) {assign_to_matlab(plhs[i],A8); ++i;}
|
|
if (is_output_type<arg9_type>::value) {assign_to_matlab(plhs[i],A9); ++i;}
|
|
if (is_output_type<arg10_type>::value) {assign_to_matlab(plhs[i],A10); ++i;}
|
|
if (is_output_type<arg11_type>::value) {assign_to_matlab(plhs[i],A11); ++i;}
|
|
if (is_output_type<arg12_type>::value) {assign_to_matlab(plhs[i],A12); ++i;}
|
|
if (is_output_type<arg13_type>::value) {assign_to_matlab(plhs[i],A13); ++i;}
|
|
if (is_output_type<arg14_type>::value) {assign_to_matlab(plhs[i],A14); ++i;}
|
|
if (is_output_type<arg15_type>::value) {assign_to_matlab(plhs[i],A15); ++i;}
|
|
if (is_output_type<arg16_type>::value) {assign_to_matlab(plhs[i],A16); ++i;}
|
|
if (is_output_type<arg17_type>::value) {assign_to_matlab(plhs[i],A17); ++i;}
|
|
if (is_output_type<arg18_type>::value) {assign_to_matlab(plhs[i],A18); ++i;}
|
|
if (is_output_type<arg19_type>::value) {assign_to_matlab(plhs[i],A19); ++i;}
|
|
if (is_output_type<arg20_type>::value) {assign_to_matlab(plhs[i],A20); ++i;}
|
|
}
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <typename T> struct is_matlab_object { const static bool value = false; };
|
|
template <> struct is_matlab_object <matlab_object> { const static bool value = true; };
|
|
template <> struct is_matlab_object <const matlab_object> { const static bool value = true; };
|
|
template <> struct is_matlab_object <matlab_object&> { const static bool value = true; };
|
|
template <> struct is_matlab_object <const matlab_object&> { const static bool value = true; };
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename funct
|
|
>
|
|
void call_mex_function (
|
|
const funct& f,
|
|
int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[]
|
|
)
|
|
{
|
|
const long expected_nrhs = funct_traits<funct>::num_inputs;
|
|
const long expected_nlhs = funct_traits<funct>::num_outputs;
|
|
const long expected_args = expected_nrhs + expected_nlhs;
|
|
|
|
long defaulted_args = 0;
|
|
|
|
#ifdef ARG_1_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg1_type>::value);
|
|
#ifndef ARG_2_DEFAULT
|
|
// You can't define a default for argument 1 if you don't define one for argument 2 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 2);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(1 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_2_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg2_type>::value);
|
|
#ifndef ARG_3_DEFAULT
|
|
// You can't define a default for argument 2 if you don't define one for argument 3 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 3);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(2 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_3_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg3_type>::value);
|
|
#ifndef ARG_4_DEFAULT
|
|
// You can't define a default for argument 3 if you don't define one for argument 4 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 4);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(3 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_4_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg4_type>::value);
|
|
#ifndef ARG_5_DEFAULT
|
|
// You can't define a default for argument 4 if you don't define one for argument 5 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 5);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(4 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_5_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg5_type>::value);
|
|
#ifndef ARG_6_DEFAULT
|
|
// You can't define a default for argument 5 if you don't define one for argument 6 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 6);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(5 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_6_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg6_type>::value);
|
|
#ifndef ARG_7_DEFAULT
|
|
// You can't define a default for argument 6 if you don't define one for argument 7 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 7);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(6 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_7_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg7_type>::value);
|
|
#ifndef ARG_8_DEFAULT
|
|
// You can't define a default for argument 7 if you don't define one for argument 8 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 8);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(7 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_8_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg8_type>::value);
|
|
#ifndef ARG_9_DEFAULT
|
|
// You can't define a default for argument 8 if you don't define one for argument 9 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 9);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(8 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_9_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg9_type>::value);
|
|
#ifndef ARG_10_DEFAULT
|
|
// You can't define a default for argument 9 if you don't define one for argument 10 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 10);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(9 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_10_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg10_type>::value);
|
|
#ifndef ARG_11_DEFAULT
|
|
// You can't define a default for argument 10 if you don't define one for argument 11 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 11);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(10 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_11_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg11_type>::value);
|
|
#ifndef ARG_12_DEFAULT
|
|
// You can't define a default for argument 11 if you don't define one for argument 12 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 12);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(11 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_12_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg12_type>::value);
|
|
#ifndef ARG_13_DEFAULT
|
|
// You can't define a default for argument 12 if you don't define one for argument 13 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 13);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(12 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_13_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg13_type>::value);
|
|
#ifndef ARG_14_DEFAULT
|
|
// You can't define a default for argument 13 if you don't define one for argument 14 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 14);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(13 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_14_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg14_type>::value);
|
|
#ifndef ARG_15_DEFAULT
|
|
// You can't define a default for argument 14 if you don't define one for argument 15 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 15);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(14 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_15_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg15_type>::value);
|
|
#ifndef ARG_16_DEFAULT
|
|
// You can't define a default for argument 15 if you don't define one for argument 16 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 16);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(15 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_16_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg16_type>::value);
|
|
#ifndef ARG_17_DEFAULT
|
|
// You can't define a default for argument 16 if you don't define one for argument 17 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 17);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(16 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_17_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg17_type>::value);
|
|
#ifndef ARG_18_DEFAULT
|
|
// You can't define a default for argument 17 if you don't define one for argument 18 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 18);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(17 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_18_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg18_type>::value);
|
|
#ifndef ARG_19_DEFAULT
|
|
// You can't define a default for argument 18 if you don't define one for argument 19 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 19);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(18 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_19_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg19_type>::value);
|
|
#ifndef ARG_20_DEFAULT
|
|
// You can't define a default for argument 19 if you don't define one for argument 20 also.
|
|
COMPILE_TIME_ASSERT(expected_args < 20);
|
|
#endif
|
|
COMPILE_TIME_ASSERT(19 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
#ifdef ARG_20_DEFAULT
|
|
++defaulted_args;
|
|
// You can only set an argument's default value if it is an input argument.
|
|
COMPILE_TIME_ASSERT(is_input_type<typename sig_traits<funct>::arg20_type>::value);
|
|
COMPILE_TIME_ASSERT(20 <= expected_args); // You can't define a default for an argument that doesn't exist.
|
|
#endif
|
|
|
|
|
|
// Arguments with type matlab_object are optional in both input and output.
|
|
int num_optional_inputs = 0;
|
|
int num_optional_outputs = 0;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg20_type>::value) if (is_input_type<typename sig_traits<funct>::arg20_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg19_type>::value) if (is_input_type<typename sig_traits<funct>::arg19_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg18_type>::value) if (is_input_type<typename sig_traits<funct>::arg18_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg17_type>::value) if (is_input_type<typename sig_traits<funct>::arg17_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg16_type>::value) if (is_input_type<typename sig_traits<funct>::arg16_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg15_type>::value) if (is_input_type<typename sig_traits<funct>::arg15_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg14_type>::value) if (is_input_type<typename sig_traits<funct>::arg14_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg13_type>::value) if (is_input_type<typename sig_traits<funct>::arg13_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg12_type>::value) if (is_input_type<typename sig_traits<funct>::arg12_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg11_type>::value) if (is_input_type<typename sig_traits<funct>::arg11_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg10_type>::value) if (is_input_type<typename sig_traits<funct>::arg10_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg9_type>::value) if (is_input_type<typename sig_traits<funct>::arg9_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg8_type>::value) if (is_input_type<typename sig_traits<funct>::arg8_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg7_type>::value) if (is_input_type<typename sig_traits<funct>::arg7_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg6_type>::value) if (is_input_type<typename sig_traits<funct>::arg6_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg5_type>::value) if (is_input_type<typename sig_traits<funct>::arg5_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg4_type>::value) if (is_input_type<typename sig_traits<funct>::arg4_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg3_type>::value) if (is_input_type<typename sig_traits<funct>::arg3_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg2_type>::value) if (is_input_type<typename sig_traits<funct>::arg2_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
if (is_matlab_object<typename sig_traits<funct>::arg1_type>::value) if (is_input_type<typename sig_traits<funct>::arg1_type>::value) ++num_optional_inputs; else ++num_optional_outputs;
|
|
|
|
|
|
/* check for proper number of arguments */
|
|
if(nrhs > expected_nrhs || nrhs < expected_nrhs - defaulted_args - num_optional_inputs)
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Expected between " << expected_nrhs-defaulted_args - num_optional_inputs
|
|
<< " and " << expected_nrhs << " input arguments, got " << nrhs << ".";
|
|
|
|
mexErrMsgIdAndTxt("mex_function:nrhs",
|
|
escape_percent(sout).c_str());
|
|
}
|
|
|
|
if (nlhs > expected_nlhs)
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Expected at most " << expected_nlhs << " output arguments, got " << nlhs << ".";
|
|
|
|
mexErrMsgIdAndTxt("mex_function:nlhs",
|
|
escape_percent(sout).c_str());
|
|
}
|
|
|
|
call_mex_function_helper<sig_traits<funct>::num_args> helper;
|
|
helper.callit(f, nlhs, plhs, nrhs, prhs);
|
|
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
class mex_streambuf : public std::streambuf
|
|
{
|
|
|
|
public:
|
|
mex_streambuf (
|
|
)
|
|
{
|
|
buf.resize(1000);
|
|
setp(&buf[0], &buf[0] + buf.size()-2);
|
|
|
|
// make cout send data to mex_streambuf
|
|
oldbuf = std::cout.rdbuf(this);
|
|
}
|
|
|
|
~mex_streambuf()
|
|
{
|
|
// put cout back to the way we found it before running our mex function.
|
|
std::cout.rdbuf(oldbuf);
|
|
}
|
|
|
|
|
|
protected:
|
|
|
|
|
|
int sync (
|
|
)
|
|
{
|
|
int num = static_cast<int>(pptr()-pbase());
|
|
if (num != 0)
|
|
{
|
|
check_for_matlab_ctrl_c();
|
|
|
|
buf[num] = 0; // null terminate the string
|
|
mexPrintf("%s",&buf[0]);
|
|
mexEvalString("drawnow"); // flush print to screen
|
|
pbump(-num);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int_type overflow (
|
|
int_type c
|
|
)
|
|
{
|
|
if (c != EOF)
|
|
{
|
|
*pptr() = c;
|
|
pbump(1);
|
|
}
|
|
sync();
|
|
return c;
|
|
}
|
|
|
|
private:
|
|
std::vector<char> buf;
|
|
std::streambuf* oldbuf;
|
|
|
|
};
|
|
|
|
class mex_warn_streambuf : public std::streambuf
|
|
{
|
|
|
|
public:
|
|
mex_warn_streambuf (
|
|
)
|
|
{
|
|
buf.resize(1000);
|
|
setp(&buf[0], &buf[0] + buf.size()-2);
|
|
|
|
// make cout send data to mex_warn_streambuf
|
|
oldbuf = std::cerr.rdbuf(this);
|
|
}
|
|
|
|
~mex_warn_streambuf()
|
|
{
|
|
// put cerr back to the way we found it before running our mex function.
|
|
std::cerr.rdbuf(oldbuf);
|
|
}
|
|
|
|
protected:
|
|
|
|
|
|
int sync (
|
|
)
|
|
{
|
|
int num = static_cast<int>(pptr()-pbase());
|
|
if (num != 0)
|
|
{
|
|
check_for_matlab_ctrl_c();
|
|
|
|
buf[num] = 0; // null terminate the string
|
|
mexWarnMsgTxt(&buf[0]);
|
|
mexEvalString("drawnow"); // flush print to screen
|
|
pbump(-num);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int_type overflow (
|
|
int_type c
|
|
)
|
|
{
|
|
if (c != EOF)
|
|
{
|
|
*pptr() = c;
|
|
pbump(1);
|
|
}
|
|
sync();
|
|
return c;
|
|
}
|
|
|
|
private:
|
|
std::vector<char> buf;
|
|
std::streambuf* oldbuf;
|
|
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <typename T>
|
|
void setup_input_args (
|
|
mxArray*& array,
|
|
const T& item,
|
|
int& nrhs
|
|
)
|
|
{
|
|
assign_to_matlab(array, item);
|
|
++nrhs;
|
|
}
|
|
|
|
void setup_input_args (
|
|
mxArray*& array,
|
|
const function_handle& item,
|
|
int& nrhs
|
|
)
|
|
{
|
|
array = static_cast<mxArray*>(item.h);
|
|
++nrhs;
|
|
}
|
|
|
|
template <typename T>
|
|
void setup_input_args (
|
|
mxArray*& array,
|
|
const output_decorator<T>& item,
|
|
int& nrhs
|
|
)
|
|
{
|
|
}
|
|
|
|
template <typename T>
|
|
void setup_output_args (
|
|
const std::string& function_name,
|
|
mxArray* array,
|
|
const T& item,
|
|
int& nrhs
|
|
)
|
|
{
|
|
}
|
|
|
|
template <typename T>
|
|
void setup_output_args (
|
|
const std::string& function_name,
|
|
mxArray* array,
|
|
const output_decorator<T>& item,
|
|
int& i
|
|
)
|
|
{
|
|
try
|
|
{
|
|
validate_and_populate_arg(i,array,const_cast<T&>(item.item));
|
|
++i;
|
|
}
|
|
catch (invalid_args_exception& e)
|
|
{
|
|
throw dlib::error("Error occurred calling MATLAB function '" + function_name + "' from mex file. \n"
|
|
"The MATLAB function didn't return what we expected it to. \nIn particular, return" + string(e.what()));
|
|
}
|
|
}
|
|
|
|
void call_matlab_for_real (
|
|
int nlhs,
|
|
mxArray* plhs[],
|
|
int nrhs,
|
|
mxArray* prhs[],
|
|
const std::string& function_name
|
|
)
|
|
{
|
|
int status = mexCallMATLAB(nlhs, plhs, nrhs, prhs, function_name.c_str());
|
|
if (status)
|
|
{
|
|
throw dlib::error("Error, an exception was thrown when we tried to call the MATLAB function '" + function_name + "'.");
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
namespace dlib
|
|
{
|
|
void call_matlab (
|
|
const std::string& function_name
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
|
|
call_matlab_for_real(0,NULL,0,NULL, function_name);
|
|
}
|
|
|
|
template <typename T1>
|
|
void free_callback_resources (
|
|
int nlhs,
|
|
mxArray* plhs[],
|
|
int nrhs,
|
|
mxArray* prhs[]
|
|
)
|
|
{
|
|
// free resources
|
|
for (int i = 0; i < nlhs; ++i)
|
|
mxDestroyArray(plhs[i]);
|
|
|
|
for (int i = 0; i < nrhs; ++i)
|
|
{
|
|
// don't call mxDestroyArray() on function handles (which should only ever be in prhs[0])
|
|
if (i == 0 && dlib::is_same_type<T1,function_handle>::value)
|
|
continue;
|
|
mxDestroyArray(prhs[i]);
|
|
}
|
|
}
|
|
|
|
template <
|
|
typename T1
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 1;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 2;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 3;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 4;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4,
|
|
typename T5
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4,
|
|
const T5& A5
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 5;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4,
|
|
typename T5,
|
|
typename T6
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4,
|
|
const T5& A5,
|
|
const T6& A6
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 6;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4,
|
|
typename T5,
|
|
typename T6,
|
|
typename T7
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4,
|
|
const T5& A5,
|
|
const T6& A6,
|
|
const T7& A7
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 7;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4,
|
|
typename T5,
|
|
typename T6,
|
|
typename T7,
|
|
typename T8
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4,
|
|
const T5& A5,
|
|
const T6& A6,
|
|
const T7& A7,
|
|
const T8& A8
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 8;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
setup_input_args(prhs[nrhs], A8, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
setup_output_args(function_name, plhs[i], A8, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4,
|
|
typename T5,
|
|
typename T6,
|
|
typename T7,
|
|
typename T8,
|
|
typename T9
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4,
|
|
const T5& A5,
|
|
const T6& A6,
|
|
const T7& A7,
|
|
const T8& A8,
|
|
const T9& A9
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 9;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
setup_input_args(prhs[nrhs], A8, nrhs);
|
|
setup_input_args(prhs[nrhs], A9, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
setup_output_args(function_name, plhs[i], A8, i);
|
|
setup_output_args(function_name, plhs[i], A9, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4,
|
|
typename T5,
|
|
typename T6,
|
|
typename T7,
|
|
typename T8,
|
|
typename T9,
|
|
typename T10
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4,
|
|
const T5& A5,
|
|
const T6& A6,
|
|
const T7& A7,
|
|
const T8& A8,
|
|
const T9& A9,
|
|
const T10& A10
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 10;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
setup_input_args(prhs[nrhs], A8, nrhs);
|
|
setup_input_args(prhs[nrhs], A9, nrhs);
|
|
setup_input_args(prhs[nrhs], A10, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
setup_output_args(function_name, plhs[i], A8, i);
|
|
setup_output_args(function_name, plhs[i], A9, i);
|
|
setup_output_args(function_name, plhs[i], A10, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4,
|
|
typename T5,
|
|
typename T6,
|
|
typename T7,
|
|
typename T8,
|
|
typename T9,
|
|
typename T10,
|
|
typename T11
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4,
|
|
const T5& A5,
|
|
const T6& A6,
|
|
const T7& A7,
|
|
const T8& A8,
|
|
const T9& A9,
|
|
const T10& A10,
|
|
const T11& A11
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 11;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
setup_input_args(prhs[nrhs], A8, nrhs);
|
|
setup_input_args(prhs[nrhs], A9, nrhs);
|
|
setup_input_args(prhs[nrhs], A10, nrhs);
|
|
setup_input_args(prhs[nrhs], A11, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
setup_output_args(function_name, plhs[i], A8, i);
|
|
setup_output_args(function_name, plhs[i], A9, i);
|
|
setup_output_args(function_name, plhs[i], A10, i);
|
|
setup_output_args(function_name, plhs[i], A11, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4,
|
|
typename T5,
|
|
typename T6,
|
|
typename T7,
|
|
typename T8,
|
|
typename T9,
|
|
typename T10,
|
|
typename T11,
|
|
typename T12
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4,
|
|
const T5& A5,
|
|
const T6& A6,
|
|
const T7& A7,
|
|
const T8& A8,
|
|
const T9& A9,
|
|
const T10& A10,
|
|
const T11& A11,
|
|
const T12& A12
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 12;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
setup_input_args(prhs[nrhs], A8, nrhs);
|
|
setup_input_args(prhs[nrhs], A9, nrhs);
|
|
setup_input_args(prhs[nrhs], A10, nrhs);
|
|
setup_input_args(prhs[nrhs], A11, nrhs);
|
|
setup_input_args(prhs[nrhs], A12, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
setup_output_args(function_name, plhs[i], A8, i);
|
|
setup_output_args(function_name, plhs[i], A9, i);
|
|
setup_output_args(function_name, plhs[i], A10, i);
|
|
setup_output_args(function_name, plhs[i], A11, i);
|
|
setup_output_args(function_name, plhs[i], A12, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4,
|
|
typename T5,
|
|
typename T6,
|
|
typename T7,
|
|
typename T8,
|
|
typename T9,
|
|
typename T10,
|
|
typename T11,
|
|
typename T12,
|
|
typename T13
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4,
|
|
const T5& A5,
|
|
const T6& A6,
|
|
const T7& A7,
|
|
const T8& A8,
|
|
const T9& A9,
|
|
const T10& A10,
|
|
const T11& A11,
|
|
const T12& A12,
|
|
const T13& A13
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 13;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
setup_input_args(prhs[nrhs], A8, nrhs);
|
|
setup_input_args(prhs[nrhs], A9, nrhs);
|
|
setup_input_args(prhs[nrhs], A10, nrhs);
|
|
setup_input_args(prhs[nrhs], A11, nrhs);
|
|
setup_input_args(prhs[nrhs], A12, nrhs);
|
|
setup_input_args(prhs[nrhs], A13, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
setup_output_args(function_name, plhs[i], A8, i);
|
|
setup_output_args(function_name, plhs[i], A9, i);
|
|
setup_output_args(function_name, plhs[i], A10, i);
|
|
setup_output_args(function_name, plhs[i], A11, i);
|
|
setup_output_args(function_name, plhs[i], A12, i);
|
|
setup_output_args(function_name, plhs[i], A13, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4,
|
|
typename T5,
|
|
typename T6,
|
|
typename T7,
|
|
typename T8,
|
|
typename T9,
|
|
typename T10,
|
|
typename T11,
|
|
typename T12,
|
|
typename T13,
|
|
typename T14
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4,
|
|
const T5& A5,
|
|
const T6& A6,
|
|
const T7& A7,
|
|
const T8& A8,
|
|
const T9& A9,
|
|
const T10& A10,
|
|
const T11& A11,
|
|
const T12& A12,
|
|
const T13& A13,
|
|
const T14& A14
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 14;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
setup_input_args(prhs[nrhs], A8, nrhs);
|
|
setup_input_args(prhs[nrhs], A9, nrhs);
|
|
setup_input_args(prhs[nrhs], A10, nrhs);
|
|
setup_input_args(prhs[nrhs], A11, nrhs);
|
|
setup_input_args(prhs[nrhs], A12, nrhs);
|
|
setup_input_args(prhs[nrhs], A13, nrhs);
|
|
setup_input_args(prhs[nrhs], A14, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
setup_output_args(function_name, plhs[i], A8, i);
|
|
setup_output_args(function_name, plhs[i], A9, i);
|
|
setup_output_args(function_name, plhs[i], A10, i);
|
|
setup_output_args(function_name, plhs[i], A11, i);
|
|
setup_output_args(function_name, plhs[i], A12, i);
|
|
setup_output_args(function_name, plhs[i], A13, i);
|
|
setup_output_args(function_name, plhs[i], A14, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4,
|
|
typename T5,
|
|
typename T6,
|
|
typename T7,
|
|
typename T8,
|
|
typename T9,
|
|
typename T10,
|
|
typename T11,
|
|
typename T12,
|
|
typename T13,
|
|
typename T14,
|
|
typename T15
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4,
|
|
const T5& A5,
|
|
const T6& A6,
|
|
const T7& A7,
|
|
const T8& A8,
|
|
const T9& A9,
|
|
const T10& A10,
|
|
const T11& A11,
|
|
const T12& A12,
|
|
const T13& A13,
|
|
const T14& A14,
|
|
const T15& A15
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 15;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
setup_input_args(prhs[nrhs], A8, nrhs);
|
|
setup_input_args(prhs[nrhs], A9, nrhs);
|
|
setup_input_args(prhs[nrhs], A10, nrhs);
|
|
setup_input_args(prhs[nrhs], A11, nrhs);
|
|
setup_input_args(prhs[nrhs], A12, nrhs);
|
|
setup_input_args(prhs[nrhs], A13, nrhs);
|
|
setup_input_args(prhs[nrhs], A14, nrhs);
|
|
setup_input_args(prhs[nrhs], A15, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
setup_output_args(function_name, plhs[i], A8, i);
|
|
setup_output_args(function_name, plhs[i], A9, i);
|
|
setup_output_args(function_name, plhs[i], A10, i);
|
|
setup_output_args(function_name, plhs[i], A11, i);
|
|
setup_output_args(function_name, plhs[i], A12, i);
|
|
setup_output_args(function_name, plhs[i], A13, i);
|
|
setup_output_args(function_name, plhs[i], A14, i);
|
|
setup_output_args(function_name, plhs[i], A15, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4,
|
|
typename T5,
|
|
typename T6,
|
|
typename T7,
|
|
typename T8,
|
|
typename T9,
|
|
typename T10,
|
|
typename T11,
|
|
typename T12,
|
|
typename T13,
|
|
typename T14,
|
|
typename T15,
|
|
typename T16
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4,
|
|
const T5& A5,
|
|
const T6& A6,
|
|
const T7& A7,
|
|
const T8& A8,
|
|
const T9& A9,
|
|
const T10& A10,
|
|
const T11& A11,
|
|
const T12& A12,
|
|
const T13& A13,
|
|
const T14& A14,
|
|
const T15& A15,
|
|
const T16& A16
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 16;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
setup_input_args(prhs[nrhs], A8, nrhs);
|
|
setup_input_args(prhs[nrhs], A9, nrhs);
|
|
setup_input_args(prhs[nrhs], A10, nrhs);
|
|
setup_input_args(prhs[nrhs], A11, nrhs);
|
|
setup_input_args(prhs[nrhs], A12, nrhs);
|
|
setup_input_args(prhs[nrhs], A13, nrhs);
|
|
setup_input_args(prhs[nrhs], A14, nrhs);
|
|
setup_input_args(prhs[nrhs], A15, nrhs);
|
|
setup_input_args(prhs[nrhs], A16, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
setup_output_args(function_name, plhs[i], A8, i);
|
|
setup_output_args(function_name, plhs[i], A9, i);
|
|
setup_output_args(function_name, plhs[i], A10, i);
|
|
setup_output_args(function_name, plhs[i], A11, i);
|
|
setup_output_args(function_name, plhs[i], A12, i);
|
|
setup_output_args(function_name, plhs[i], A13, i);
|
|
setup_output_args(function_name, plhs[i], A14, i);
|
|
setup_output_args(function_name, plhs[i], A15, i);
|
|
setup_output_args(function_name, plhs[i], A16, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
template <
|
|
typename T1,
|
|
typename T2,
|
|
typename T3,
|
|
typename T4,
|
|
typename T5,
|
|
typename T6,
|
|
typename T7,
|
|
typename T8,
|
|
typename T9,
|
|
typename T10,
|
|
typename T11,
|
|
typename T12,
|
|
typename T13,
|
|
typename T14,
|
|
typename T15,
|
|
typename T16,
|
|
typename T17
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1,
|
|
const T2& A2,
|
|
const T3& A3,
|
|
const T4& A4,
|
|
const T5& A5,
|
|
const T6& A6,
|
|
const T7& A7,
|
|
const T8& A8,
|
|
const T9& A9,
|
|
const T10& A10,
|
|
const T11& A11,
|
|
const T12& A12,
|
|
const T13& A13,
|
|
const T14& A14,
|
|
const T15& A15,
|
|
const T16& A16,
|
|
const T17& A17
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 17;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
setup_input_args(prhs[nrhs], A8, nrhs);
|
|
setup_input_args(prhs[nrhs], A9, nrhs);
|
|
setup_input_args(prhs[nrhs], A10, nrhs);
|
|
setup_input_args(prhs[nrhs], A11, nrhs);
|
|
setup_input_args(prhs[nrhs], A12, nrhs);
|
|
setup_input_args(prhs[nrhs], A13, nrhs);
|
|
setup_input_args(prhs[nrhs], A14, nrhs);
|
|
setup_input_args(prhs[nrhs], A15, nrhs);
|
|
setup_input_args(prhs[nrhs], A16, nrhs);
|
|
setup_input_args(prhs[nrhs], A17, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
setup_output_args(function_name, plhs[i], A8, i);
|
|
setup_output_args(function_name, plhs[i], A9, i);
|
|
setup_output_args(function_name, plhs[i], A10, i);
|
|
setup_output_args(function_name, plhs[i], A11, i);
|
|
setup_output_args(function_name, plhs[i], A12, i);
|
|
setup_output_args(function_name, plhs[i], A13, i);
|
|
setup_output_args(function_name, plhs[i], A14, i);
|
|
setup_output_args(function_name, plhs[i], A15, i);
|
|
setup_output_args(function_name, plhs[i], A16, i);
|
|
setup_output_args(function_name, plhs[i], A17, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
template <
|
|
typename T1, typename T2, typename T3, typename T4, typename T5, typename T6,
|
|
typename T7, typename T8, typename T9, typename T10, typename T11, typename T12,
|
|
typename T13, typename T14, typename T15, typename T16, typename T17, typename T18
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5, const T6& A6,
|
|
const T7& A7, const T8& A8, const T9& A9, const T10& A10, const T11& A11, const
|
|
T12& A12, const T13& A13, const T14& A14, const T15& A15, const T16& A16, const
|
|
T17& A17, const T18& A18
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 18;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
setup_input_args(prhs[nrhs], A8, nrhs);
|
|
setup_input_args(prhs[nrhs], A9, nrhs);
|
|
setup_input_args(prhs[nrhs], A10, nrhs);
|
|
setup_input_args(prhs[nrhs], A11, nrhs);
|
|
setup_input_args(prhs[nrhs], A12, nrhs);
|
|
setup_input_args(prhs[nrhs], A13, nrhs);
|
|
setup_input_args(prhs[nrhs], A14, nrhs);
|
|
setup_input_args(prhs[nrhs], A15, nrhs);
|
|
setup_input_args(prhs[nrhs], A16, nrhs);
|
|
setup_input_args(prhs[nrhs], A17, nrhs);
|
|
setup_input_args(prhs[nrhs], A18, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
setup_output_args(function_name, plhs[i], A8, i);
|
|
setup_output_args(function_name, plhs[i], A9, i);
|
|
setup_output_args(function_name, plhs[i], A10, i);
|
|
setup_output_args(function_name, plhs[i], A11, i);
|
|
setup_output_args(function_name, plhs[i], A12, i);
|
|
setup_output_args(function_name, plhs[i], A13, i);
|
|
setup_output_args(function_name, plhs[i], A14, i);
|
|
setup_output_args(function_name, plhs[i], A15, i);
|
|
setup_output_args(function_name, plhs[i], A16, i);
|
|
setup_output_args(function_name, plhs[i], A17, i);
|
|
setup_output_args(function_name, plhs[i], A18, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
template <
|
|
typename T1, typename T2, typename T3, typename T4, typename T5, typename T6,
|
|
typename T7, typename T8, typename T9, typename T10, typename T11, typename T12,
|
|
typename T13, typename T14, typename T15, typename T16, typename T17, typename T18,
|
|
typename T19
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5, const T6& A6,
|
|
const T7& A7, const T8& A8, const T9& A9, const T10& A10, const T11& A11, const
|
|
T12& A12, const T13& A13, const T14& A14, const T15& A15, const T16& A16, const
|
|
T17& A17, const T18& A18, const T19& A19
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 19;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
setup_input_args(prhs[nrhs], A8, nrhs);
|
|
setup_input_args(prhs[nrhs], A9, nrhs);
|
|
setup_input_args(prhs[nrhs], A10, nrhs);
|
|
setup_input_args(prhs[nrhs], A11, nrhs);
|
|
setup_input_args(prhs[nrhs], A12, nrhs);
|
|
setup_input_args(prhs[nrhs], A13, nrhs);
|
|
setup_input_args(prhs[nrhs], A14, nrhs);
|
|
setup_input_args(prhs[nrhs], A15, nrhs);
|
|
setup_input_args(prhs[nrhs], A16, nrhs);
|
|
setup_input_args(prhs[nrhs], A17, nrhs);
|
|
setup_input_args(prhs[nrhs], A18, nrhs);
|
|
setup_input_args(prhs[nrhs], A19, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
setup_output_args(function_name, plhs[i], A8, i);
|
|
setup_output_args(function_name, plhs[i], A9, i);
|
|
setup_output_args(function_name, plhs[i], A10, i);
|
|
setup_output_args(function_name, plhs[i], A11, i);
|
|
setup_output_args(function_name, plhs[i], A12, i);
|
|
setup_output_args(function_name, plhs[i], A13, i);
|
|
setup_output_args(function_name, plhs[i], A14, i);
|
|
setup_output_args(function_name, plhs[i], A15, i);
|
|
setup_output_args(function_name, plhs[i], A16, i);
|
|
setup_output_args(function_name, plhs[i], A17, i);
|
|
setup_output_args(function_name, plhs[i], A18, i);
|
|
setup_output_args(function_name, plhs[i], A19, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
template <
|
|
typename T1, typename T2, typename T3, typename T4, typename T5, typename T6,
|
|
typename T7, typename T8, typename T9, typename T10, typename T11, typename T12,
|
|
typename T13, typename T14, typename T15, typename T16, typename T17, typename T18,
|
|
typename T19, typename T20
|
|
>
|
|
void call_matlab (
|
|
const std::string& function_name,
|
|
const T1& A1, const T2& A2, const T3& A3, const T4& A4, const T5& A5, const T6& A6,
|
|
const T7& A7, const T8& A8, const T9& A9, const T10& A10, const T11& A11, const
|
|
T12& A12, const T13& A13, const T14& A14, const T15& A15, const T16& A16, const
|
|
T17& A17, const T18& A18, const T19& A19, const T20& A20
|
|
)
|
|
{
|
|
using namespace mex_binding;
|
|
const int num_args = 20;
|
|
mxArray* plhs[num_args] = {0};
|
|
mxArray* prhs[num_args] = {0};
|
|
|
|
int nrhs = 0;
|
|
setup_input_args(prhs[nrhs], A1, nrhs);
|
|
setup_input_args(prhs[nrhs], A2, nrhs);
|
|
setup_input_args(prhs[nrhs], A3, nrhs);
|
|
setup_input_args(prhs[nrhs], A4, nrhs);
|
|
setup_input_args(prhs[nrhs], A5, nrhs);
|
|
setup_input_args(prhs[nrhs], A6, nrhs);
|
|
setup_input_args(prhs[nrhs], A7, nrhs);
|
|
setup_input_args(prhs[nrhs], A8, nrhs);
|
|
setup_input_args(prhs[nrhs], A9, nrhs);
|
|
setup_input_args(prhs[nrhs], A10, nrhs);
|
|
setup_input_args(prhs[nrhs], A11, nrhs);
|
|
setup_input_args(prhs[nrhs], A12, nrhs);
|
|
setup_input_args(prhs[nrhs], A13, nrhs);
|
|
setup_input_args(prhs[nrhs], A14, nrhs);
|
|
setup_input_args(prhs[nrhs], A15, nrhs);
|
|
setup_input_args(prhs[nrhs], A16, nrhs);
|
|
setup_input_args(prhs[nrhs], A17, nrhs);
|
|
setup_input_args(prhs[nrhs], A18, nrhs);
|
|
setup_input_args(prhs[nrhs], A19, nrhs);
|
|
setup_input_args(prhs[nrhs], A20, nrhs);
|
|
|
|
const int nlhs = num_args - nrhs;
|
|
call_matlab_for_real(nlhs,plhs,nrhs,prhs, function_name);
|
|
|
|
int i = 0;
|
|
setup_output_args(function_name, plhs[i], A1, i);
|
|
setup_output_args(function_name, plhs[i], A2, i);
|
|
setup_output_args(function_name, plhs[i], A3, i);
|
|
setup_output_args(function_name, plhs[i], A4, i);
|
|
setup_output_args(function_name, plhs[i], A5, i);
|
|
setup_output_args(function_name, plhs[i], A6, i);
|
|
setup_output_args(function_name, plhs[i], A7, i);
|
|
setup_output_args(function_name, plhs[i], A8, i);
|
|
setup_output_args(function_name, plhs[i], A9, i);
|
|
setup_output_args(function_name, plhs[i], A10, i);
|
|
setup_output_args(function_name, plhs[i], A11, i);
|
|
setup_output_args(function_name, plhs[i], A12, i);
|
|
setup_output_args(function_name, plhs[i], A13, i);
|
|
setup_output_args(function_name, plhs[i], A14, i);
|
|
setup_output_args(function_name, plhs[i], A15, i);
|
|
setup_output_args(function_name, plhs[i], A16, i);
|
|
setup_output_args(function_name, plhs[i], A17, i);
|
|
setup_output_args(function_name, plhs[i], A18, i);
|
|
setup_output_args(function_name, plhs[i], A19, i);
|
|
setup_output_args(function_name, plhs[i], A20, i);
|
|
|
|
free_callback_resources<T1>(nlhs,plhs,nrhs,prhs);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
matlab_object::~matlab_object(
|
|
)
|
|
{
|
|
if (handle && should_free)
|
|
{
|
|
mxDestroyArray((mxArray*)handle);
|
|
handle = 0;
|
|
}
|
|
}
|
|
|
|
template <typename T>
|
|
matlab_object::
|
|
operator T(
|
|
) const
|
|
{
|
|
T item;
|
|
get(item);
|
|
return item;
|
|
}
|
|
|
|
template <typename T>
|
|
void matlab_object::
|
|
get(
|
|
T& item
|
|
) const
|
|
{
|
|
if (handle == 0)
|
|
throw dlib::invalid_args_exception("An attempt was made to access an empty matlab_object.");
|
|
|
|
mex_binding::validate_and_populate_arg(arg_idx,(mxArray*)handle,item);
|
|
}
|
|
|
|
template <typename T>
|
|
matlab_object& matlab_object::
|
|
operator= (
|
|
const T& new_val
|
|
)
|
|
{
|
|
mxArray* item;
|
|
mex_binding::assign_to_matlab(item, new_val);
|
|
handle = item;
|
|
should_free = true;
|
|
return *this;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <typename T>
|
|
matlab_struct::sub::operator T() const
|
|
{
|
|
T item;
|
|
get(item);
|
|
return item;
|
|
}
|
|
|
|
template <typename T>
|
|
void matlab_struct::sub::get(T& item) const
|
|
{
|
|
if (struct_handle == 0)
|
|
throw dlib::error("Attempt to access data in an empty struct.");
|
|
|
|
mxArray* temp = mxGetFieldByNumber((const mxArray*)struct_handle, 0, field_idx);
|
|
if (temp == 0)
|
|
throw dlib::error("Attempt to access data in an empty struct.");
|
|
|
|
try
|
|
{
|
|
mex_binding::validate_and_populate_arg(0,temp,item);
|
|
}
|
|
catch(mex_binding::invalid_args_exception& e)
|
|
{
|
|
std::ostringstream sout;
|
|
sout << "Struct field '" << mxGetFieldNameByNumber((const mxArray*)struct_handle, field_idx) << "' can't be interpreted as the requested type."
|
|
<< endl << e.what();
|
|
throw dlib::error(sout.str());
|
|
}
|
|
}
|
|
|
|
const matlab_struct::sub matlab_struct::
|
|
operator[] (const std::string& name) const
|
|
{
|
|
if (struct_handle == 0)
|
|
throw dlib::error("Struct does not have a field named '" + name + "'.");
|
|
|
|
matlab_struct::sub temp;
|
|
temp.struct_handle = struct_handle;
|
|
temp.field_idx = mxGetFieldNumber((const mxArray*)struct_handle, name.c_str());
|
|
if (temp.field_idx == -1 )
|
|
throw dlib::error("Struct does not have a field named '" + name + "'.");
|
|
return temp;
|
|
}
|
|
|
|
matlab_struct::sub matlab_struct::
|
|
operator[] (const std::string& name)
|
|
{
|
|
if (struct_handle == 0)
|
|
{
|
|
// We make a struct from scratch and mark that we will free it unless it gets
|
|
// written back to matlab by assign_to_matlab().
|
|
mwSize dims[1] = {1};
|
|
const char* name_str = name.c_str();
|
|
struct_handle = mxCreateStructArray(1, dims, 1, &name_str);
|
|
should_free = true;
|
|
if (struct_handle == 0)
|
|
throw dlib::error("Error creating struct from within mex function.");
|
|
}
|
|
|
|
|
|
matlab_struct::sub temp;
|
|
temp.struct_handle = struct_handle;
|
|
if ((temp.field_idx=mxGetFieldNumber((mxArray*)struct_handle, name.c_str())) == -1)
|
|
{
|
|
if ((temp.field_idx=mxAddField((mxArray*)struct_handle, name.c_str())) == -1)
|
|
{
|
|
throw dlib::error("Unable to add field '"+name + "' to struct.");
|
|
}
|
|
}
|
|
return temp;
|
|
}
|
|
|
|
const matlab_struct::sub matlab_struct::sub::
|
|
operator[] (const std::string& name) const
|
|
{
|
|
if (struct_handle == 0)
|
|
throw dlib::error("Struct does not have a field named '" + name + "'.");
|
|
|
|
matlab_struct::sub temp;
|
|
temp.struct_handle = mxGetFieldByNumber((const mxArray*)struct_handle, 0, field_idx);
|
|
if (temp.struct_handle == 0)
|
|
throw dlib::error("Failure to get struct field while calling mxGetFieldByNumber()");
|
|
|
|
if (!mxIsStruct((const mxArray*)temp.struct_handle))
|
|
throw dlib::error("Struct sub-field element '"+name+"' is not another struct.");
|
|
|
|
temp.field_idx = mxGetFieldNumber((const mxArray*)temp.struct_handle, name.c_str());
|
|
if (temp.field_idx == -1 )
|
|
throw dlib::error("Struct does not have a field named '" + name + "'.");
|
|
return temp;
|
|
}
|
|
|
|
matlab_struct::sub matlab_struct::sub::
|
|
operator[] (const std::string& name)
|
|
{
|
|
if (struct_handle == 0)
|
|
throw dlib::error("Struct does not have a field named '" + name + "'.");
|
|
|
|
matlab_struct::sub temp;
|
|
temp.struct_handle = mxGetFieldByNumber((const mxArray*)struct_handle, 0, field_idx);
|
|
// We are replacing this field with a struct if it exists and isn't already a struct
|
|
if (temp.struct_handle != 0 && !mxIsStruct((const mxArray*)temp.struct_handle))
|
|
{
|
|
mxDestroyArray((mxArray*)temp.struct_handle);
|
|
temp.struct_handle = 0;
|
|
}
|
|
if (temp.struct_handle == 0)
|
|
{
|
|
mwSize dims[1] = {1};
|
|
temp.struct_handle = mxCreateStructArray(1, dims, 0, 0);
|
|
if (temp.struct_handle == 0)
|
|
throw dlib::error("Failure to create new sub-struct field");
|
|
mxSetFieldByNumber((mxArray*)struct_handle, 0, field_idx, (mxArray*)temp.struct_handle);
|
|
}
|
|
|
|
|
|
if ((temp.field_idx=mxGetFieldNumber((mxArray*)temp.struct_handle, name.c_str())) == -1)
|
|
{
|
|
if ((temp.field_idx=mxAddField((mxArray*)temp.struct_handle, name.c_str())) == -1)
|
|
{
|
|
throw dlib::error("Unable to add field '"+name + "' to struct.");
|
|
}
|
|
}
|
|
return temp;
|
|
}
|
|
|
|
bool matlab_struct::has_field (
|
|
const std::string& name
|
|
) const
|
|
{
|
|
if (struct_handle == 0)
|
|
return false;
|
|
return mxGetFieldNumber((const mxArray*)struct_handle, name.c_str()) != -1;
|
|
}
|
|
|
|
bool matlab_struct::sub::has_field (
|
|
const std::string& name
|
|
) const
|
|
{
|
|
if (struct_handle == 0)
|
|
return false;
|
|
mxArray* temp = mxGetFieldByNumber((const mxArray*)struct_handle, 0, field_idx);
|
|
if (temp == 0 || !mxIsStruct(temp))
|
|
return false;
|
|
return mxGetFieldNumber(temp, name.c_str()) != -1;
|
|
}
|
|
|
|
template <typename T>
|
|
matlab_struct::sub& matlab_struct::sub::operator= (
|
|
const T& new_val
|
|
)
|
|
{
|
|
// Delete anything in the field before we overwrite it
|
|
mxArray* item = mxGetFieldByNumber((mxArray*)struct_handle, 0, field_idx);
|
|
if (item != 0)
|
|
{
|
|
mxDestroyArray((mxArray*)item);
|
|
item = 0;
|
|
}
|
|
|
|
// Now set the field
|
|
mex_binding::assign_to_matlab(item, new_val);
|
|
mxSetFieldByNumber((mxArray*)struct_handle, 0, field_idx, item);
|
|
|
|
return *this;
|
|
}
|
|
|
|
matlab_struct::
|
|
~matlab_struct (
|
|
)
|
|
{
|
|
if (struct_handle && should_free)
|
|
{
|
|
mxDestroyArray((mxArray*)struct_handle);
|
|
struct_handle = 0;
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
void call_matlab (
|
|
const function_handle& funct
|
|
)
|
|
{
|
|
call_matlab("feval", funct);
|
|
}
|
|
|
|
extern "C" bool utIsInterruptPending();
|
|
void check_for_matlab_ctrl_c(
|
|
)
|
|
{
|
|
if (utIsInterruptPending())
|
|
throw mex_binding::user_hit_ctrl_c();
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
#ifdef MEX_CLASS_NAME
|
|
template <typename T, typename mfp_type>
|
|
class mex_class_wrapper
|
|
{
|
|
public:
|
|
mex_class_wrapper(T& obj_, mfp_type mfp_) : obj(obj_), mfp(mfp_) {}
|
|
|
|
template <typename... Args>
|
|
void operator()(Args&&... args) const
|
|
{
|
|
(obj.*mfp)(std::forward<Args>(args)...);
|
|
}
|
|
|
|
mfp_type mfp;
|
|
T& obj;
|
|
};
|
|
|
|
template <typename T, typename mfp_type>
|
|
mex_class_wrapper<T,mfp_type> wrap_mex_class(T& obj, mfp_type mfp) { return mex_class_wrapper<T,mfp_type>(obj, mfp); }
|
|
|
|
namespace dlib
|
|
{
|
|
template <typename T, typename mfp_type>
|
|
struct sig_traits<mex_class_wrapper<T,mfp_type>>
|
|
: public sig_traits<mfp_type>
|
|
{};
|
|
|
|
template <size_t i, typename T, bool is_good = i < std::tuple_size<T>::value>
|
|
struct tuple_element_default_void
|
|
{
|
|
typedef void type;
|
|
};
|
|
|
|
template <size_t i, typename T>
|
|
struct tuple_element_default_void<i,T,true>
|
|
{
|
|
typedef typename std::tuple_element<i,T>::type type;
|
|
};
|
|
|
|
template <typename class_type, typename return_type, typename... Args>
|
|
struct sig_traits<return_type(class_type::*)(Args...) >
|
|
{
|
|
enum { num_args = sizeof...(Args) };
|
|
|
|
typedef return_type result_type;
|
|
|
|
template <size_t i>
|
|
struct arg
|
|
{
|
|
typedef typename tuple_element_default_void<i-1, std::tuple<Args...>>::type type;
|
|
};
|
|
|
|
// These are here because that's how things are defined in sig_traits (since it is
|
|
// older than C++11, along with most of the other code in this file)
|
|
typedef typename arg<1>::type arg1_type;
|
|
typedef typename arg<2>::type arg2_type;
|
|
typedef typename arg<3>::type arg3_type;
|
|
typedef typename arg<4>::type arg4_type;
|
|
typedef typename arg<5>::type arg5_type;
|
|
typedef typename arg<6>::type arg6_type;
|
|
typedef typename arg<7>::type arg7_type;
|
|
typedef typename arg<8>::type arg8_type;
|
|
typedef typename arg<9>::type arg9_type;
|
|
typedef typename arg<10>::type arg10_type;
|
|
typedef typename arg<11>::type arg11_type;
|
|
typedef typename arg<12>::type arg12_type;
|
|
typedef typename arg<13>::type arg13_type;
|
|
typedef typename arg<14>::type arg14_type;
|
|
typedef typename arg<15>::type arg15_type;
|
|
typedef typename arg<16>::type arg16_type;
|
|
typedef typename arg<17>::type arg17_type;
|
|
typedef typename arg<18>::type arg18_type;
|
|
typedef typename arg<19>::type arg19_type;
|
|
typedef typename arg<20>::type arg20_type;
|
|
};
|
|
|
|
template <typename class_type, typename return_type, typename... Args>
|
|
struct sig_traits<return_type(class_type::*)(Args...) const>
|
|
{
|
|
enum { num_args = sizeof...(Args) };
|
|
|
|
typedef return_type result_type;
|
|
|
|
template <size_t i>
|
|
struct arg
|
|
{
|
|
typedef typename tuple_element_default_void<i-1, std::tuple<Args...>>::type type;
|
|
};
|
|
|
|
// These are here because that's how things are defined in sig_traits (since it is
|
|
// older than C++11, along with most of the other code in this file)
|
|
typedef typename arg<1>::type arg1_type;
|
|
typedef typename arg<2>::type arg2_type;
|
|
typedef typename arg<3>::type arg3_type;
|
|
typedef typename arg<4>::type arg4_type;
|
|
typedef typename arg<5>::type arg5_type;
|
|
typedef typename arg<6>::type arg6_type;
|
|
typedef typename arg<7>::type arg7_type;
|
|
typedef typename arg<8>::type arg8_type;
|
|
typedef typename arg<9>::type arg9_type;
|
|
typedef typename arg<10>::type arg10_type;
|
|
typedef typename arg<11>::type arg11_type;
|
|
typedef typename arg<12>::type arg12_type;
|
|
typedef typename arg<13>::type arg13_type;
|
|
typedef typename arg<14>::type arg14_type;
|
|
typedef typename arg<15>::type arg15_type;
|
|
typedef typename arg<16>::type arg16_type;
|
|
typedef typename arg<17>::type arg17_type;
|
|
typedef typename arg<18>::type arg18_type;
|
|
typedef typename arg<19>::type arg19_type;
|
|
typedef typename arg<20>::type arg20_type;
|
|
};
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
|
|
template <size_t I>
|
|
struct visit_impl
|
|
{
|
|
template <typename T, typename F>
|
|
static void visit(T& tup, size_t idx, F fun)
|
|
{
|
|
if (idx == I - 1) fun(std::get<I - 1>(tup));
|
|
else visit_impl<I - 1>::visit(tup, idx, fun);
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct visit_impl<0>
|
|
{
|
|
template <typename T, typename F>
|
|
static void visit(T& tup, size_t idx, F fun) { DLIB_CASSERT(false,"this should never happen"); }
|
|
};
|
|
|
|
template <typename F, typename... Ts>
|
|
void visit_at(std::tuple<Ts...> const& tup, size_t idx, F fun)
|
|
{
|
|
visit_impl<sizeof...(Ts)>::visit(tup, idx, fun);
|
|
}
|
|
|
|
template <typename F, typename... Ts>
|
|
void visit_at(std::tuple<Ts...>& tup, size_t idx, F fun)
|
|
{
|
|
visit_impl<sizeof...(Ts)>::visit(tup, idx, fun);
|
|
}
|
|
|
|
class mex_class_dispatch
|
|
{
|
|
public:
|
|
mex_class_dispatch(
|
|
MEX_CLASS_NAME* ptr_,
|
|
int nlhs_,
|
|
mxArray** plhs_,
|
|
int nrhs_,
|
|
const mxArray** prhs_
|
|
) :
|
|
ptr(ptr_),
|
|
nlhs(nlhs_),
|
|
plhs(plhs_),
|
|
nrhs(nrhs_),
|
|
prhs(prhs_)
|
|
{}
|
|
|
|
template <typename funct>
|
|
void operator() (const funct& mfp)
|
|
{
|
|
mex_binding::call_mex_function(wrap_mex_class(*ptr,mfp), nlhs, plhs, nrhs, prhs);
|
|
}
|
|
|
|
private:
|
|
MEX_CLASS_NAME* ptr;
|
|
int nlhs;
|
|
mxArray** plhs;
|
|
int nrhs;
|
|
const mxArray** prhs;
|
|
};
|
|
|
|
class class_factory_type : dlib::noncopyable
|
|
{
|
|
/*!
|
|
WHAT THIS OBJECT REPRESENTS
|
|
This is a container class for all the MEX_CLASS_NAME objects we create. It allows
|
|
us to track what we have created and make sure the MATLAB user doesn't do any
|
|
double frees or use any stale pointers.
|
|
|
|
It also helps us deal with the problem that would otherwise arise when a mex file
|
|
is unloaded from MATLAB when there are still active pointers to MEX_CLASS_NAME objects
|
|
in MATLAB, since we will be able to detect stale pointers.
|
|
!*/
|
|
public:
|
|
|
|
class_factory_type()
|
|
{
|
|
seed = (uint64)time(0);
|
|
}
|
|
|
|
~class_factory_type()
|
|
{
|
|
for (auto i : object_table)
|
|
delete i.second;
|
|
}
|
|
|
|
template <typename ...T>
|
|
uint64 create(T&& ...args)
|
|
{
|
|
MEX_CLASS_NAME* item = new MEX_CLASS_NAME(std::forward<T>(args)...);
|
|
uint64 id = (uint64)item;
|
|
// Now generate a unique id that incorporates our seed value. The point of doing
|
|
// this is to avoid any chance that a mex file will get unloaded and then reloaded
|
|
// and start constructing objects with the same addresses, while old stale objects
|
|
// at those addresses are still stored in matlab, which would then call into the
|
|
// mex file and make things go crazy. So here we try to generate ID numbers that
|
|
// are globally unique.
|
|
uint64 i = 0;
|
|
id = murmur_hash3_128bit_3(id, seed, ++i).first;
|
|
// very unlikely but make sure there aren't any hash collisions.
|
|
while(object_table.count(id) != 0)
|
|
id = murmur_hash3_128bit_3(id, seed, ++i).first;
|
|
|
|
object_table[id] = item;
|
|
return id;
|
|
}
|
|
|
|
void free(uint64 item)
|
|
{
|
|
if (object_table.count(item) == 0)
|
|
{
|
|
throw dlib::error("An attempt to deallocate a mex class object with an invalid pointer was detected.");
|
|
}
|
|
|
|
delete object_table[item];
|
|
object_table.erase(item);
|
|
}
|
|
|
|
MEX_CLASS_NAME* access(uint64 item) // convert numeric ID to pointer to object that can be used.
|
|
{
|
|
if (object_table.count(item) == 0)
|
|
{
|
|
throw dlib::error("An attempt to access a mex class object with an invalid pointer was detected.");
|
|
}
|
|
|
|
return object_table[item];
|
|
}
|
|
|
|
private:
|
|
|
|
std::map<uint64, MEX_CLASS_NAME*> object_table;
|
|
uint64 seed;
|
|
} class_factory;
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
// Make a FOREACH macro
|
|
#define FE_1(WHAT, X) WHAT(X)
|
|
#define FE_2(WHAT, X, ...) WHAT(X),FE_1(WHAT, __VA_ARGS__)
|
|
#define FE_3(WHAT, X, ...) WHAT(X),FE_2(WHAT, __VA_ARGS__)
|
|
#define FE_4(WHAT, X, ...) WHAT(X),FE_3(WHAT, __VA_ARGS__)
|
|
#define FE_5(WHAT, X, ...) WHAT(X),FE_4(WHAT, __VA_ARGS__)
|
|
#define FE_6(WHAT, X, ...) WHAT(X),FE_5(WHAT, __VA_ARGS__)
|
|
#define FE_7(WHAT, X, ...) WHAT(X),FE_6(WHAT, __VA_ARGS__)
|
|
#define FE_8(WHAT, X, ...) WHAT(X),FE_7(WHAT, __VA_ARGS__)
|
|
#define FE_9(WHAT, X, ...) WHAT(X),FE_8(WHAT, __VA_ARGS__)
|
|
#define FE_10(WHAT, X, ...) WHAT(X),FE_9(WHAT, __VA_ARGS__)
|
|
#define FE_11(WHAT, X, ...) WHAT(X),FE_10(WHAT, __VA_ARGS__)
|
|
#define FE_12(WHAT, X, ...) WHAT(X),FE_11(WHAT, __VA_ARGS__)
|
|
#define FE_13(WHAT, X, ...) WHAT(X),FE_12(WHAT, __VA_ARGS__)
|
|
#define FE_14(WHAT, X, ...) WHAT(X),FE_13(WHAT, __VA_ARGS__)
|
|
#define FE_15(WHAT, X, ...) WHAT(X),FE_14(WHAT, __VA_ARGS__)
|
|
#define FE_16(WHAT, X, ...) WHAT(X),FE_15(WHAT, __VA_ARGS__)
|
|
#define FE_17(WHAT, X, ...) WHAT(X),FE_16(WHAT, __VA_ARGS__)
|
|
#define FE_18(WHAT, X, ...) WHAT(X),FE_17(WHAT, __VA_ARGS__)
|
|
#define FE_19(WHAT, X, ...) WHAT(X),FE_18(WHAT, __VA_ARGS__)
|
|
#define FE_20(WHAT, X, ...) WHAT(X),FE_19(WHAT, __VA_ARGS__)
|
|
//... repeat as needed
|
|
#define GET_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,NAME,...) NAME
|
|
#define FOR_EACH(action,...) GET_MACRO(__VA_ARGS__,FE_20,FE_19,FE_18,FE_17,FE_16,FE_15,FE_14,FE_13,FE_12,FE_11,FE_10,FE_9,FE_8,FE_7,FE_6,FE_5,FE_4,FE_3,FE_2,FE_1)(action,__VA_ARGS__)
|
|
#define MEX_CLASS_ANNOTATE(x) &MEX_CLASS_NAME::x
|
|
|
|
// Now make a tuple containing all the member function pointers to our MEX_CLASS_NAME
|
|
auto mex_class_methods = std::make_tuple(FOR_EACH(MEX_CLASS_ANNOTATE, MEX_CLASS_METHODS));
|
|
|
|
|
|
#endif // MEX_CLASS_NAME
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
bool is_string(const mxArray* arr, const char* str)
|
|
{
|
|
if (mxIsChar(arr))
|
|
{
|
|
char ch[20];
|
|
DLIB_CASSERT(mxGetString(arr, ch, sizeof(ch))==0, "Unable to retrieve string");
|
|
ch[sizeof(ch)-1] = 0;// ensure NULL termination regardless of what MATLAB does.
|
|
return strcmp(str,ch)==0;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
/* The gateway function called by MATLAB*/
|
|
void mexFunction( int nlhs, mxArray *plhs[],
|
|
int nrhs, const mxArray *prhs[])
|
|
{
|
|
// Only remap cout and cerr if we aren't using octave since octave already does this.
|
|
#if !defined(OCTAVE_IMPORT) && !defined(OCTAVE_API)
|
|
// make it so cout prints to mexPrintf()
|
|
mex_binding::mex_streambuf sb;
|
|
// make it so cerr prints to mexWarnMsgTxt()
|
|
mex_binding::mex_warn_streambuf wsb;
|
|
#endif
|
|
|
|
try
|
|
{
|
|
#ifdef MEX_CLASS_NAME
|
|
if (nrhs == 0)
|
|
{
|
|
#define DEF2STR(x) DEF2STR2((x))
|
|
#define DEF2STR2(x) #x
|
|
|
|
string classname = trim(string(DEF2STR(MEX_CLASS_NAME)), " \t()");
|
|
std::vector<string> methods = split(trim(string(DEF2STR(MEX_CLASS_METHODS)), " \t()"), " \t,");
|
|
|
|
string mex_filename = trim(string(DEF2STR(MEX_FILENAME))," \t()");
|
|
bool has_load_obj = false;
|
|
size_t load_obj_idx = 0;
|
|
|
|
cout << "classdef " << classname << " < handle\n"
|
|
<< " properties (Access = private)\n"
|
|
<< " cpp_ptr\n"
|
|
<< " end\n"
|
|
<< "\n"
|
|
<< " methods\n"
|
|
<< " function this = "<<classname<<"()\n"
|
|
<< " this.cpp_ptr = "<<mex_filename<<"('construct');\n"
|
|
<< " end\n"
|
|
<< "\n"
|
|
<< " function copied_obj = clone(this)\n"
|
|
<< " %Returns a new independent object that is a copy of this.\n"
|
|
<< " copied_obj = "<<classname<<"();\n"
|
|
<< " copied_obj.cpp_ptr = "<<mex_filename<<"(this.cpp_ptr,'clone');\n"
|
|
<< " end\n"
|
|
<< "\n";
|
|
for (size_t i = 0; i < methods.size(); ++i)
|
|
{
|
|
if (methods[i] == "load_obj")
|
|
{
|
|
has_load_obj = true;
|
|
load_obj_idx = i;
|
|
}
|
|
else
|
|
{
|
|
cout << " function varargout = "<<methods[i]<<"(this, varargin) \n"
|
|
<< " [varargout{1:nargout}] = "<<mex_filename<<"(this.cpp_ptr, "<<i+1<<", varargin{:}); \n"
|
|
<< " end \n\n";
|
|
}
|
|
}
|
|
cout << " end\n\n";
|
|
|
|
cout << " methods(Access=private) \n"
|
|
<< " function delete(this) \n"
|
|
<< " "<<mex_filename<<"(this.cpp_ptr); \n"
|
|
<< " end \n";
|
|
if (has_load_obj)
|
|
{
|
|
cout << " function varargout = load_obj(this, varargin) \n"
|
|
<< " [varargout{1:nargout}] = "<<mex_filename<<"(this.cpp_ptr, "<<load_obj_idx+1<<", varargin{:}); \n"
|
|
<< " end \n";
|
|
}
|
|
cout << " end \n\n";
|
|
|
|
if (has_load_obj)
|
|
{
|
|
cout << " methods(Static) \n"
|
|
<< " function this = loadobj(in) \n"
|
|
<< " this = "<<classname<<"(); \n"
|
|
<< " this.load_obj(in); \n"
|
|
<< " end \n"
|
|
<< " end \n";
|
|
}
|
|
cout << "end \n";
|
|
}
|
|
else if (nrhs == 1)
|
|
{
|
|
// this is a constructor call
|
|
if (is_string(prhs[0],"construct"))
|
|
{
|
|
DLIB_CASSERT(nlhs == 1, "If you want to construct a new object then you must assign the pointer to something.");
|
|
plhs[0] = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL);
|
|
uint64* ptr_int = (uint64*)mxGetData(plhs[0]);
|
|
*ptr_int = class_factory.create();
|
|
}
|
|
else // destructor call
|
|
{
|
|
DLIB_CASSERT(mxIsUint64(prhs[0]) && mxGetNumberOfElements(prhs[0])==1, "When calling a class destructor the first argument must be a pointer (a UINT64 in matlab)");
|
|
const uint64 ptr_int = *((uint64*)mxGetData(prhs[0]));
|
|
class_factory.free(ptr_int);
|
|
}
|
|
}
|
|
else // a regular function call
|
|
{
|
|
DLIB_CASSERT(mxIsUint64(prhs[0]) && mxGetNumberOfElements(prhs[0])==1, "When calling a class member function the first argument must be a pointer (a UINT64 in matlab)");
|
|
if (is_string(prhs[1], "clone"))
|
|
{
|
|
DLIB_CASSERT(nlhs == 1, "If you want to construct a new object then you must assign the pointer to something.");
|
|
const uint64 ptr_int = *((uint64*)mxGetData(prhs[0]));
|
|
|
|
MEX_CLASS_NAME* ptr = class_factory.access(ptr_int);
|
|
|
|
plhs[0] = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL);
|
|
uint64* ptr_int2 = (uint64*)mxGetData(plhs[0]);
|
|
// copy construct a new object
|
|
*ptr_int2 = class_factory.create(*ptr);
|
|
}
|
|
else
|
|
{
|
|
DLIB_CASSERT(mxIsDouble(prhs[1]) && mxGetNumberOfElements(prhs[1])==1, "When calling a class member function the second argument must be a number indicating which member function");
|
|
const uint64 ptr_int = *((uint64*)mxGetData(prhs[0]));
|
|
const int funct_idx = *(mxGetPr(prhs[1]));
|
|
|
|
auto num_registered_functions = std::tuple_size<decltype(mex_class_methods)>::value;
|
|
DLIB_CASSERT(1 <= funct_idx && funct_idx <= num_registered_functions, "Invalid function index provided.");
|
|
|
|
MEX_CLASS_NAME* ptr = class_factory.access(ptr_int);
|
|
|
|
// we used the first two arguments to decide what function to call. So adjust nrhs
|
|
// and prhs so the member function never sees them.
|
|
mex_class_dispatch dispatch(ptr, nlhs, plhs, nrhs-2, prhs+2);
|
|
// now invoke the member function, subtract 1 to convert to 0 indexing.
|
|
visit_at(mex_class_methods, funct_idx-1, dispatch);
|
|
}
|
|
}
|
|
#else
|
|
mex_binding::call_mex_function(mex_function, nlhs, plhs, nrhs, prhs);
|
|
#endif
|
|
}
|
|
catch (mex_binding::invalid_args_exception& e)
|
|
{
|
|
mexErrMsgIdAndTxt("mex_function:validate_and_populate_arg",
|
|
mex_binding::escape_percent(e.what()).c_str());
|
|
}
|
|
catch (mex_binding::user_hit_ctrl_c& )
|
|
{
|
|
// do nothing, just return to matlab
|
|
}
|
|
catch (std::exception& e)
|
|
{
|
|
mexErrMsgIdAndTxt("mex_function:error",
|
|
mex_binding::escape_percent(e.what()).c_str());
|
|
}
|
|
|
|
cout << flush;
|
|
cerr << flush;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|