diff libinterp/corefcn/mex.cc @ 23884:bd9e719f04cc

new mxGetProperty function for MEX API * mexproto.h, mex.cc (mxGetProperty): New function. * mxarray.in.h (mxArray::get_property): New function. (mxArray_base::get_property): New virtual function. * mex.cc (mxArray_octave_value::get_property): New function.
author Piotr Held <pjheld@gmail.com>
date Tue, 08 Aug 2017 16:25:44 -0700
parents 980f39c3ab90
children 142a9c7e403a
line wrap: on
line diff
--- a/libinterp/corefcn/mex.cc	Fri Aug 11 09:43:02 2017 -0400
+++ b/libinterp/corefcn/mex.cc	Tue Aug 08 16:25:44 2017 -0700
@@ -377,6 +377,31 @@
   // Not allowed.
   void set_class_name (const char * /*name_arg*/) { request_mutation (); }
 
+  mxArray * get_property (mwIndex idx, const char *name) const
+  {
+    mxArray *retval = nullptr;
+
+    if (val.is_classdef_object ())
+      {
+        octave_classdef *ov_cdef = val.classdef_object_value ();
+
+        if (ov_cdef)
+          {
+            cdef_object& cdef = ov_cdef->get_object_ref ();
+
+            if (cdef.is_array ())
+              cdef = cdef.array_value ().elem (idx);
+
+            octave_value prop_val = cdef.get (name);
+
+            if (prop_val.is_defined())
+              retval = new mxArray (prop_val);
+          }
+      }
+
+    return retval;
+  }
+
   mxArray * get_cell (mwIndex /*idx*/) const
   {
     request_mutation ();
@@ -2950,6 +2975,11 @@
   ptr->set_class_name (name);
 }
 
+mxArray *mxGetProperty (const mxArray *ptr, mwIndex idx, const char *propertyName)
+{
+  return ptr->get_property (idx, propertyName);
+}
+
 // Cell support.
 mxArray *
 mxGetCell (const mxArray *ptr, mwIndex idx)