12
12
#include " datatypes.h"
13
13
14
14
15
+ void check_arg_type (const mxArray *arr, nix::DataType dtype) {
16
+ if (dtype_mex2nix (arr) != dtype) {
17
+ throw std::invalid_argument (" wrong type" );
18
+ }
19
+ }
20
+
15
21
mxArray *nmCreateScalar (uint32_t val) {
16
22
mxArray *arr = mxCreateNumericMatrix (1 , 1 , mxUINT32_CLASS, mxREAL);
17
23
void *data = mxGetData (arr);
@@ -73,13 +79,18 @@ nix::NDSize mx_array_to_ndsize(const mxArray *arr) {
73
79
return size;
74
80
}
75
81
82
+ std::string mx_array_to_str (const mxArray *arr) {
83
+ check_arg_type (arr, nix::DataType::String);
84
+
85
+ char *tmp = mxArrayToString (arr);
86
+ std::string the_string (tmp);
87
+ mxFree (tmp);
88
+ return the_string;
89
+ }
90
+
76
91
template <typename T>
77
92
T mx_array_to_num (const mxArray *arr) {
78
- nix::DataType dtype = nix::to_data_type<T>::value;
79
-
80
- if (dtype_mex2nix (arr) != dtype) {
81
- throw std::invalid_argument (" wrong type" );
82
- }
93
+ check_arg_type (arr, nix::to_data_type<T>::value);
83
94
84
95
if (mxGetNumberOfElements (arr) < 1 ) {
85
96
throw std::runtime_error (" array empty" );
@@ -91,26 +102,31 @@ T mx_array_to_num(const mxArray *arr) {
91
102
return res;
92
103
}
93
104
105
+ bool mx_array_to_bool (const mxArray *arr) {
106
+ check_arg_type (arr, nix::DataType::Bool);
107
+
108
+ const mxLogical *l = mxGetLogicals (arr);
109
+ return l[0 ];
110
+ }
111
+
94
112
nix::Value mx_array_to_value (const mxArray *arr) {
95
113
nix::Value val;
96
114
97
115
switch (mxGetClassID (arr)) {
98
- case mxLOGICAL_CLASS: val.set (mx_array_to_num<bool >(arr)); break ;
99
-
100
- case mxCHAR_CLASS: val.set (mx_array_to_num<std::string>(arr)); break ;
101
-
116
+ case mxLOGICAL_CLASS: val.set (mx_array_to_bool (arr)); break ;
117
+ case mxCHAR_CLASS: val.set (mx_array_to_str (arr)); break ;
102
118
case mxDOUBLE_CLASS: val.set (mx_array_to_num<double >(arr)); break ;
103
- case mxSINGLE_CLASS: val.set (mx_array_to_num<float >(arr)); break ;
104
-
105
- case mxUINT8_CLASS: val.set (mx_array_to_num<uint8_t >(arr)); break ;
106
- case mxINT8_CLASS: val.set (mx_array_to_num<int8_t >(arr)); break ;
107
- case mxUINT16_CLASS: val.set (mx_array_to_num<uint16_t >(arr)); break ;
108
- case mxINT16_CLASS: val.set (mx_array_to_num<int16_t >(arr)); break ;
109
119
case mxUINT32_CLASS: val.set (mx_array_to_num<uint32_t >(arr)); break ;
110
120
case mxINT32_CLASS: val.set (mx_array_to_num<int32_t >(arr)); break ;
111
121
case mxUINT64_CLASS: val.set (mx_array_to_num<uint64_t >(arr)); break ;
112
122
case mxINT64_CLASS: val.set (mx_array_to_num<int64_t >(arr)); break ;
113
123
124
+ case mxSINGLE_CLASS: throw std::invalid_argument (" Element type is not supported" );
125
+ case mxUINT8_CLASS: throw std::invalid_argument (" Element type is not supported" );
126
+ case mxINT8_CLASS: throw std::invalid_argument (" Element type is not supported" );
127
+ case mxUINT16_CLASS: throw std::invalid_argument (" Element type is not supported" );
128
+ case mxINT16_CLASS: throw std::invalid_argument (" Element type is not supported" );
129
+
114
130
default : throw std::invalid_argument (" Element type is not recognized" );
115
131
}
116
132
0 commit comments