Skip to content

Commit 2aafd93

Browse files
committed
refactoring to mknix step 1
1 parent edbd958 commit 2aafd93

File tree

3 files changed

+67
-8
lines changed

3 files changed

+67
-8
lines changed

src/utils/arguments.h

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,8 @@ class extractor : public argument_helper<const mxArray> {
7474
T num(size_t pos) const {
7575
nix::DataType dtype = nix::to_data_type<T>::value;
7676
check_arg_type(pos, dtype);
77-
78-
if (mxGetNumberOfElements(array[pos]) < 1) {
79-
throw std::runtime_error("array empty");
80-
}
8177

82-
const void *data = mxGetData(array[pos]);
83-
T res;
84-
memcpy(&res, data, sizeof(T));
85-
return res;
78+
return mx_array_to_num<T>(array[pos]);
8679
}
8780

8881
template<typename T>
@@ -131,6 +124,21 @@ class extractor : public argument_helper<const mxArray> {
131124
return res;
132125
}
133126

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

src/utils/nix2mx.cc

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

1314

1415
mxArray *nmCreateScalar(uint32_t val) {
@@ -72,3 +73,47 @@ nix::NDSize mx_array_to_ndsize(const mxArray *arr) {
7273
return size;
7374
}
7475

76+
template<typename T>
77+
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+
}
83+
84+
if (mxGetNumberOfElements(arr) < 1) {
85+
throw std::runtime_error("array empty");
86+
}
87+
88+
const void *data = mxGetData(arr);
89+
T res;
90+
memcpy(&res, data, sizeof(T));
91+
return res;
92+
}
93+
94+
nix::Value mx_array_to_value(const mxArray *arr) {
95+
nix::Value val;
96+
97+
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+
102+
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+
case mxUINT32_CLASS: val.set(mx_array_to_num<uint32_t>(arr)); break;
110+
case mxINT32_CLASS: val.set(mx_array_to_num<int32_t>(arr)); break;
111+
case mxUINT64_CLASS: val.set(mx_array_to_num<uint64_t>(arr)); break;
112+
case mxINT64_CLASS: val.set(mx_array_to_num<int64_t>(arr)); break;
113+
114+
default: throw std::invalid_argument("Element type is not recognized");
115+
}
116+
117+
return val;
118+
}
119+

src/utils/nix2mx.h

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

44
#include "mex.h"
55
#include <nix.hpp>
6+
#include "datatypes.h"
67

78
nix::NDSize mx_array_to_ndsize(const mxArray *arr);
89

10+
template<typename T>
11+
T mx_array_to_num(const mxArray *arr);
12+
13+
nix::Value mx_array_to_value(const mxArray *arr);
14+
915
mxArray *nmCreateScalar(uint32_t val);
1016

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

0 commit comments

Comments
 (0)