diff --git a/wrap/wrap-matlab.h b/wrap/wrap-matlab.h index 5ed48cbbf..59a1241d6 100644 --- a/wrap/wrap-matlab.h +++ b/wrap/wrap-matlab.h @@ -46,14 +46,10 @@ mxArray *scalar(mxClassID classid) { return mxCreateNumericArray(1, dims, classid, mxREAL); } -mxArray *vector(int m, mxClassID classid) { - mwSize dims[1]; dims[0]=m; - return mxCreateNumericArray(1, dims, classid, mxREAL); -} - -mxArray *matrix(int m, int n, mxClassID classid) { - mwSize dims[2]; dims[0]=m; dims[1]=n; - return mxCreateNumericArray(2, dims, mxUINT32OR64_CLASS, mxREAL); +void checkScalar(const mxArray* array, const char* str) { + int m = mxGetM(array), n = mxGetN(array); + if (m!=1 || n!=1) + mexErrMsgIdAndTxt("wrap: not a scalar in ", str); } //***************************************************************************** @@ -84,8 +80,7 @@ mxArray* wrap(string& value) { return mxCreateString(value.c_str()); } -// specialization to bool -> uint32 -// Warning: might rely on sizeof(UINT32_T)==sizeof(bool) +// specialization to bool template<> mxArray* wrap(bool& value) { mxArray *result = scalar(mxUINT32OR64_CLASS); @@ -93,8 +88,7 @@ mxArray* wrap(bool& value) { return result; } -// specialization to size_t -> uint32 -// Warning: might rely on sizeof(UINT32_T)==sizeof(size_t) +// specialization to size_t template<> mxArray* wrap(size_t& value) { mxArray *result = scalar(mxUINT32OR64_CLASS); @@ -102,11 +96,10 @@ mxArray* wrap(size_t& value) { return result; } -// specialization to int -> uint32 -// Warning: might rely on sizeof(INT32_T)==sizeof(int) +// specialization to int template<> mxArray* wrap(int& value) { - mxArray *result = scalar(mxINT32_CLASS); + mxArray *result = scalar(mxUINT32OR64_CLASS); *(int*)mxGetData(result) = value; return result; } @@ -184,34 +177,31 @@ string unwrap(const mxArray* array) { } // specialization to bool -// returns a pointer to the array data itself -// Warning: relies on sizeof(UINT32_T)==sizeof(bool) template<> bool unwrap(const mxArray* array) { - return *(bool*)mxGetData(array); + checkScalar(array,"unwrap"); + return mxGetScalar(array) != 0.0; } // specialization to size_t -// returns a pointer to the array data itself -// Warning: relies on sizeof(UINT32_T)==sizeof(size_t) template<> size_t unwrap(const mxArray* array) { - return *(size_t*)mxGetData(array); + checkScalar(array,"unwrap"); + return (size_t)mxGetScalar(array); } // specialization to int -// returns a pointer to the array data itself -// Warning: relies on sizeof(INT32_T)==sizeof(int) template<> int unwrap(const mxArray* array) { - return *(int*)mxGetData(array); + checkScalar(array,"unwrap"); + return (int)mxGetScalar(array); } // specialization to double -// returns a pointer to the array data itself template<> double unwrap(const mxArray* array) { - return *(double*)mxGetData(array); + checkScalar(array,"unwrap"); + return (double)mxGetScalar(array); } // specialization to BOOST vector