root/library/mex/mexparse.h @ 345

Revision 345, 3.1 kB (checked in by mido, 15 years ago)

dodelano user_info, castecne predelano podle stabni kultury, zbyva otestovat a udelat dokumentaci

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