/* * Copyright © 2007-2020 Dynare Team * * This file is part of Dynare. * * Dynare is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Dynare is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Dynare. If not, see . */ #ifndef MEX_INTERFACE_HH_INCLUDED #define MEX_INTERFACE_HH_INCLUDED #include #include #include #include #include #include #include #include using namespace std; typedef unsigned int mwIndex; typedef unsigned int mwSize; enum mxData_type { mxREAL, mxCOMPLEX }; enum mxArray_type { mxDOUBLE_CLASS = 0, mxSINGLE_CLASS = 1, mxLOGICAL_CLASS = 2, mxCHAR_CLASS = 3, mxSPARSE_CLASS = 4, mxSTRUCT_CLASS = 5, mxCELL_CLASS = 6, mxFUNCTION_CLASS = 7, mxUINT8_CLASS = 8, mxINT16_CLASS = 9, mxUINT16_CLASS = 10, mxINT32_CLASS = 11, mxUINT32_CLASS = 12, mxINT64_CLASS = 13, mxUINT64_CLASS = 14 }; class mxArray_tag { public: unsigned int size_1, size_2; mwIndex *Ir, *Jc; int Nzmax; double *data; mxArray_type type; vector field_name; vector> field_array; mxArray_tag(); }; typedef mxArray_tag mxArray; void load_global(char *file_name); /*Matlab clone function*/ int mexPrintf(const char *str, ...); void mexErrMsgTxt(const string str); void mexWarnMsgTxt(const string str); void *mxMalloc(unsigned int amount); void *mxRealloc(void *to_extend, unsigned int amount); void *mxCalloc(unsigned int nb_elements, unsigned int amount_per_element); void mxFree(void *to_release); void mexEvalString(const string str); double *mxGetPr(const mxArray *b_m); inline mwIndex * mxGetIr(const mxArray *A_m) { return (mwIndex *) A_m->Ir; }; inline mwIndex * mxGetJc(const mxArray *A_m) { return (mwIndex *) A_m->Jc; }; mxArray *mxSetNzmax(mxArray *A_m, mwSize nz_max); inline int mxGetNzmax(const mxArray *A_m) { return A_m->Nzmax; }; inline int mxGetM(const mxArray *A_m) { return A_m->size_1; }; inline int mxGetN(const mxArray *A_m) { return A_m->size_2; }; inline bool mxIsChar(const mxArray *A) { return A->type == mxCHAR_CLASS; }; inline bool mxIsFloat(const mxArray *A) { return A->type == mxDOUBLE_CLASS || A->type == mxSINGLE_CLASS; }; inline bool mxIsStruct(const mxArray *A) { return A->type == mxSTRUCT_CLASS; }; mxArray *mxCreateDoubleMatrix(unsigned int rows, unsigned int cols, mxData_type mx_type); mxArray *mxCreateSparse(unsigned int rows, unsigned int cols, unsigned int nz_max, mxData_type mx_type); mxArray *mxCreateCharArray(unsigned int rows, unsigned int cols, mxData_type mx_type); mxArray *mxCreateDoubleScalar(double value); mxArray *mxCreateStructMatrix(unsigned int rows, unsigned int cols, unsigned int nfields, const string &fieldnames); inline mxArray * mxCreateStructArray(unsigned int rows, mwSize *cols, int nfields, const string &fieldnames) { return mxCreateStructMatrix(rows, *cols, nfields, fieldnames); }; mxArray *mxCreatNULLMatrix(); void mexCallMATLAB(unsigned int n_lhs, mxArray *lhs[], unsigned int n_rhs, mxArray *rhs[], const char *function); void mxDestroyArray(mxArray *A_m); mxArray *read_struct(FILE *fid); mxArray *read_Array(FILE *fid); mxArray *read_double_array(FILE *fid); mxArray *mexGetVariable(const char *space_name, const char *matrix_name); int mxGetFieldNumber(const mxArray *Struct, const char *field_name); mxArray *mxGetFieldByNumber(mxArray *Struct, unsigned int pos, unsigned int field_number); void mxSetFieldByNumber(mxArray *Struct, mwIndex index, unsigned int field_number, mxArray *pvalue); int mxAddField(mxArray *Struct, const char *field_name); void mxSetFieldByNumber(mxArray *Struct, mwIndex index, unsigned int fieldnumber, mxArray *pvalue); inline unsigned int mxGetNumberOfElements(const mxArray *A) { return A->size_1 * A->size_2; }; int mxGetString(const mxArray *array, char *buf, unsigned int buflen); inline double mxGetScalar(const mxArray *array) { if (!mxIsFloat(array)) mexErrMsgTxt("not a float array\n"); return array->data[0]; }; mxArray *mxDuplicateArray(const mxArray *array); void Free_simple_array(mxArray *array); void Free_struct_array(mxArray *array); void Free_Array(mxArray *array); void Free_global(); #endif