Skip to content

Commit e22d44b

Browse files
committed
Merge pull request #81 from asobolev/tmp2
refactoring to array_to_nix step 1
2 parents edbd958 + 304c93b commit e22d44b

File tree

3 files changed

+99
-19
lines changed

3 files changed

+99
-19
lines changed

src/utils/arguments.h

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -62,28 +62,22 @@ 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

73-
template<typename T>
74-
T num(size_t pos) const {
75-
nix::DataType dtype = nix::to_data_type<T>::value;
76-
check_arg_type(pos, dtype);
77-
78-
if (mxGetNumberOfElements(array[pos]) < 1) {
79-
throw std::runtime_error("array empty");
80-
}
68+
template<typename T>
69+
T num(size_t pos) const {
70+
check_arg_type(pos, nix::to_data_type<T>::value);
8171

82-
const void *data = mxGetData(array[pos]);
83-
T res;
84-
memcpy(&res, data, sizeof(T));
85-
return res;
86-
}
72+
if (mxGetNumberOfElements(array[pos]) < 1) {
73+
throw std::runtime_error("array empty");
74+
}
75+
76+
const void *data = mxGetData(array[pos]);
77+
T res;
78+
memcpy(&res, data, sizeof(T));
79+
return res;
80+
}
8781

8882
template<typename T>
8983
std::vector<T> vec(size_t pos) const {
@@ -131,6 +125,21 @@ class extractor : public argument_helper<const mxArray> {
131125
return res;
132126
}
133127

128+
std::vector<nix::Value> vec(size_t pos) const {
129+
mwSize size = mxGetNumberOfElements(array[pos]);
130+
131+
mwIndex index;
132+
std::vector<nix::Value> vals;
133+
const mxArray *cell_element_ptr;
134+
135+
for (index = 0; index < size; index++) {
136+
cell_element_ptr = mxGetCell(array[pos], index);
137+
vals.push_back(mx_array_to_value(cell_element_ptr));
138+
}
139+
140+
return vals;
141+
}
142+
134143
nix::NDSize ndsize(size_t pos) const {
135144
return mx_array_to_ndsize(array[pos]);
136145
}

src/utils/nix2mx.cc

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,15 @@
99
#include "handle.h"
1010
#include "arguments.h"
1111
#include "struct.h"
12+
#include "datatypes.h"
1213

1314

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+
1421
mxArray *nmCreateScalar(uint32_t val) {
1522
mxArray *arr = mxCreateNumericMatrix(1, 1, mxUINT32_CLASS, mxREAL);
1623
void *data = mxGetData(arr);
@@ -72,3 +79,55 @@ nix::NDSize mx_array_to_ndsize(const mxArray *arr) {
7279
return size;
7380
}
7481

82+
std::string mx_array_to_str(const mxArray *arr) {
83+
check_arg_type(arr, nix::DataType::String);
84+
85+
std::string the_string = mxArrayToString(arr);
86+
return the_string;
87+
}
88+
89+
template<typename T>
90+
T mx_array_to_num(const mxArray *arr) {
91+
check_arg_type(arr, nix::to_data_type<T>::value);
92+
93+
if (mxGetNumberOfElements(arr) < 1) {
94+
throw std::runtime_error("array empty");
95+
}
96+
97+
const void *data = mxGetData(arr);
98+
T res;
99+
memcpy(&res, data, sizeof(T));
100+
return res;
101+
}
102+
103+
bool mx_array_to_bool(const mxArray *arr) {
104+
check_arg_type(arr, nix::DataType::Bool);
105+
106+
const mxLogical *l = mxGetLogicals(arr);
107+
return l[0];
108+
}
109+
110+
nix::Value mx_array_to_value(const mxArray *arr) {
111+
nix::Value val;
112+
113+
switch (mxGetClassID(arr)) {
114+
case mxLOGICAL_CLASS: val.set(mx_array_to_bool(arr)); break;
115+
case mxCHAR_CLASS: val.set(mx_array_to_str(arr)); break;
116+
case mxDOUBLE_CLASS: val.set(mx_array_to_num<double>(arr)); break;
117+
case mxUINT32_CLASS: val.set(mx_array_to_num<uint32_t>(arr)); break;
118+
case mxINT32_CLASS: val.set(mx_array_to_num<int32_t>(arr)); break;
119+
case mxUINT64_CLASS: val.set(mx_array_to_num<uint64_t>(arr)); break;
120+
case mxINT64_CLASS: val.set(mx_array_to_num<int64_t>(arr)); break;
121+
122+
case mxSINGLE_CLASS: throw std::invalid_argument("Element type is not supported");
123+
case mxUINT8_CLASS: throw std::invalid_argument("Element type is not supported");
124+
case mxINT8_CLASS: throw std::invalid_argument("Element type is not supported");
125+
case mxUINT16_CLASS: throw std::invalid_argument("Element type is not supported");
126+
case mxINT16_CLASS: throw std::invalid_argument("Element type is not supported");
127+
128+
default: throw std::invalid_argument("Element type is not recognized");
129+
}
130+
131+
return val;
132+
}
133+

src/utils/nix2mx.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,21 @@
33

44
#include "mex.h"
55
#include <nix.hpp>
6+
#include "datatypes.h"
7+
8+
void check_arg_type(const mxArray *arr, nix::DataType dtype);
69

710
nix::NDSize mx_array_to_ndsize(const mxArray *arr);
811

12+
std::string mx_array_to_str(const mxArray *arr);
13+
14+
template<typename T>
15+
T mx_array_to_num(const mxArray *arr);
16+
17+
bool mx_array_to_bool(const mxArray *arr);
18+
19+
nix::Value mx_array_to_value(const mxArray *arr);
20+
921
mxArray *nmCreateScalar(uint32_t val);
1022

1123
mxArray *dim_to_struct(nix::SetDimension dim);

0 commit comments

Comments
 (0)