50#ifndef INCLUDE_MEXPLUS_MXARRAY_H_
51#define INCLUDE_MEXPLUS_MXARRAY_H_
62#pragma warning(once : 4244)
66#define MEXPLUS_CHECK_NOTNULL(pointer) \
68 mexErrMsgIdAndTxt("mexplus:error", \
69 "Null pointer exception: %s:%d:%s `" #pointer "`.", \
74#define MEXPLUS_ERROR(...) mexErrMsgIdAndTxt("mexplus:error", __VA_ARGS__)
75#define MEXPLUS_WARNING(...) mexWarnMsgIdAndTxt("mexplus:warning", __VA_ARGS__)
76#define MEXPLUS_ASSERT(condition, ...) \
77 if (!(condition)) mexErrMsgIdAndTxt("mexplus:error", __VA_ARGS__)
81 #if defined(_MSC_VER) && defined(_NOEXCEPT)
83 #define NOEXCEPT _NOEXCEPT
84 #elif __cplusplus > 199711L
85 #define NOEXCEPT noexcept
115 *
this = std::move(array);
132 array_(const_cast<mxArray*>(array)),
152 template <
typename T>
164 mxArray* array = rhs.
array_;
185 void reset(
const mxArray* array = NULL) {
188 array_ =
const_cast<mxArray*
>(array);
214 mxArray* array = mxDuplicateArray(
array_);
228 operator bool()
const {
return array_ != NULL; }
236 template <
typename T>
237 static mxArray*
Numeric(
int rows = 1,
int columns = 1);
243 template <
typename T>
244 static mxArray*
Numeric(std::vector<std::size_t> dims);
250 mxArray* logical_array = mxCreateLogicalMatrix(
rows, columns);
252 return logical_array;
266 static mxArray*
Cell(
int rows = 1,
int columns = 1) {
267 mxArray* cell_array = mxCreateCellMatrix(
rows, columns);
287 const char** fields = NULL,
290 mxArray* struct_array = mxCreateStructMatrix(
rows,
299 template <
typename T>
301 static mxArray*
from(
const char* value) {
302 mxArray* array = mxCreateString(value);
306 static mxArray*
from(int32_t value) {
307 mxArray* array = mxCreateNumericMatrix(1, 1, mxINT32_CLASS, mxREAL);
309 *
reinterpret_cast<int32_t*
>(mxGetData(array)) = value;
314 template <
typename T>
315 static void to(
const mxArray* array, T* value) {
318 template <
typename T>
319 static T
to(
const mxArray* array) {
326 template <
typename T>
327 static T
at(
const mxArray* array, mwIndex index) {
332 template <
typename T>
333 static void at(
const mxArray* array, mwIndex index, T* value) {
336 static const mxArray*
at(
const mxArray* array, mwIndex index) {
339 return mxGetCell(array, index);
341 template <
typename T>
342 static void at(
const mxArray* array,
343 const std::string& field,
348 static const mxArray*
at(
const mxArray* array,
349 const std::string& field,
353 return mxGetField(array, index, field.c_str());
357 template <
typename T>
358 static void set(mxArray* array, mwIndex index,
const T& value) {
361 static void set(mxArray* array, mwIndex index, mxArray* value) {
365 MEXPLUS_ASSERT(
static_cast<size_t>(index) < mxGetNumberOfElements(array),
366 "Index out of range: %u.",
368 mxDestroyArray(mxGetCell(array, index));
369 mxSetCell(array, index, value);
371 template <
typename T>
372 static void set(mxArray* array,
373 const std::string& field,
378 static void set(mxArray* array,
379 const std::string& field,
385 MEXPLUS_ASSERT(
static_cast<size_t>(index) < mxGetNumberOfElements(array),
386 "Index out of range: %u.",
388 int field_number = mxGetFieldNumber(array, field.c_str());
389 if (field_number < 0) {
390 field_number = mxAddField(array, field.c_str());
392 "Failed to create a field '%s'",
395 mxDestroyArray(mxGetFieldByNumber(array, index, field_number));
396 mxSetFieldByNumber(array, index, field_number, value);
401 template <
typename T>
407 template <
typename T>
420 template <
typename T>
421 T
at(mwIndex index)
const {
426 template <
typename T>
427 void at(mwIndex index, T* value)
const {
430 const mxArray*
at(mwIndex index)
const {
438 template <
typename T>
439 T
at(mwIndex row, mwIndex column)
const;
444 template <
typename T>
445 T
at(
const std::vector<mwIndex>& subscripts)
const;
451 template <
typename T>
452 T
at(
const std::string& field, mwIndex index = 0)
const {
457 template <
typename T>
458 void at(
const std::string& field, T* value, mwIndex index = 0)
const {
461 const mxArray*
at(
const std::string& field, mwIndex index = 0)
const {
469 template <
typename T>
470 void set(mwIndex index,
const T& value) {
478 template <
typename T>
479 void set(mwIndex row, mwIndex column,
const T& value);
484 template <
typename T>
485 void set(
const std::vector<mwIndex>& subscripts,
const T& value);
490 void set(mwIndex index, mxArray* value) {
499 void set(mwIndex row, mwIndex column, mxArray* value) {
507 void set(
const std::vector<mwIndex>& subscripts, mxArray* value) {
516 template <
typename T>
517 void set(
const std::string& field,
const T& value, mwIndex index = 0) {
526 void set(
const std::string& field, mxArray* value, mwIndex index = 0) {
533 template <
typename T>
538 template <
typename T>
543 "Expected a logical array but %s.",
545 return mxGetLogicals(
array_);
550 "Expected a char array but %s.",
552 return mxGetChars(
array_);
560 return std::string(mxGetClassName(
array_));
565 return static_cast<mwSize
>(mxGetNumberOfElements(
array_));
570 return mxGetNumberOfDimensions(
array_);
580 inline mwSize
rows()
const {
return static_cast<mwSize
>(mxGetM(
array_)); }
583 inline mwSize
cols()
const {
return static_cast<mwSize
>(mxGetN(
array_)); }
592 const char* field = mxGetFieldNameByNumber(
array_, index);
594 return std::string(field);
601 std::vector<std::string> fields(
fieldSize());
602 for (
int i = 0; i < fields.size(); ++i)
616 "Subscript is out of range.");
617 mwIndex subscripts[] = {row, column};
618 return mxCalcSingleSubscript(
array_, 2, subscripts);
625 return mxCalcSingleSubscript(
array_,
626 static_cast<mwSize
>(subscripts.size()),
627 const_cast<mwIndex*
>(&subscripts[0]));
638 return mxGetNumberOfDimensions(
array_) == 2 &&
649 return mxIsClass(
array_, name);
663 static inline bool IsFinite(
double value) {
return mxIsFinite(value); }
669 static inline bool IsInf(
double value) {
return mxIsInf(value); }
691 return mxIsLogicalScalarTrue(
array_);
720 bool hasField(
const std::string& field_name, mwIndex index = 0)
const {
722 mxGetField(
array_, index, field_name.c_str()) != NULL;
727 return static_cast<int>(mxGetElementSize(
array_));
731 static inline bool IsNaN(
double value) {
return mxIsNaN(value); }
734 static inline double Inf() {
return mxGetInf(); }
737 static inline double NaN() {
return mxGetNaN(); }
740 static inline double Eps() {
return mxGetEps(); }
758 template <
typename T>
759 static mxArray*
fromInternal(
const typename std::enable_if<
763 template <
typename T>
764 static mxArray*
fromInternal(
const typename std::enable_if<
768 template <
typename Container>
769 static mxArray*
fromInternal(
const typename std::enable_if<
771 Container>::type& value);
774 template <
typename Container>
775 static mxArray*
fromInternal(
const typename std::enable_if<
778 template <
typename T>
779 static mxArray*
fromInternal(
const typename std::enable_if<
783 template <
typename Container>
784 static mxArray*
fromInternal(
const typename std::enable_if<
786 (std::is_signed<typename Container::value_type>::value),
787 Container>::type& value);
790 template <
typename Container>
791 static mxArray*
fromInternal(
const typename std::enable_if<
793 !(std::is_signed<typename Container::value_type>::value),
794 Container>::type& value);
797 template <
typename T>
798 static mxArray*
fromInternal(
const typename std::enable_if<
802 template <
typename Container>
803 static mxArray*
fromInternal(
const typename std::enable_if<
807 template <
typename Container>
808 static mxArray*
fromInternal(
const typename std::enable_if<
817 template <
typename T>
819 typename std::enable_if<
830 template <
typename T>
832 typename std::enable_if<
840 template <
typename T>
842 typename std::enable_if<
844 (!std::is_compound<T>::value ||
855 template <
typename T>
856 static void atInternal(
const mxArray* array, mwIndex index,
857 typename std::enable_if<
864 template <
typename T>
865 static void atInternal(
const mxArray* array, mwIndex index,
866 typename std::enable_if<
867 std::is_compound<T>::value &&
873 template <
typename T>
875 const std::string& field,
876 mwIndex index, T* value);
884 template <
typename T>
885 static void setInternal(mxArray* array, mwIndex index,
886 const typename std::enable_if<
887 !std::is_compound<T>::value ||
893 template <
typename T>
894 static void setInternal(mxArray* array, mwIndex index,
895 const typename std::enable_if<
901 template <
typename T>
902 static void setInternal(mxArray* array,
const std::string& field,
903 mwIndex index,
const T& value);
911 template <
typename T,
typename R>
913 mwIndex index,
typename std::enable_if<
914 std::is_integral<R>::value,
917 MEXPLUS_ASSERT(!mxIsComplex(array),
"Non-complex array expected!");
918 *value = (R)*(
reinterpret_cast<T*
>(mxGetData(array)) + index);
922 #pragma warning( push )
924 #pragma warning( disable: 4244 )
926 template <
typename T,
typename R>
929 typename std::enable_if<
930 std::is_floating_point<R>::value,
933 if (mxIsComplex(array)) {
934 T real_part = *(
reinterpret_cast<T*
>(mxGetPr(array)) + index);
935 T imag_part = *(
reinterpret_cast<T*
>(mxGetPi(array)) + index);
936 *value = std::abs(std::complex<R>(real_part, imag_part));
938 *value = *(
reinterpret_cast<T*
>(mxGetData(array)) + index);
941 #pragma warning( pop )
944 template <
typename T,
typename R>
947 typename std::enable_if<
951 typename R::value_type real_part, imag_part;
952 if (mxIsComplex(array)) {
953 real_part = *(
reinterpret_cast<T*
>(mxGetPr(array)) + index);
954 imag_part = *(
reinterpret_cast<T*
>(mxGetPi(array)) + index);
956 real_part = *(
reinterpret_cast<T*
>(mxGetData(array)) + index);
959 *value = std::complex<typename R::value_type>(real_part, imag_part);
963 template <
typename R>
966 typename std::enable_if<
967 std::is_signed<R>::value,
970 typedef typename std::make_signed<mxChar>::type SignedMxChar;
971 *value =
static_cast<R
>(
972 *(
reinterpret_cast<SignedMxChar*
>(mxGetChars(array)) + index));
976 template <
typename R>
979 typename std::enable_if<
980 !std::is_signed<R>::value,
983 *value = *(mxGetChars(array) + index);
987 template <
typename T>
988 static void assignCellTo(
const mxArray* array, mwIndex index, T* value) {
989 const mxArray* element = mxGetCell(array, index);
995 #pragma warning( push )
997 #pragma warning( disable: 4244 4800 )
999 template <
typename T,
typename R>
1001 typename std::enable_if<
1007 mwSize array_size =
static_cast<mwSize
>(mxGetNumberOfElements(array));
1008 if (!mxIsComplex(array)) {
1009 T* data_pointer =
reinterpret_cast<T*
>(mxGetData(array));
1010 value->assign(data_pointer, data_pointer + array_size);
1012 T* real_part =
reinterpret_cast<T*
>(mxGetPr(array));
1013 T* imag_part =
reinterpret_cast<T*
>(mxGetPi(array));
1014 value->resize(array_size);
1015 for (mwSize i = 0; i < array_size; ++i) {
1016 double mag = std::abs(std::complex<double>(
1017 static_cast<double>(*(real_part++)),
1018 static_cast<double>(*(imag_part++))));
1019 (*value)[i] =
static_cast<T
>(mag);
1023 #pragma warning( pop )
1026 template <
typename T,
typename R>
1028 typename std::enable_if<
1032 mwSize array_size = mxGetNumberOfElements(array);
1033 value->resize(array_size);
1034 if (!mxIsComplex(array)) {
1035 T* data_pointer =
reinterpret_cast<T*
>(mxGetData(array));
1036 for (mwSize i = 0; i < array_size; ++i) {
1037 (*value)[i] =
typename R::value_type(*(data_pointer++), 0.0f);
1040 T* real_part =
reinterpret_cast<T*
>(mxGetPr(array));
1041 T* imag_part =
reinterpret_cast<T*
>(mxGetPi(array));
1042 for (mwSize i = 0; i < array_size; ++i) {
1043 (*value)[i] =
typename R::value_type(*(real_part++), *(imag_part++));
1049 template <
typename R>
1051 typename std::enable_if<
1052 std::is_signed<typename R::value_type>::value,
1055 typedef typename std::make_signed<mxChar>::type SignedMxChar;
1056 SignedMxChar* data_pointer =
reinterpret_cast<SignedMxChar*
>(
1058 value->assign(data_pointer, data_pointer + mxGetNumberOfElements(array));
1062 template <
typename R>
1064 typename std::enable_if<
1065 !std::is_signed<typename R::value_type>::value,
1067 mxChar* data_pointer = mxGetChars(array);
1068 value->assign(data_pointer, data_pointer + mxGetNumberOfElements(array));
1072 template <
typename T>
1074 mwSize array_size =
static_cast<mwSize
>(mxGetNumberOfElements(array));
1075 value->resize(array_size);
1076 for (
size_t i = 0; i < array_size; ++i) {
1077 const mxArray* element = mxGetCell(array,
static_cast<int>(i));
1089 #pragma warning( push )
1091 #pragma warning( disable: 4244 4800 )
1093 template <
typename R,
typename T>
1096 const typename std::enable_if<
1100 if (mxIsComplex(array)) {
1101 *(
reinterpret_cast<R*
>(mxGetPr(array)) + index) = value;
1102 *(
reinterpret_cast<R*
>(mxGetPi(array)) + index) = 0.0;
1104 *(
reinterpret_cast<R*
>(mxGetData(array)) + index) = value;
1107 #pragma warning( pop )
1110 template <
typename R,
typename T>
1113 const typename std::enable_if<
1117 if (mxIsComplex(array)) {
1118 *(
reinterpret_cast<R*
>(mxGetPr(array)) + index) = value.real();
1119 *(
reinterpret_cast<R*
>(mxGetPi(array)) + index) = value.imag();
1121 *(
reinterpret_cast<R*
>(mxGetData(array)) + index) = std::abs(value);
1124 #pragma warning( push )
1126 #pragma warning( disable: 4244 )
1128 template <
typename T>
1131 const typename std::enable_if<
1132 std::is_floating_point<T>::value,
1135 *(mxGetChars(array) + index) = value;
1137 #pragma warning( pop )
1138 template <
typename T>
1141 const typename std::enable_if<
1142 std::is_integral<T>::value &&
1143 std::is_signed<T>::value,
1146 *(mxGetChars(array) + index) =
reinterpret_cast<const typename
1147 std::make_unsigned<T>::type&
>(value);
1149 template <
typename T>
1152 const typename std::enable_if<
1153 std::is_integral<T>::value &&
1154 !std::is_signed<T>::value,
1157 *(mxGetChars(array) + index) = value;
1160 template <
typename T>
1163 const typename std::enable_if<
1167 *(mxGetChars(array) + index) = std::abs(value);
1184template <
typename T>
1187 mxArray* array = mxCreateNumericMatrix(1,
1192 *
reinterpret_cast<T*
>(mxGetData(array)) = value;
1198template <
typename T>
1201 mxArray* array = mxCreateNumericMatrix(1, 1,
1205 *
reinterpret_cast<typename T::value_type*
>(mxGetPr(array)) = value.real();
1206 *
reinterpret_cast<typename T::value_type*
>(mxGetPi(array)) = value.imag();
1213template <
typename Container>
1216 typedef typename Container::value_type ValueType;
1217 mxArray* array = mxCreateNumericMatrix(1,
1218 static_cast<int>(value.size()),
1222 std::copy(value.begin(),
1224 reinterpret_cast<ValueType*
>(mxGetData(array)));
1230template <
typename Container>
1233 typedef typename Container::value_type ContainerValueType;
1234 typedef typename ContainerValueType::value_type ValueType;
1235 mxArray* array = mxCreateNumericMatrix(1,
1236 static_cast<int>(value.size()),
1240 ValueType* real =
reinterpret_cast<ValueType*
>(mxGetPr(array));
1241 ValueType* imag =
reinterpret_cast<ValueType*
>(mxGetPi(array));
1242 typename Container::const_iterator it;
1243 for (it = value.begin(); it != value.end(); it++) {
1244 *real++ = (*it).real();
1245 *imag++ = (*it).imag();
1250template <
typename T>
1253 const char char_array[] = {
static_cast<char>(value), 0};
1254 mxArray* array = mxCreateString(char_array);
1259template <
typename Container>
1262 (std::is_signed<typename Container::value_type>::value),
1263 Container>::type& value) {
1264 typedef typename std::make_unsigned<typename Container::value_type>::type
1266 const mwSize
dimensions[] = {1,
static_cast<mwSize
>(value.size())};
1267 mxArray* array = mxCreateCharArray(2,
dimensions);
1269 mxChar* array_data = mxGetChars(array);
1270 for (
typename Container::const_iterator it = value.begin();
1273 *(array_data++) =
reinterpret_cast<const UnsignedValue&
>(*it);
1278template <
typename Container>
1281 !(std::is_signed<typename Container::value_type>::value),
1282 Container>::type& value) {
1283 const mwSize
dimensions[] = {1,
static_cast<mwSize
>(value.size())};
1284 mxArray* array = mxCreateCharArray(2,
dimensions);
1286 std::copy(value.begin(), value.end(), mxGetChars(array));
1290template <
typename T>
1293 mxArray* array = mxCreateLogicalScalar(value);
1298template <
typename Container>
1301 mxArray* array = mxCreateLogicalMatrix(1,
static_cast<int>(value.size()));
1303 std::copy(value.begin(), value.end(), mxGetLogicals(array));
1307template <
typename Container>
1310 mxArray* array = mxCreateCellMatrix(1,
static_cast<int>(value.size()));
1313 for (
typename Container::const_iterator it = value.begin();
1316 mxArray* new_item =
from(*it);
1317 mxDestroyArray(mxGetCell(array, index));
1318 mxSetCell(array, index++, new_item);
1329template <
typename T>
1336 switch (mxGetClassID(array)) {
1358template <
typename T>
1360 typename std::enable_if<
1362 (!std::is_compound<T>::value ||
1368 mwSize array_size =
static_cast<mwSize
>(mxGetNumberOfElements(array));
1369 value->resize(array_size);
1370 for (
size_t i = 0; i < array_size; ++i) {
1371 const mxArray* element = mxGetCell(array, i);
1382template <
typename T>
1384 typename std::enable_if<
1390 MEXPLUS_ASSERT(
static_cast<size_t>(index) < mxGetNumberOfElements(array),
1391 "Index out of range: %u.",
1393 switch (mxGetClassID(array)) {
1409 MEXPLUS_ASSERT(
true,
"Cannot convert %s", mxGetClassName(array));
1413template <
typename T>
1415 typename std::enable_if<
1416 std::is_compound<T>::value &&
1420 MEXPLUS_ASSERT(
static_cast<size_t>(index) < mxGetNumberOfElements(array),
1421 "Index out of range: %u.",
1424 const mxArray* element = mxGetCell(array, index);
1425 to<T>(element, value);
1428template <
typename T>
1430 const std::string& field,
1435 MEXPLUS_ASSERT(
static_cast<size_t>(index) < mxGetNumberOfElements(array),
1436 "Index out of range: %u.",
1439 const mxArray* element = mxGetField(array, index, field.c_str());
1440 MEXPLUS_ASSERT(element,
"Invalid field name %s.", field.c_str());
1441 to<T>(element, value);
1450template <
typename T>
1453 const typename std::enable_if<
1454 !std::is_compound<T>::value ||
1457 MEXPLUS_ASSERT(
static_cast<size_t>(index) < mxGetNumberOfElements(array),
1458 "Index out of range: %u.",
1460 switch (mxGetClassID(array)) {
1473 case mxCELL_CLASS: {
1474 mxArray* new_item =
from(value);
1476 mxDestroyArray(mxGetCell(array, index));
1477 mxSetCell(array, index, new_item);
1481 MEXPLUS_ERROR(
"Cannot assign to %s array.", mxGetClassName(array));
1487template <
typename T>
1490 const typename std::enable_if<
1493 MEXPLUS_ASSERT(
static_cast<size_t>(index) < mxGetNumberOfElements(array),
1494 "Index out of range: %u.",
1497 mxArray* new_item =
from(value);
1498 mxDestroyArray(mxGetCell(array, index));
1499 mxSetCell(array, index, new_item);
1502template <
typename T>
1504 const std::string& field,
1508 MEXPLUS_ASSERT(
static_cast<size_t>(index) < mxGetNumberOfElements(array),
1509 "Index out of range: %u.",
1512 int field_number = mxGetFieldNumber(array, field.c_str());
1513 if (field_number < 0) {
1514 field_number = mxAddField(array, field.c_str());
1516 "Failed to create a field '%s'",
1519 mxArray* new_item =
from(value);
1520 mxDestroyArray(mxGetFieldByNumber(array, index, field_number));
1521 mxSetFieldByNumber(array, index, field_number, new_item);
1524template <
typename T>
1526 typedef typename std::enable_if<
1528 mxArray* numeric = mxCreateNumericMatrix(
rows,
1536template <
typename T>
1538 typedef typename std::enable_if<
1540 mxArray* numeric = mxCreateNumericArray(dims.size(),
1548template <
typename T>
1552 "Expected a %s array.",
1554 return reinterpret_cast<T*
>(mxGetData(
array_));
1557template <
typename T>
1561 "Expected a %s array.",
1563 return reinterpret_cast<T*
>(mxGetPi(
array_));
1566template <
typename T>
1571template <
typename T>
1576template <
typename T>
1581template <
typename T>
mxArray object wrapper for data conversion and manipulation.
Definition mxarray.h:101
std::vector< std::string > fieldNames() const
Get field names of a struct array.
Definition mxarray.h:599
MxArray()
Empty MxArray constructor.
Definition mxarray.h:105
bool isOwner() const
Return true if owner.
Definition mxarray.h:231
T * getImagData() const
Get raw data pointer to imaginary part.
Definition mxarray.h:1558
mwSize size() const
Number of elements in an array.
Definition mxarray.h:564
void set(const std::string &field, mxArray *value, mwIndex index=0)
Struct element write accessor.
Definition mxarray.h:526
static void to(const mxArray *array, T *value)
mxArray* exporter methods.
Definition mxarray.h:315
void reset(mxArray *array)
Reset an mxArray.
Definition mxarray.h:193
mxArray * clone() const
Clone mxArray.
Definition mxarray.h:212
static void assignCharTo(const mxArray *array, mwIndex index, typename std::enable_if< !std::is_signed< R >::value, R >::type *value)
Explicit char (unsigned) element assignment.
Definition mxarray.h:977
static void assignTo(const mxArray *array, mwIndex index, typename std::enable_if< MxComplexType< R >::value, R >::type *value)
Explicit complex element assignment.
Definition mxarray.h:945
mxChar * getChars() const
Definition mxarray.h:547
static void assignStringTo(const mxArray *array, typename std::enable_if< !std::is_signed< typename R::value_type >::value, R >::type *value)
Explicit char (unsigned) array assignment.
Definition mxarray.h:1063
bool isInt8() const
Determine whether array represents data as signed 8-bit integers.
Definition mxarray.h:672
bool isFromGlobalWS() const
Determine whether array was copied from MATLAB global workspace.
Definition mxarray.h:666
static bool IsFinite(double value)
Determine whether input is finite.
Definition mxarray.h:663
static mxArray * Logical(int rows=1, int columns=1)
Create a new logical matrix.
Definition mxarray.h:249
T at(mwIndex index) const
Template for element accessor.
Definition mxarray.h:421
static void assignStringTo(const mxArray *array, typename std::enable_if< std::is_signed< typename R::value_type >::value, R >::type *value)
Explicit char (signed) array assignment.
Definition mxarray.h:1050
mwIndex subscriptIndex(mwIndex row, mwIndex column) const
Offset from first element to desired element.
Definition mxarray.h:614
static T at(const mxArray *array, mwIndex index)
mxArray* element reader methods.
Definition mxarray.h:327
static void at(const mxArray *array, const std::string &field, T *value, mwIndex index=0)
Definition mxarray.h:342
const mxArray * at(mwIndex index) const
Definition mxarray.h:430
static mxArray * from(const T &value)
mxArray* importer methods.
Definition mxarray.h:300
bool isNumeric() const
Determine whether array is numeric.
Definition mxarray.h:695
static void assignCharTo(const mxArray *array, mwIndex index, typename std::enable_if< std::is_signed< R >::value, R >::type *value)
Explicit char (signed) element assignment.
Definition mxarray.h:964
bool isLogical() const
Determine whether array is of type mxLogical.
Definition mxarray.h:684
static void assignCharFrom(mxArray *array, mwIndex index, const typename std::enable_if< MxComplexType< T >::value, T >::type &value)
Definition mxarray.h:1161
static void atInternal(const mxArray *array, mwIndex index, typename std::enable_if< MxComplexOrArithmeticType< T >::value||MxLogicalType< T >::value||MxCharType< T >::value, T >::type *value)
Templated mxArray getters
Definition mxarray.h:1383
static void toInternal(const mxArray *array, typename std::enable_if< MxArithmeticType< T >::value||MxComplexType< T >::value||MxLogicalType< T >::value||MxCharType< T >::value, T >::type *value)
Templated mxArray exporters
Definition mxarray.h:818
static void assignFrom(mxArray *array, mwIndex index, const typename std::enable_if< MxComplexType< T >::value, T >::type &value)
Explicit complex element assignment.
Definition mxarray.h:1111
static void set(mxArray *array, const std::string &field, const T &value, mwIndex index=0)
Definition mxarray.h:372
T to() const
Convert MxArray to a specified type.
Definition mxarray.h:402
bool isVector() const
Determine whether input is vector array.
Definition mxarray.h:637
mwSize dimensionSize() const
Number of dimensions.
Definition mxarray.h:569
bool isInt16() const
Determine whether array represents data as signed 16-bit integers.
Definition mxarray.h:675
static void assignCellTo(const mxArray *array, mwIndex index, T *value)
Explicit cell element assignment.
Definition mxarray.h:988
bool hasField(const std::string &field_name, mwIndex index=0) const
Determine whether a struct array has a specified field.
Definition mxarray.h:720
MxArray(const mxArray *array)
MxArray constructor from const mxArray*.
Definition mxarray.h:131
static double Eps()
Value of EPS.
Definition mxarray.h:740
void set(const std::string &field, const T &value, mwIndex index=0)
Struct element write accessor.
Definition mxarray.h:517
std::vector< mwSize > dimensions() const
Array of each dimension.
Definition mxarray.h:574
static void assignCellTo(const mxArray *array, T *value)
Explicit cell array assignment.
Definition mxarray.h:1073
static void setInternal(mxArray *array, mwIndex index, const typename std::enable_if< !std::is_compound< T >::value||MxComplexType< T >::value, T >::type &value)
Templated mxArray element setters
Definition mxarray.h:1451
static T to(const mxArray *array)
Definition mxarray.h:319
MxArray(mxArray *array)
MxArray constructor from mutable mxArray*.
Definition mxarray.h:137
MxArray(const T &value)
MxArray constructor from scalar.
Definition mxarray.h:153
mxArray * getMutable()
Get raw mxArray*.
Definition mxarray.h:225
bool owner_
Flag to enable resource management.
Definition mxarray.h:1175
const mxArray * get() const
Conversion to const mxArray*.
Definition mxarray.h:221
static void assignTo(const mxArray *array, mwIndex index, typename std::enable_if< std::is_floating_point< R >::value, R >::type *value)
Explicit floating point element assignment.
Definition mxarray.h:927
mwSize cols() const
Number of columns in an array.
Definition mxarray.h:583
static mxArray * from(const char *value)
Definition mxarray.h:301
int elementSize() const
Element size.
Definition mxarray.h:726
MxArray & operator=(const MxArray &rhs)
Copy assignment operator is prohibited.
std::string fieldName(int index) const
Get field name of a struct array.
Definition mxarray.h:591
static const mxArray * at(const mxArray *array, mwIndex index)
Definition mxarray.h:336
static bool IsInf(double value)
Determine whether input is infinite.
Definition mxarray.h:669
mwSize nonZeroMax() const
Number of elements in IR, PR, and PI arrays.
Definition mxarray.h:608
const mxArray * at(const std::string &field, mwIndex index=0) const
Definition mxarray.h:461
mxClassID classID() const
Class ID of mxArray.
Definition mxarray.h:556
mxLogical * getLogicals() const
Definition mxarray.h:540
bool isInt64() const
Determine whether array represents data as signed 64-bit integers.
Definition mxarray.h:681
bool isDouble() const
Determine whether mxArray represents data as double-precision, floating-point numbers.
Definition mxarray.h:657
bool isStruct() const
Determine whether input is structure array.
Definition mxarray.h:705
bool isUint8() const
Determine whether array represents data as unsigned 8-bit integers.
Definition mxarray.h:708
void set(const std::vector< mwIndex > &subscripts, mxArray *value)
Cell element write accessor.
Definition mxarray.h:507
mwIndex subscriptIndex(const std::vector< mwIndex > &subscripts) const
Offset from first element to desired element.
Definition mxarray.h:624
static void assignTo(const mxArray *array, mwIndex index, typename std::enable_if< std::is_integral< R >::value, R >::type *value)
Assignment helpers (for MxArray.to<type>(value))
Definition mxarray.h:912
T at(const std::string &field, mwIndex index=0) const
Struct element accessor.
Definition mxarray.h:452
int fieldSize() const
Number of fields in a struct array.
Definition mxarray.h:586
static const mxArray * at(const mxArray *array, const std::string &field, mwIndex index=0)
Definition mxarray.h:348
bool isInt32() const
Determine whether array represents data as signed 32-bit integers.
Definition mxarray.h:678
static void at(const mxArray *array, mwIndex index, T *value)
Definition mxarray.h:333
void to(T *value) const
Definition mxarray.h:408
static void assignTo(const mxArray *array, typename std::enable_if< MxArithmeticCompound< R >::value||MxLogicalCompound< R >::value||MxCharCompound< R >::value, R >::type *value)
Explicit numeric array assignment.
Definition mxarray.h:1000
void set(mwIndex row, mwIndex column, mxArray *value)
Cell element write accessor.
Definition mxarray.h:499
const std::string className() const
Class name of mxArray.
Definition mxarray.h:559
bool isUint16() const
Determine whether array represents data as unsigned 16-bit integers.
Definition mxarray.h:711
static void assignTo(const mxArray *array, typename std::enable_if< MxComplexCompound< R >::value, R >::type *value)
Explicit complex array assigment.
Definition mxarray.h:1027
void set(mwIndex index, const T &value)
Template for element write accessor.
Definition mxarray.h:470
mxArray * release()
Release managed mxArray* pointer, or clone if not owner.
Definition mxarray.h:202
static double Inf()
Value of infinity.
Definition mxarray.h:734
static void assignCharFrom(mxArray *array, mwIndex index, const typename std::enable_if< std::is_integral< T >::value &&!std::is_signed< T >::value, T >::type &value)
Definition mxarray.h:1150
static double NaN()
Value of NaN (Not-a-Number).
Definition mxarray.h:737
void set(mwIndex index, mxArray *value)
Cell element write accessor.
Definition mxarray.h:490
static mxArray * fromInternal(const typename std::enable_if< MxArithmeticType< T >::value, T >::type &value)
Templated mxArray importers
Definition mxarray.h:1185
static void set(mxArray *array, mwIndex index, mxArray *value)
Definition mxarray.h:361
static mxArray * Struct(int nfields=0, const char **fields=NULL, int rows=1, int columns=1)
Generic constructor for a struct matrix.
Definition mxarray.h:286
MxArray(const MxArray &array)
Copy constructor is prohibited except internally.
bool isChar() const
Determine whether input is string array.
Definition mxarray.h:634
static void assignCharFrom(mxArray *array, mwIndex index, const typename std::enable_if< std::is_integral< T >::value &&std::is_signed< T >::value, T >::type &value)
Definition mxarray.h:1139
void at(const std::string &field, T *value, mwIndex index=0) const
Definition mxarray.h:458
bool isUint64() const
Determine whether array represents data as unsigned 64-bit integers.
Definition mxarray.h:717
bool isUint32() const
Determine whether array represents data as unsigned 32-bit integers.
Definition mxarray.h:714
void reset(const mxArray *array=NULL)
Reset an mxArray to a const mxArray*.
Definition mxarray.h:185
static mxArray * Cell(int rows=1, int columns=1)
Create a new cell matrix.
Definition mxarray.h:266
bool isSparse() const
Determine whether input is sparse array.
Definition mxarray.h:702
bool isIntegral(const char *name) const
Determine whether array is integral type.
Definition mxarray.h:643
static bool IsNaN(double value)
Determine whether input is NaN (Not-a-Number).
Definition mxarray.h:731
bool isLogicalScalarTrue() const
Determine whether scalar array of type mxLogical is true.
Definition mxarray.h:690
bool isEmpty() const
Determine whether array is empty.
Definition mxarray.h:660
MxArray & operator=(std::nullptr_t)
NULL assignment.
Definition mxarray.h:108
static void assignCharFrom(mxArray *array, mwIndex index, const typename std::enable_if< std::is_floating_point< T >::value, T >::type &value)
Definition mxarray.h:1129
virtual ~MxArray()
Destructor.
Definition mxarray.h:156
bool isComplex() const
Determine whether data is complex.
Definition mxarray.h:653
mwSize rows() const
Number of rows in an array.
Definition mxarray.h:580
static void set(mxArray *array, const std::string &field, mxArray *value, mwIndex index=0)
Definition mxarray.h:378
static mxArray * Numeric(int rows=1, int columns=1)
Create a new numeric (real or complex) matrix.
Definition mxarray.h:1525
static mxArray * from(int32_t value)
Definition mxarray.h:306
MxArray(MxArray &&array) NOEXCEPT
Move constructor.
Definition mxarray.h:114
void swap(MxArray &rhs)
Swap operation.
Definition mxarray.h:162
static void assignFrom(mxArray *array, mwIndex index, const typename std::enable_if< MxArithmeticType< T >::value||MxCharType< T >::value, T >::type &value)
Assignment helpers (for MxArray.set<type>(i, value))
Definition mxarray.h:1094
bool isCell() const
Determine whether input is cell array.
Definition mxarray.h:631
mxArray * array_
Pointer to the mxArray C object.
Definition mxarray.h:1172
bool isClass(const char *name) const
Determine whether array is member of specified class.
Definition mxarray.h:648
bool isSingle() const
Determine whether array represents data as single-precision, floating-point numbers.
Definition mxarray.h:699
static void set(mxArray *array, mwIndex index, const T &value)
mxArray* element writer methods.
Definition mxarray.h:358
T * getData() const
Get raw data pointer.
Definition mxarray.h:1549
bool isLogicalScalar() const
Determine whether scalar array is of type mxLogical.
Definition mxarray.h:687
void at(mwIndex index, T *value) const
Definition mxarray.h:427
#define NOEXCEPT
Definition mxarray.h:87
#define MEXPLUS_ASSERT(condition,...)
Definition mxarray.h:76
#define MEXPLUS_CHECK_NOTNULL(pointer)
MxArray data conversion library.
Definition mxarray.h:66
#define MEXPLUS_ERROR(...)
Definition mxarray.h:74
MEX function arguments helper library.
Definition arguments.h:40
Traits for mxArray.
Definition mxtypes.h:82