Added mxCreateUninitNumericArray and mxCreateUninitNumericMatrix functions to the... 83/19283/7
Siddhartha Gairola [Wed, 14 Jun 2017 06:31:31 +0000 (11:31 +0530)]
Change-Id: I38802e67b373da91776763819224be3152b8a292

scilab/modules/mexlib/src/cpp/mexlib.cpp
scilab/modules/mexlib/tests/unit_tests/mxCreateUninitNumeric.dia.ref [new file with mode: 0644]
scilab/modules/mexlib/tests/unit_tests/mxCreateUninitNumeric.tst [new file with mode: 0644]

index 4223229..af0fb75 100644 (file)
@@ -5,6 +5,7 @@
  *  Copyright (C) 2011 - DIGITEO - Antoine ELIAS
  *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ *  Copyright (C) 2017 - Gsoc 2017 - Siddhartha Gairola
  *
  * This file is hereby licensed under the terms of the GNU GPL v2.0,
  * pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -205,14 +206,55 @@ mxArray *mxCreateNumericArray(int ndim, const int *dims, mxClassID CLASS, mxComp
 
 mxArray *mxCreateUninitNumericMatrix(size_t m, size_t n, mxClassID classid, mxComplexity ComplexFlag)
 {
-    //TODO
-    return NULL;
+    int dims[2] = {(int)m, (int)n};
+    return mxCreateUninitNumericArray(2, (size_t *)dims, classid, ComplexFlag);
 }
 
 mxArray *mxCreateUninitNumericArray(size_t ndim, size_t *dims, mxClassID classid, mxComplexity ComplexFlag)
 {
-    //TODO
-    return NULL;
+    types::GenericType *ptr;
+
+    switch (classid)
+    {
+        case mxDOUBLE_CLASS:
+            ptr = new types::Double((int)ndim, (int *)dims, ComplexFlag == mxCOMPLEX);
+            break;
+        case mxINT8_CLASS:
+            ptr = new types::Int8((int)ndim, (int *)dims);
+            break;
+        case mxUINT8_CLASS:
+            ptr = new types::UInt8((int)ndim, (int *)dims);
+            break;
+        case mxINT16_CLASS:
+            ptr = new types::Int16((int)ndim, (int *)dims);
+            break;
+        case mxUINT16_CLASS:
+            ptr = new types::UInt16((int)ndim, (int *)dims);
+            break;
+        case mxINT32_CLASS:
+            ptr = new types::Int32((int)ndim, (int *)dims);
+            break;
+        case mxUINT32_CLASS:
+            ptr = new types::UInt32((int)ndim, (int *)dims);
+            break;
+        case mxINT64_CLASS:
+            ptr = new types::Int64((int)ndim, (int *)dims);
+            break;
+        case mxUINT64_CLASS:
+            ptr = new types::UInt64((int)ndim, (int *)dims);
+            break;
+        default:
+            ptr = NULL;
+    }
+
+    if (ptr == NULL)
+    {
+        return NULL;
+    }
+
+    mxArray* ret = new mxArray;
+    ret->ptr = (int*)ptr;
+    return ret;
 }
 
 mxArray *mxCreateString(const char *string)
diff --git a/scilab/modules/mexlib/tests/unit_tests/mxCreateUninitNumeric.dia.ref b/scilab/modules/mexlib/tests/unit_tests/mxCreateUninitNumeric.dia.ref
new file mode 100644 (file)
index 0000000..7ad0378
--- /dev/null
@@ -0,0 +1,72 @@
+// ============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Gsoc 2017 - Siddhartha Gairola
+//
+//  This file is distributed under the same license as the Scilab package.
+// ============================================================================
+
+// <-- CLI SHELL MODE -->
+// ============================================================================
+// Unitary tests for mxCreateUninitNumericArray and mxCreateUninitNumericMatrix mex functions
+// ============================================================================
+cd(TMPDIR);
+ilib_verbose(0);
+mputl([ "#include ""mex.h""";
+"";
+"void mexFunction(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])";
+"{";
+"   int piDims[3] = {4,3,2};";
+"   int iDims = 3;";
+"   mxClassID CLASS = 0;";
+"   double* pdblType = NULL;";
+"   mxArray* pOut = NULL;";
+"   mxArray* pOut1 = NULL;";
+"   mxArray* pOut2 = NULL;";
+"";
+"   if(nrhs != 1)";
+"   {";
+"       mexErrMsgTxt(""Wrong number or type of input argument"");";
+"   }";
+"";
+"   pdblType = mxGetPr(prhs[0]);";
+"   pOut = mxCreateUninitNumericArray(iDims, piDims, (mxClassID)pdblType[0], mxREAL);";
+"   pOut1 = mxCreateUninitNumericMatrix(2, 3, (mxClassID)pdblType[0], mxREAL);";
+"   pOut2 = mxCreateUninitNumericMatrix(4, 5, (mxClassID)pdblType[0], mxREAL);";
+"   plhs[0] = pOut;";
+"   plhs[1] = pOut1;";
+"   plhs[2] = pOut2;";
+"}"],"mexCreateUninitNumeric.c");
+ilib_mex_build("libmextest",["createUninitNumeric","mexCreateUninitNumeric","cmex"], "mexCreateUninitNumeric.c",[]);
+exec("loader.sce");
+[ret8, a, b] = createUninitNumeric(8);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(ret8, int8(ret8));
+[retU8, a, b] = createUninitNumeric(9);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(retU8, uint8(retU8));
+[ret16, a, b] = createUninitNumeric(10);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(ret16, int16(ret16));
+[retU16, a, b] = createUninitNumeric(11);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(retU16, uint16(retU16));
+[ret32, a, b] = createUninitNumeric(12);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(ret32, int32(ret32));
+[retU32, a, b] = createUninitNumeric(13);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(retU32, uint32(retU32));
+[ret64, a, b] = createUninitNumeric(14);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(ret64, int64(ret64));
+[retU64, a, b] = createUninitNumeric(15);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(retU64, uint64(retU64));
diff --git a/scilab/modules/mexlib/tests/unit_tests/mxCreateUninitNumeric.tst b/scilab/modules/mexlib/tests/unit_tests/mxCreateUninitNumeric.tst
new file mode 100644 (file)
index 0000000..fbc2bf8
--- /dev/null
@@ -0,0 +1,74 @@
+// ============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Gsoc 2017 - Siddhartha Gairola
+//
+//  This file is distributed under the same license as the Scilab package.
+// ============================================================================
+
+// <-- CLI SHELL MODE -->
+// ============================================================================
+// Unitary tests for mxCreateUninitNumericArray and mxCreateUninitNumericMatrix mex functions
+// ============================================================================
+
+cd(TMPDIR);
+ilib_verbose(0);
+mputl([ "#include ""mex.h""";
+"";
+"void mexFunction(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])";
+"{";
+"   int piDims[3] = {4,3,2};";
+"   int iDims = 3;";
+"   mxClassID CLASS = 0;";
+"   double* pdblType = NULL;";
+"   mxArray* pOut = NULL;";
+"   mxArray* pOut1 = NULL;";
+"   mxArray* pOut2 = NULL;";
+"";
+"   if(nrhs != 1)";
+"   {";
+"       mexErrMsgTxt(""Wrong number or type of input argument"");";
+"   }";
+"";
+"   pdblType = mxGetPr(prhs[0]);";
+"   pOut = mxCreateUninitNumericArray(iDims, piDims, (mxClassID)pdblType[0], mxREAL);";
+"   pOut1 = mxCreateUninitNumericMatrix(2, 3, (mxClassID)pdblType[0], mxREAL);";
+"   pOut2 = mxCreateUninitNumericMatrix(4, 5, (mxClassID)pdblType[0], mxREAL);";
+"   plhs[0] = pOut;";
+"   plhs[1] = pOut1;";
+"   plhs[2] = pOut2;";
+"}"],"mexCreateUninitNumeric.c");
+ilib_mex_build("libmextest",["createUninitNumeric","mexCreateUninitNumeric","cmex"], "mexCreateUninitNumeric.c",[]);
+exec("loader.sce");
+
+[ret8, a, b] = createUninitNumeric(8);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(ret8, int8(ret8));
+[retU8, a, b] = createUninitNumeric(9);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(retU8, uint8(retU8));
+[ret16, a, b] = createUninitNumeric(10);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(ret16, int16(ret16));
+[retU16, a, b] = createUninitNumeric(11);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(retU16, uint16(retU16));
+[ret32, a, b] = createUninitNumeric(12);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(ret32, int32(ret32));
+[retU32, a, b] = createUninitNumeric(13);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(retU32, uint32(retU32));
+[ret64, a, b] = createUninitNumeric(14);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(ret64, int64(ret64));
+[retU64, a, b] = createUninitNumeric(15);
+assert_checkequal([2, 3], size(a));
+assert_checkequal([4, 5], size(b));
+assert_checkequal(retU64, uint64(retU64));