Skip to content

Commit b28feaf

Browse files
committed
array_to_nix refactoring step 2
1 parent 871b67f commit b28feaf

File tree

3 files changed

+47
-24
lines changed

3 files changed

+47
-24
lines changed

src/utils/arguments.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,20 +62,21 @@ class extractor : public argument_helper<const mxArray> {
6262
extractor(const mxArray **arr, int n) : argument_helper(arr, n) { }
6363

6464
std::string str(size_t pos) const {
65-
check_arg_type(pos, nix::DataType::String);
66-
67-
char *tmp = mxArrayToString(array[pos]);
68-
std::string the_string(tmp);
69-
mxFree(tmp);
70-
return the_string;
65+
return mx_array_to_str(array[pos]);
7166
}
7267

7368
template<typename T>
7469
T num(size_t pos) const {
75-
nix::DataType dtype = nix::to_data_type<T>::value;
76-
check_arg_type(pos, dtype);
70+
check_arg_type(pos, nix::to_data_type<T>::value);
71+
72+
if (mxGetNumberOfElements(array[pos]) < 1) {
73+
throw std::runtime_error("array empty");
74+
}
7775

78-
return mx_array_to_num<T>(array[pos]);
76+
const void *data = mxGetData(array[pos]);
77+
T res;
78+
memcpy(&res, data, sizeof(T));
79+
return res;
7980
}
8081

8182
template<typename T>

src/utils/nix2mx.cc

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212
#include "datatypes.h"
1313

1414

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+
1521
mxArray *nmCreateScalar(uint32_t val) {
1622
mxArray *arr = mxCreateNumericMatrix(1, 1, mxUINT32_CLASS, mxREAL);
1723
void *data = mxGetData(arr);
@@ -73,13 +79,18 @@ nix::NDSize mx_array_to_ndsize(const mxArray *arr) {
7379
return size;
7480
}
7581

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+
7691
template<typename T>
7792
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);
8394

8495
if (mxGetNumberOfElements(arr) < 1) {
8596
throw std::runtime_error("array empty");
@@ -91,26 +102,31 @@ T mx_array_to_num(const mxArray *arr) {
91102
return res;
92103
}
93104

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+
94112
nix::Value mx_array_to_value(const mxArray *arr) {
95113
nix::Value val;
96114

97115
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;
102118
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;
109119
case mxUINT32_CLASS: val.set(mx_array_to_num<uint32_t>(arr)); break;
110120
case mxINT32_CLASS: val.set(mx_array_to_num<int32_t>(arr)); break;
111121
case mxUINT64_CLASS: val.set(mx_array_to_num<uint64_t>(arr)); break;
112122
case mxINT64_CLASS: val.set(mx_array_to_num<int64_t>(arr)); break;
113123

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+
114130
default: throw std::invalid_argument("Element type is not recognized");
115131
}
116132

src/utils/nix2mx.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,17 @@
55
#include <nix.hpp>
66
#include "datatypes.h"
77

8+
void check_arg_type(const mxArray *arr, nix::DataType dtype);
9+
810
nix::NDSize mx_array_to_ndsize(const mxArray *arr);
911

12+
std::string mx_array_to_str(const mxArray *arr);
13+
1014
template<typename T>
1115
T mx_array_to_num(const mxArray *arr);
1216

17+
bool mx_array_to_bool(const mxArray *arr);
18+
1319
nix::Value mx_array_to_value(const mxArray *arr);
1420

1521
mxArray *nmCreateScalar(uint32_t val);

0 commit comments

Comments
 (0)