49#if ! defined (octave_mxarray_h)
50#define octave_mxarray_h 1
52#include "octave-config.h"
56#if defined (MXARRAY_TYPEDEFS_ONLY)
57# warning "MXARRAY_TYPEDEFS_ONLY has been deprecated and will be removed in \
58Octave 12. Include "mxtypes.h" instead of "mxarray.h"."
61#if ! defined (MXARRAY_TYPEDEFS_ONLY)
73#define DO_MUTABLE_METHOD(RET_T, METHOD_CALL) \
74 RET_T retval = m_rep->METHOD_CALL; \
76 if (m_rep->mutation_needed ()) \
79 retval = m_rep->METHOD_CALL; \
84#define DO_VOID_MUTABLE_METHOD(METHOD_CALL) \
87 if (m_rep->mutation_needed ()) \
112 virtual
mxArray * as_mxArray ()
const {
return nullptr; }
126 const char *cname = get_class_name ();
128 if (cname && name_arg)
129 retval = !
strcmp (cname, name_arg);
168 return is_logical () && get_number_of_elements () == 1;
213 err_invalid_type (
"set_property");
218 err_invalid_type (
"get_cell");
306 return (m_interleaved
307 ? is_complex () ? 2 * size : size
313 error (
"%s: invalid type for mxArray::%s", get_class_name (), op);
333 OCTINTERP_API
mxArray (
bool interleaved, mxClassID
id, mwSize ndims,
334 const mwSize *dims, mxComplexity flag = mxREAL,
338 mxComplexity flag = mxREAL);
340 OCTINTERP_API
mxArray (
bool interleaved, mxClassID
id, mwSize m, mwSize n,
341 mxComplexity flag = mxREAL,
bool init =
true);
343 OCTINTERP_API
mxArray (
bool interleaved, mxClassID
id,
double val);
345 OCTINTERP_API
mxArray (
bool interleaved, mxClassID
id, mxLogical val);
347 OCTINTERP_API
mxArray (
bool interleaved,
const char *str);
349 OCTINTERP_API
mxArray (
bool interleaved, mwSize m,
const char **str);
351 OCTINTERP_API
mxArray (
bool interleaved, mxClassID
id, mwSize m, mwSize n,
352 mwSize nzmax, mxComplexity flag = mxREAL);
354 OCTINTERP_API
mxArray (
bool interleaved, mwSize ndims,
const mwSize *dims,
355 int num_keys,
const char **keys);
360 OCTINTERP_API
mxArray (
bool interleaved, mwSize m, mwSize n,
int num_keys,
363 OCTINTERP_API
mxArray (
bool interleaved, mwSize ndims,
const mwSize *dims);
367 OCTINTERP_API
mxArray (
bool interleaved, mwSize m, mwSize n);
379 retval =
new mxArray (new_rep, m_name);
385 OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (
mxArray)
459 OCTINTERP_API
void set_name (
const char *name);
610 static OCTINTERP_API
void *
malloc (std::size_t n);
612 static OCTINTERP_API
void *
calloc (std::size_t n, std::size_t t);
614 static OCTINTERP_API
void *
alloc (
bool init, std::size_t n, std::size_t t);
618 char *retval =
nullptr;
622 mwSize sz =
sizeof (mxChar) * (
strlen (str) + 1);
627 strcpy (retval, str);
647 create_rep (
bool interleaved, mxClassID
id, mwSize ndims,
648 const mwSize *dims, mxComplexity flag,
bool init);
651 create_rep (
bool interleaved, mxClassID
id,
const dim_vector& dv,
655 create_rep (
bool interleaved, mxClassID
id, mwSize m, mwSize n,
656 mxComplexity flag,
bool init);
659 create_rep (
bool interleaved, mxClassID
id,
double val);
662 create_rep (
bool interleaved, mxClassID
id, mxLogical val);
665 create_rep (
bool interleaved,
const char *str);
668 create_rep (
bool interleaved, mwSize m,
const char **str);
671 create_rep (
bool interleaved, mxClassID
id, mwSize m, mwSize n,
672 mwSize nzmax, mxComplexity flag);
674 OCTINTERP_API
void maybe_mutate ()
const;
692 : m_curr_mex_fcn (
f), m_memlist (), m_arraylist (), m_fname (nullptr) { }
694 OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (
mex)
698 const char *function_name ()
const;
701 void *malloc_unmarked (std::size_t n);
706 void *ptr = malloc_unmarked (n);
716 void *ptr = malloc_unmarked (n*t);
718 memset (ptr, 0, n*t);
724 void *
calloc (std::size_t n, std::size_t t)
726 void *ptr = calloc_unmarked (n, t);
736 void *realloc (
void *ptr, std::size_t n);
739 void free (
void *ptr);
745 if (m_memlist.find (ptr) != m_memlist.end ())
746 warning (
"%s: double registration ignored", function_name ());
749 m_memlist.insert (ptr);
756 auto p = m_memlist.find (ptr);
758 if (p != m_memlist.end ())
762 warning (
"%s: value not marked", function_name ());
768 m_arraylist.insert (ptr);
774 auto p = m_arraylist.find (ptr);
776 if (p != m_arraylist.end ())
777 m_arraylist.erase (p);
784 if (m_foreign_memlist.find (ptr) != m_foreign_memlist.end ())
785 warning (
"%s: double registration ignored", function_name ());
788 m_foreign_memlist.insert (ptr);
794 auto p = m_foreign_memlist.find (ptr);
796 if (p != m_foreign_memlist.end ())
797 m_foreign_memlist.erase (p);
800 warning (
"%s: value not marked", function_name ());
809 bool interleaved = m_curr_mex_fcn.use_interleaved_complex ();
811 return mark_array (
new mxArray (interleaved, ov));
819 auto p = m_arraylist.find (ptr);
821 if (p != m_arraylist.end ())
824 m_arraylist.erase (p);
829 warning (
"mex::free_value: skipping memory not allocated by mex::make_value");
837 return m_curr_mex_fcn;
841 int trap_feval_error = 0;
847 if (s_global_memlist.find (ptr) != s_global_memlist.end ())
848 warning (
"%s: double registration ignored", function_name ());
851 s_global_memlist.insert (ptr);
857 auto p = s_global_memlist.find (ptr);
859 if (p != s_global_memlist.end ())
860 s_global_memlist.erase (p);
863 warning (
"%s: value not marked", function_name ());
873 std::set<void *> m_memlist;
876 std::set<mxArray *> m_arraylist;
880 std::set<void *> m_foreign_memlist;
883 mutable char *m_fname;
886 static std::set<void *> s_global_memlist;
890#undef DO_MUTABLE_METHOD
891#undef DO_VOID_MUTABLE_METHOD
Vector representing the dimensions (size) of an Array.
mex(octave_mex_function &f)
void unmark_array(mxArray *ptr)
mxArray * make_value(const octave_value &ov)
void * malloc(std::size_t n)
mxArray * mark_array(mxArray *ptr)
octave_mex_function & current_mex_function() const
void global_unmark(void *ptr)
bool free_value(mxArray *ptr)
void global_mark(void *ptr)
void mark_foreign(void *ptr)
void * calloc(std::size_t n, std::size_t t)
void * calloc_unmarked(std::size_t n, std::size_t t)
void unmark_foreign(void *ptr)
virtual int set_int8s(mxInt8 *data)=0
virtual int set_complex_singles(mxComplexSingle *data)=0
OCTAVE_NORETURN void err_invalid_type(const char *op) const
virtual mxArray * as_mxArray() const
virtual bool is_octave_value() const
virtual void set_n(mwSize n)=0
virtual void set_cell(mwIndex idx, mxArray *val)=0
virtual int add_field(const char *key)=0
virtual mxInt64 * get_int64s() const =0
virtual mxUint32 * get_uint32s() const =0
virtual void set_nzmax(mwSize nzmax)=0
virtual int set_uint16s(mxUint16 *data)=0
virtual int is_logical() const =0
virtual int is_uint64() const =0
virtual int set_uint64s(mxUint64 *data)=0
virtual int get_string(char *buf, mwSize buflen) const =0
virtual bool is_scalar() const =0
virtual mwIndex calc_single_subscript(mwSize nsubs, mwIndex *subs) const =0
virtual mxArray * get_property(mwIndex, const char *) const
virtual int set_doubles(mxDouble *data)=0
virtual int set_int64s(mxInt64 *data)=0
virtual int is_complex() const =0
virtual octave_value as_octave_value() const =0
virtual mxDouble * get_doubles() const =0
virtual void set_imag_data(void *pi)=0
virtual int is_numeric() const =0
virtual mxArray * get_field_by_number(mwIndex index, int key_num) const =0
virtual int set_int16s(mxInt16 *data)=0
virtual int is_double() const =0
virtual int set_singles(mxSingle *data)=0
virtual int is_char() const =0
virtual void * get_imag_data() const =0
virtual void set_m(mwSize m)=0
virtual void set_data(void *pr)=0
virtual int is_logical_scalar_true() const =0
virtual mxComplexSingle * get_complex_singles() const =0
virtual int is_uint16() const =0
virtual double get_scalar() const =0
virtual mxInt16 * get_int16s() const =0
virtual int is_class(const char *name_arg) const
virtual mxInt8 * get_int8s() const =0
virtual mwSize get_nzmax() const =0
virtual const char * get_field_name_by_number(int key_num) const =0
std::size_t get_numeric_element_size(std::size_t size) const
virtual int iscell() const =0
virtual void set_property(mwIndex, const char *, const mxArray *)
virtual int set_complex_doubles(mxComplexDouble *data)=0
virtual int isempty() const =0
virtual mwSize get_number_of_elements() const =0
virtual mxUint8 * get_uint8s() const =0
virtual int is_logical_scalar() const
virtual void set_jc(mwIndex *jc)=0
virtual std::size_t get_element_size() const =0
virtual int set_uint32s(mxUint32 *data)=0
virtual int set_uint8s(mxUint8 *data)=0
virtual bool mutation_needed() const
virtual mxArray * mutate() const
virtual int set_dimensions(mwSize *dims_arg, mwSize ndims_arg)=0
virtual int is_int16() const =0
virtual int is_single() const =0
virtual void set_class_name(const char *name_arg)=0
virtual mxUint16 * get_uint16s() const =0
virtual mwSize * get_dimensions() const =0
virtual mxArray_base * dup() const =0
virtual mxInt32 * get_int32s() const =0
virtual mwSize get_number_of_dimensions() const =0
virtual int is_function_handle() const =0
virtual int is_uint8() const =0
virtual mxComplexDouble * get_complex_doubles() const =0
virtual mwSize get_m() const =0
virtual int is_int8() const =0
virtual char * array_to_string() const =0
virtual void * get_data() const =0
virtual int is_int32() const =0
virtual int get_number_of_fields() const =0
virtual void set_ir(mwIndex *ir)=0
virtual mxSingle * get_singles() const =0
virtual void remove_field(int key_num)=0
virtual int is_uint32() const =0
virtual mwIndex * get_jc() const =0
virtual mwIndex * get_ir() const =0
virtual int is_int64() const =0
virtual void set_field_by_number(mwIndex index, int key_num, mxArray *val)=0
virtual int is_struct() const =0
virtual int get_field_number(const char *key) const =0
virtual const char * get_class_name() const =0
virtual mwSize get_n() const =0
virtual mxArray * get_cell(mwIndex) const
virtual mxUint64 * get_uint64s() const =0
virtual int set_int32s(mxInt32 *data)=0
virtual ~mxArray_base()=default
virtual int is_sparse() const =0
virtual mxClassID get_class_id() const =0
mxInt16 * get_int16s() const
mxDouble * get_doubles() const
mxArray * get_field_by_number(mwIndex index, int key_num) const
int set_uint8s(mxUint8 *data)
int set_complex_singles(mxComplexSingle *data)
int is_logical_scalar() const
int set_uint32s(mxUint32 *data)
mxUint64 * get_uint64s() const
int get_number_of_fields() const
mxComplexDouble * get_complex_doubles() const
double get_scalar() const
void set_name(const char *name)
mxUint32 * get_uint32s() const
mwSize get_number_of_dimensions() const
bool mutation_needed() const
const char * get_class_name() const
void set_property(mwIndex idx, const char *pname, const mxArray *pval)
std::size_t get_element_size() const
int set_singles(mxSingle *data)
mxArray * get_property(mwIndex idx, const char *pname) const
int set_uint16s(mxUint16 *data)
static void * alloc(bool init, std::size_t n, std::size_t t)
int is_function_handle() const
int set_uint64s(mxUint64 *data)
mwIndex calc_single_subscript(mwSize nsubs, mwIndex *subs) const
static char * strsave(const char *str)
mwSize get_number_of_elements() const
int set_dimensions(mwSize *dims_arg, mwSize ndims_arg)
mxUint8 * get_uint8s() const
static void * calloc(std::size_t n, std::size_t t)
int set_complex_doubles(mxComplexDouble *data)
int get_field_number(const char *key) const
int add_field(const char *key)
char * array_to_string() const
mxInt8 * get_int8s() const
mxInt32 * get_int32s() const
int set_int32s(mxInt32 *data)
int set_int64s(mxInt64 *data)
int set_doubles(mxDouble *data)
void set_nzmax(mwSize nzmax)
mxSingle * get_singles() const
int is_logical_scalar_true() const
const char * get_field_name_by_number(int key_num) const
const char * get_name() const
bool is_octave_value() const
octave_value as_octave_value() const
int set_int16s(mxInt16 *data)
mxClassID get_class_id() const
mxArray * get_cell(mwIndex idx) const
mwSize * get_dimensions() const
int get_string(char *buf, mwSize buflen) const
int is_class(const char *name_arg) const
int set_int8s(mxInt8 *data)
void set_class_name(const char *name_arg)
void set_field_by_number(mwIndex index, int key_num, mxArray *val)
void set_cell(mwIndex idx, mxArray *val)
mxInt64 * get_int64s() const
static void * malloc(std::size_t n)
mxUint16 * get_uint16s() const
void set_imag_data(void *pi)
mxComplexSingle * get_complex_singles() const
void remove_field(int key_num)
void * get_imag_data() const
void warning(const char *fmt,...)
void error(const char *fmt,...)
F77_RET_T const F77_DBLE const F77_DBLE * f
int mexSet_impl(double handle, const char *property, mxArray *val)
int mexPutVariable_impl(const char *space, const char *name, const mxArray *ptr)
void mexErrMsgTxt_impl(const char *who, const char *s)
#define DO_VOID_MUTABLE_METHOD(METHOD_CALL)
octave_value_list mx_to_ov_args(int nargin, mxArray *argin[])
#define DO_MUTABLE_METHOD(RET_T, METHOD_CALL)
T::size_type strlen(const typename T::value_type *str)
bool strcmp(const T &str_a, const T &str_b)
Octave string utility functions.