@@ -261,6 +261,154 @@ class extractor : public argument_helper<const mxArray> {
261
261
return vals;
262
262
}
263
263
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 (" \t Empty 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
+
264
412
private:
265
413
};
266
414
0 commit comments