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

Revision 392, 3.7 kB (checked in by smidl, 15 years ago)

compilation fixes - UI_build use exceptions now!!!!

Line 
1#include "../base/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        }
27        void addGroup(const mxArray *mxarray, const char* name){
28                Setting & setting = this->getRoot(); //setting is a group
29                Setting & child = setting.add(name,Setting::TypeGroup);
30                fillGroup(child,mxarray);
31        }
32        operator Setting&()
33        {
34                 return getRoot();
35        }
36private:
37        void storeNumeric(Setting &setting, const mxArray *value, string key = "") {
38                //TODO: integer matrices
39                if (!mxIsNumeric(value)) { mexErrMsgTxt("Given mxArray is not numeric."); };
40                mat val = mxArray2mat(value);
41                if ((val.rows() == 1) && (val.cols() == 1)) {
42                        Setting &child = (key=="") ? setting.add(Setting::TypeFloat)
43                                                   : setting.add(key, Setting::TypeFloat);
44                        child = val(0,0);
45                } else {
46                        Setting &child = (key=="") ? setting.add(Setting::TypeList)
47                                                   : setting.add(key, Setting::TypeList);
48                        Setting &label = child.add(Setting::TypeString);
49                        label = "matrix";
50                        Setting &cols = child.add( Setting::TypeInt );
51                        Setting &rows = child.add( Setting::TypeInt );
52                        Setting &elements = child.add( Setting::TypeArray );
53                        cols = val.cols();
54                        rows = val.rows();
55                        for (int i=0; i<val.rows(); i++) {
56                                for (int j=0; j<val.cols(); j++) {
57                                        Setting &el = elements.add(Setting::TypeFloat);
58                                        el = val(i,j);
59                                }
60                        }
61                }
62        }
63
64        void fillGroup(Setting &setting, const mxArray *mxarray) {
65                if (!mxIsStruct(mxarray)) { mexErrMsgTxt("Given mxArray is not a struct."); };
66                for(int i=0; i < mxGetNumberOfFields(mxarray); i++) {
67                        const char *key = mxGetFieldNameByNumber(mxarray, i);
68                        mxArray *value = mxGetField(mxarray, 0, key);
69                        if (mxIsChar(value)) {
70                                Setting &child = setting.add(key, Setting::TypeString);
71                                child = mxArray2string(value);
72                        }
73                        if (mxIsLogical(value)) {
74                                Setting &child = setting.add(key, Setting::TypeBoolean);
75                                child = (bool) mxArray2bin(value);
76                        }
77                        if (mxIsStruct(value)) {
78                                Setting &child = setting.add(key, Setting::TypeGroup);
79                                fillGroup(child, value);
80                        }
81                        if (mxIsCell(value)) {
82                                Setting &child = setting.add(key, Setting::TypeList);
83                                fillList(child, value);
84                        }
85                        if (mxIsNumeric(value)) {
86                                storeNumeric(setting, value, (string)key);
87                        }
88                }
89        }
90       
91        void fillList(Setting &setting, const mxArray *mxarray) {
92                if (!mxIsCell(mxarray)) { mexErrMsgTxt("Given mxArray is not a cell."); };
93                for(int i=0; i < mxGetNumberOfElements(mxarray); i++) {
94                        mxArray *value = mxGetCell(mxarray, i);
95                        if (mxIsChar(value)) {
96                                Setting &child = setting.add(Setting::TypeString);
97                                child = mxArray2string(value);
98                        }
99                        if (mxIsLogical(value)) {
100                                Setting &child = setting.add(Setting::TypeBoolean);
101                                child = (bool) mxArray2bin(value);
102                        }
103                        if (mxIsStruct(value)) {
104                                Setting &child = setting.add(Setting::TypeGroup);
105                                fillGroup(child, value);
106                        }
107                        if (mxIsCell(value)) {
108                                Setting &child = setting.add(Setting::TypeList);
109                                fillList(child, value);
110                        }
111                        if (mxIsNumeric(value)) {
112                                storeNumeric(setting, value);
113                        }
114                }
115        }
116};
Note: See TracBrowser for help on using the browser.