root/library/bdm/mex/mex_parser.h @ 388

Revision 388, 3.4 kB (checked in by smidl, 15 years ago)

mergers

Line 
1#include "../../bdm/libconfig/libconfig.h++"
2#include <itpp/itbase.h>
3#include <itpp/itmex.h>
4#include <stdlib.h>
5
6using namespace itpp;
7using namespace std;
8using namespace libconfig;
9
10class UImxArray : public Config {
11public:
12        UImxArray(const mxArray *mxarray) : Config() {
13                Setting & setting = this->getRoot(); //setting is a group
14                if (!mxIsStruct(mxarray)) { mexErrMsgTxt("Given mxArray is not a struct."); };
15                //mexCallMATLAB(0, NULL, 1, (mxArray **) &mxarray, "dump");
16                fillGroup(setting, mxarray);
17                setAutoConvert(true);
18        }
19        UImxArray() : Config() {               
20                setAutoConvert(true);
21        }       
22        void addList(const mxArray *mxarray, const char* name){
23                Setting & setting = this->getRoot(); //setting is a group
24                Setting & child = setting.add(name,Setting::TypeList);
25                fillList(child,mxarray);
26        }
27private:
28        void storeNumeric(Setting &setting, const mxArray *value, string key = "") {
29                //TODO: integer matrices
30                if (!mxIsNumeric(value)) { mexErrMsgTxt("Given mxArray is not numeric."); };
31                mat val = mxArray2mat(value);
32                if ((val.rows() == 1) && (val.cols() == 1)) {
33                        Setting &child = (key=="") ? setting.add(Setting::TypeFloat)
34                                                   : setting.add(key, Setting::TypeFloat);
35                        child = val(0,0);
36                } else {
37                        Setting &child = (key=="") ? setting.add(Setting::TypeList)
38                                                   : setting.add(key, Setting::TypeList);
39                        Setting &label = child.add(Setting::TypeString);
40                        label = "matrix";
41                        Setting &cols = child.add( Setting::TypeInt );
42                        Setting &rows = child.add( Setting::TypeInt );
43                        Setting &elements = child.add( Setting::TypeArray );
44                        cols = val.cols();
45                        rows = val.rows();
46                        for (int i=0; i<val.rows(); i++) {
47                                for (int j=0; j<val.cols(); j++) {
48                                        Setting &el = elements.add(Setting::TypeFloat);
49                                        el = val(i,j);
50                                }
51                        }
52                }
53        }
54
55        void fillGroup(Setting &setting, const mxArray *mxarray) {
56                if (!mxIsStruct(mxarray)) { mexErrMsgTxt("Given mxArray is not a struct."); };
57                for(int i=0; i < mxGetNumberOfFields(mxarray); i++) {
58                        const char *key = mxGetFieldNameByNumber(mxarray, i);
59                        mxArray *value = mxGetField(mxarray, 0, key);
60                        if (mxIsChar(value)) {
61                                Setting &child = setting.add(key, Setting::TypeString);
62                                child = mxArray2string(value);
63                        }
64                        if (mxIsLogical(value)) {
65                                Setting &child = setting.add(key, Setting::TypeBoolean);
66                                child = (bool) mxArray2bin(value);
67                        }
68                        if (mxIsStruct(value)) {
69                                Setting &child = setting.add(key, Setting::TypeGroup);
70                                fillGroup(child, value);
71                        }
72                        if (mxIsCell(value)) {
73                                Setting &child = setting.add(key, Setting::TypeList);
74                                fillList(child, value);
75                        }
76                        if (mxIsNumeric(value)) {
77                                storeNumeric(setting, value, (string)key);
78                        }
79                }
80        }
81       
82        void fillList(Setting &setting, const mxArray *mxarray) {
83                if (!mxIsCell(mxarray)) { mexErrMsgTxt("Given mxArray is not a cell."); };
84                for(int i=0; i < mxGetNumberOfElements(mxarray); i++) {
85                        mxArray *value = mxGetCell(mxarray, i);
86                        if (mxIsChar(value)) {
87                                Setting &child = setting.add(Setting::TypeString);
88                                child = mxArray2string(value);
89                        }
90                        if (mxIsLogical(value)) {
91                                Setting &child = setting.add(Setting::TypeBoolean);
92                                child = (bool) mxArray2bin(value);
93                        }
94                        if (mxIsStruct(value)) {
95                                Setting &child = setting.add(Setting::TypeGroup);
96                                fillGroup(child, value);
97                        }
98                        if (mxIsCell(value)) {
99                                Setting &child = setting.add(Setting::TypeList);
100                                fillList(child, value);
101                        }
102                        if (mxIsNumeric(value)) {
103                                storeNumeric(setting, value);
104                        }
105                }
106        }
107};
Note: See TracBrowser for help on using the browser.