Skip to content

Commit c7371d1

Browse files
committed
draft write values
1 parent 92ca863 commit c7371d1

File tree

5 files changed

+163
-0
lines changed

5 files changed

+163
-0
lines changed

+nix/Property.m

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@
2828
[obj.valuesCache, retVals] = nix.Utils.fetchPropList(obj.updatedAt, ...
2929
'Property::values', obj.nix_handle, obj.valuesCache);
3030
end
31+
32+
function [] = set.values(obj, val)
33+
nix_mx('Property::updateValues', obj.nix_handle, val);
34+
obj.valuesCache.lastUpdate = 0;
35+
end
3136
end
3237

3338
end

nix_mx.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ void mexFunction(int nlhs,
250250
.reg("set_mapping", SETTER(const std::string&, nix::Property, mapping))
251251
.reg("set_none_mapping", SETTER(const boost::none_t, nix::Property, mapping));
252252
methods->add("Property::values", nixproperty::values);
253+
methods->add("Property::updateValues", nixproperty::update_values);
253254

254255
mexAtExit(on_exit);
255256
});

src/nixproperty.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,11 @@ namespace nixproperty {
5151
output.set(0, lst);
5252
}
5353

54+
void update_values(const extractor &input, infusor &output)
55+
{
56+
nix::Property prop = input.entity<nix::Property>(1);
57+
std::vector<nix::Value> getVals = input.extractFromStruct(2);
58+
prop.values(getVals);
59+
}
60+
5461
} // namespace nixproperty

src/nixproperty.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ namespace nixproperty {
99

1010
void values(const extractor &input, infusor &output);
1111

12+
void update_values(const extractor &input, infusor &output);
13+
1214
} // namespace nixproperty
1315

1416
#endif

src/utils/arguments.h

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,154 @@ class extractor : public argument_helper<const mxArray> {
261261
return vals;
262262
}
263263

