|
9 | 9 | #include "handle.h"
|
10 | 10 | #include "arguments.h"
|
11 | 11 | #include "struct.h"
|
| 12 | +#include "datatypes.h" |
12 | 13 |
|
13 | 14 |
|
14 | 15 | mxArray *nmCreateScalar(uint32_t val) {
|
@@ -72,3 +73,47 @@ nix::NDSize mx_array_to_ndsize(const mxArray *arr) {
|
72 | 73 | return size;
|
73 | 74 | }
|
74 | 75 |
|
| 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 | + |
0 commit comments