diff libinterp/corefcn/mex.cc @ 22464:1d2960b5efe6

Add new MEX fcns mxCreateUninitNumericArray, mxCreateUninitNumericMatrix. * NEWS: Announce new functions. * mexproto.h: Add prototypes for new functions. * mxarray.in.h: Add 5th input (bool init = true) to mxArray constructors that map to mxCreateNumericArray and mxCreateNumericMatrix. * mex.cc (mxCreateUninitNumericArray): New function. Calls constructor mxArray (class_id, ndims, dims, flag, false), i.e., with init = false. * mex.cc (mxCreateUninitNumericArray): New function. Calls constructor mxArray (class_id, m, n, flag, false), i.e., with init = false. * mex.cc (mxArray::mxArray): Change constructors to pass init flag to constructors for mxArray_number. * mex.cc (mxArray_number): Change constructors to use init flag to decide whether calloc (init = true) or malloc (init = false) is used to get memory for the elements in the array.
author Rik <rik@octave.org>
date Sun, 11 Sep 2016 07:58:42 -0700
parents 6cb7813e5b2f
children 6149f6b34cbc
line wrap: on
line diff
--- a/libinterp/corefcn/mex.cc	Sat Sep 10 07:51:22 2016 -0700
+++ b/libinterp/corefcn/mex.cc	Sun Sep 11 07:58:42 2016 -0700
@@ -998,12 +998,18 @@
 public:
 
   mxArray_number (mxClassID id_arg, mwSize ndims_arg, const mwSize *dims_arg,
-                  mxComplexity flag = mxREAL)
+                  mxComplexity flag = mxREAL, bool init = true)
     : mxArray_matlab (id_arg, ndims_arg, dims_arg),
-      pr (mxArray::calloc (get_number_of_elements (), get_element_size ())),
-      pi (flag == mxCOMPLEX ? mxArray::calloc (get_number_of_elements (),
-                                               get_element_size ())
-                            : 0) { }
+      pr (init ? mxArray::calloc (get_number_of_elements (),
+                                  get_element_size ())
+               : mxArray::malloc (get_number_of_elements ()
+                                  * get_element_size ())),
+      pi (flag == mxCOMPLEX
+            ? (init ? mxArray::calloc (get_number_of_elements (),
+                                       get_element_size ())
+                    : mxArray::malloc (get_number_of_elements ()
+                                       * get_element_size ()))
+            : 0) { }
 
   mxArray_number (mxClassID id_arg, const dim_vector& dv,
                   mxComplexity flag = mxREAL)
@@ -1011,15 +1017,23 @@
       pr (mxArray::calloc (get_number_of_elements (), get_element_size ())),
       pi (flag == mxCOMPLEX ? mxArray::calloc (get_number_of_elements (),
                                                get_element_size ())
-                            : 0) { }
+                            : 0)
+  { }
 
   mxArray_number (mxClassID id_arg, mwSize m, mwSize n,
-                  mxComplexity flag = mxREAL)
+                  mxComplexity flag = mxREAL, bool init = true)
     : mxArray_matlab (id_arg, m, n),
-      pr (mxArray::calloc (get_number_of_elements (), get_element_size ())),
-      pi (flag == mxCOMPLEX ? mxArray::calloc (get_number_of_elements (),
-                                               get_element_size ())
-                            : 0) { }
+      pr (init ? mxArray::calloc (get_number_of_elements (),
+                                  get_element_size ())
+               : mxArray::malloc (get_number_of_elements ()
+                                  * get_element_size ())),
+      pi (flag == mxCOMPLEX
+            ? (init ? mxArray::calloc (get_number_of_elements (),
+                                       get_element_size ())
+                    : mxArray::malloc (get_number_of_elements ()
+                                       * get_element_size ()))
+            : 0)
+  { }
 
   mxArray_number (mxClassID id_arg, double val)
     : mxArray_matlab (id_arg, 1, 1),
@@ -1907,14 +1921,15 @@
   : rep (new mxArray_octave_value (ov)), name (0) { }
 
 mxArray::mxArray (mxClassID id, mwSize ndims, const mwSize *dims,
-                  mxComplexity flag)
-  : rep (new mxArray_number (id, ndims, dims, flag)), name (0) { }
+                  mxComplexity flag, bool init)
+  : rep (new mxArray_number (id, ndims, dims, flag, init)), name (0) { }
 
 mxArray::mxArray (mxClassID id, const dim_vector& dv, mxComplexity flag)
   : rep (new mxArray_number (id, dv, flag)), name (0) { }
 
-mxArray::mxArray (mxClassID id, mwSize m, mwSize n, mxComplexity flag)
-  : rep (new mxArray_number (id, m, n, flag)), name (0) { }
+mxArray::mxArray (mxClassID id, mwSize m, mwSize n,
+                  mxComplexity flag, bool init)
+  : rep (new mxArray_number (id, m, n, flag, init)), name (0) { }
 
 mxArray::mxArray (mxClassID id, double val)
   : rep (new mxArray_number (id, val)), name (0) { }
@@ -2520,6 +2535,20 @@
 }
 
 mxArray *
+mxCreateUninitNumericArray (mwSize ndims, const mwSize *dims,
+                            mxClassID class_id, mxComplexity flag)
+{
+  return maybe_mark_array (new mxArray (class_id, ndims, dims, flag, false));
+}
+
+mxArray *
+mxCreateUninitNumericMatrix (mwSize m, mwSize n, mxClassID class_id,
+                             mxComplexity flag)
+{
+  return maybe_mark_array (new mxArray (class_id, m, n, flag, false));
+}
+
+mxArray *
 mxCreateSparse (mwSize m, mwSize n, mwSize nzmax, mxComplexity flag)
 {
   return maybe_mark_array (new mxArray (mxDOUBLE_CLASS, m, n, nzmax, flag));