264+
std::vector<nix::Value> extractFromStruct(size_t pos) const {
265+
266+
mwSize total_num_of_cells;
267+
mwIndex index;
268+
const mxArray *cell_element_ptr;
269+
270+
std::vector<nix::Value> vals;
271+
272+
total_num_of_cells = mxGetNumberOfElements(array[pos]);
273+
for (index = 0; index<total_num_of_cells; index++) {
274+
cell_element_ptr = mxGetCell(array[pos], index);
275+
276+
if (mxGetClassID(cell_element_ptr) == mxSTRUCT_CLASS){
277+
278+
nix::Value currVal;
279+
280+
mwSize total_num_of_elements;
281+
mwIndex struct_idx;
282+
int number_of_fields;
283+
int field_index;
284+
285+
total_num_of_elements = mxGetNumberOfElements(cell_element_ptr);
286+
number_of_fields = mxGetNumberOfFields(cell_element_ptr);
287+
288+
mexPrintf("numEl: %d, numField: %d\n", total_num_of_elements, number_of_fields);
289+
290+
for (struct_idx = 0; struct_idx < total_num_of_elements; struct_idx++) {
291+
for (field_index = 0; field_index < number_of_fields; field_index++) {
292+
const char *field_name;
293+
const mxArray *field_array_ptr;
294+
field_name = mxGetFieldNameByNumber(cell_element_ptr, field_index);
295+
field_array_ptr = mxGetFieldByNumber(cell_element_ptr, struct_idx, field_index);
296+
mexPrintf("\n.%s, %d, %d\n", field_name, struct_idx, field_index);
297+
if (field_array_ptr == NULL) {
298+
mexPrintf("\tEmpty Field\n");
299+
}
300+
else
301+
{
302+
if (strcmp(field_name, "value") == 0){
303+
mexPrintf("class: %d\n", mxGetClassID(field_array_ptr));
304+
mexPrintf("1 field: %s, value: ", field_name);
305+
if (mxGetClassID(field_array_ptr) == mxDOUBLE_CLASS){
306+
mexPrintf("double\n");
307+
double curr;
308+
const void *data = mxGetData(field_array_ptr);
309+
memcpy(&curr, data, sizeof(double));
310+
currVal.set(curr);
311+
mexPrintf("%d\n", currVal.get<double>());
312+
}
313+
else if (mxGetClassID(field_array_ptr) == mxLOGICAL_CLASS){
314+
mexPrintf("logical\n");
315+
const mxLogical *curr = mxGetLogicals(field_array_ptr);
316+
currVal.set(curr[0]);
317+
}
318+
else if (mxGetClassID(field_array_ptr) == mxCHAR_CLASS){
319+
mexPrintf("string\n");
320+
char *tmp = mxArrayToString(field_array_ptr);
321+
if (*tmp != NULL)
322+
{
323+
std::string curr_string(tmp);
324+
currVal.set(curr_string);
325+
}
326+
mxFree(tmp);
327+
mexPrintf("%s\n", currVal.get<std::string>());
328+
}
329+
else{
330+
mexPrintf("sometyhing else\n");
331+
}
332+
333+
}
334+
else if (strcmp(field_name, "uncertainty") == 0){
335+
mexPrintf("2 field: %s, value: ", field_name);
336+
if (mxGetClassID(field_array_ptr) == mxDOUBLE_CLASS){
337+
double curr;
338+
const void *data = mxGetData(field_array_ptr);
339+
memcpy(&curr, data, sizeof(double));
340+
currVal.uncertainty = curr;
341+
mexPrintf("%d, %d\n", curr, currVal.uncertainty);
342+
}
343+
}
344+
else if (strcmp(field_name, "checksum") == 0){
345+
mexPrintf("3 field: %s, value: \n", field_name);
346+
if (mxGetClassID(field_array_ptr) == mxCHAR_CLASS){
347+
char *tmp = mxArrayToString(field_array_ptr);
348+
if (tmp != NULL)
349+
{
350+
mexPrintf("get %s string, ", field_name);
351+
std::string curr_string(tmp);
352+
mexPrintf("set value %s\n", curr_string);
353+
currVal.checksum = curr_string;
354+
}
355+
mxFree(tmp);
356+
}
357+
}
358+
else if (strcmp(field_name, "encoder") == 0){
359+
mexPrintf("4 field: %s, value: \n", field_name);
360+
if (mxGetClassID(field_array_ptr) == mxCHAR_CLASS){
361+
char *tmp = mxArrayToString(field_array_ptr);
362+
if (tmp != NULL)
363+
{
364+
mexPrintf("get %s string\n", field_name);
365+
std::string curr_string(tmp);
366+
currVal.encoder = curr_string;
367+
}
368+
mxFree(tmp);
369+
}
370+
}
371+
else if (strcmp(field_name, "filename") == 0){
372+
mexPrintf("5 field: %s, value: \n", field_name);
373+
if (mxGetClassID(field_array_ptr) == mxCHAR_CLASS){
374+
char *tmp = mxArrayToString(field_array_ptr);
375+
if (tmp != NULL)
376+
{
377+
mexPrintf("get %s string\n", field_name);
378+
std::string curr_string(tmp);
379+
currVal.filename = curr_string;
380+
}
381+
mxFree(tmp);
382+
}
383+
}
384+
else if (strcmp(field_name, "reference") == 0){
385+
mexPrintf("6 field: %s, value: \n", field_name);
386+
if (mxGetClassID(field_array_ptr) == mxCHAR_CLASS){
387+
char *tmp = mxArrayToString(field_array_ptr);
388+
if (tmp != NULL)
389+
{
390+
mexPrintf("get %s string, set value %s", field_name, tmp);
391+
//std::string curr_string(tmp);
392+
//mexPrintf("set value %s\n", curr_string);
393+
currVal.reference = *tmp;
394+
mexPrintf("get %s string, get value %s", field_name, currVal.reference);
395+
}
396+
mxFree(tmp);
397+
}
398+
}
399+
}
400+
}
401+
}
402+
vals.push_back(currVal);
403+
}
404+
else
405+
{
406+
mexWarnMsgTxt("Unsupported value wrapper type");
407+
}
408+
}
409+
return vals;
410+
}
411+
264412
private:
265413
};
266414

0 commit comments

Comments
 (0)