changeset 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 913e812ef11d
children 6149f6b34cbc
files NEWS libinterp/corefcn/mex.cc libinterp/corefcn/mexproto.h libinterp/corefcn/mxarray.in.h
diffstat 4 files changed, 56 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/NEWS	Sat Sep 10 07:51:22 2016 -0700
+++ b/NEWS	Sun Sep 11 07:58:42 2016 -0700
@@ -148,7 +148,7 @@
     when the '-g' option is given to mex() or mkoctfile().
 
  ** Other new MEX API functions include mexEvalStringWithTrap,
-    mxIsScalar.
+    mxIsScalar, mxCreateUninitNumericArray, mxCreateUninitNumericMatrix.
 
  ** Other new functions added in 4.2:
 
--- 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));
--- a/libinterp/corefcn/mexproto.h	Sat Sep 10 07:51:22 2016 -0700
+++ b/libinterp/corefcn/mexproto.h	Sun Sep 11 07:58:42 2016 -0700
@@ -160,6 +160,14 @@
 extern OCTINTERP_API mxArray *mxCreateNumericMatrix (mwSize m, mwSize n,
                                                      mxClassID class_id,
                                                      mxComplexity flag);
+extern OCTINTERP_API mxArray *mxCreateUninitNumericArray (mwSize ndims,
+                                                          const mwSize *dims,
+                                                          mxClassID class_id,
+                                                          mxComplexity flag);
+extern OCTINTERP_API mxArray *mxCreateUninitNumericMatrix (mwSize m, mwSize n,
+                                                           mxClassID class_id,
+                                                           mxComplexity flag);
+
 extern OCTINTERP_API mxArray *mxCreateSparse (mwSize m, mwSize n, mwSize nzmax,
                                               mxComplexity flag);
 extern OCTINTERP_API mxArray *mxCreateSparseLogicalMatrix (mwSize m, mwSize n,
--- a/libinterp/corefcn/mxarray.in.h	Sat Sep 10 07:51:22 2016 -0700
+++ b/libinterp/corefcn/mxarray.in.h	Sun Sep 11 07:58:42 2016 -0700
@@ -310,11 +310,12 @@
   mxArray (const octave_value& ov);
 
   mxArray (mxClassID id, mwSize ndims, const mwSize *dims,
-           mxComplexity flag = mxREAL);
+           mxComplexity flag = mxREAL, bool init = true);
 
   mxArray (mxClassID id, const dim_vector& dv, mxComplexity flag = mxREAL);
 
-  mxArray (mxClassID id, mwSize m, mwSize n, mxComplexity flag = mxREAL);
+  mxArray (mxClassID id, mwSize m, mwSize n,
+           mxComplexity flag = mxREAL, bool init = true);
 
   mxArray (mxClassID id, double val);