root/library/bdm/mex/config2mxstruct.h @ 413

Revision 413, 4.4 kB (checked in by miro, 15 years ago)

several fixes of config2mxstruct.h
it still doesn't work properly but the bug is found and marked

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 UImxConfig : public Config {
11public:
12        mxArray *mxconfig;
13        UImxConfig(const char * filename) {
14                Config config;
15                config.readFile(filename);
16                mxconfig = group2mxstruct(config.getRoot());
17        }
18        UImxConfig(const Setting &setting) {
19                mxconfig = group2mxstruct(setting);
20        }
21
22private:
23
24        mxArray* array2mxvector(const Setting &setting)  {
25                if (!setting.isArray()) mexErrMsgTxt("Given setting is not an array");
26                double *elements = new double[setting.getLength()];
27                for (int i=0; i<setting.getLength(); i++) {
28                        if (setting.getType() == Setting::TypeInt) { //TODO: tady je chyba -- zaporna cisla nejsou TypeInt
29                                elements[i] = setting[i];
30                        } else {
31                                elements[i] = (int) setting[i];
32                        }
33                }
34                vec &v = *(new vec(elements, setting.getLength()));
35                mxArray *result = mxCreateDoubleMatrix(1, setting.getLength(), mxREAL);
36                vec2mxArray(v, result);
37                delete &v;
38                delete [] elements;
39                return result;
40        }
41
42        mxArray* list2mxmatrix(const Setting &setting)  {
43                if (!setting.isList() || ("matrix" != setting[0]))
44                        mexErrMsgTxt("Given setting is not a matrix");
45                int rows = setting[1];
46                int cols = setting[2];
47                if (setting[3].getLength() != rows*cols)
48                        mexErrMsgTxt("Matrix elements do not fit to rows*cols");
49                double *elements = new double[rows*cols];
50                for (int i=0; i<rows*cols; i++) {
51                        elements[i] = setting[3][i];
52                }
53                mat &m = *(new mat(elements, rows, cols));
54                mxArray *result = mxCreateDoubleMatrix(rows, cols, mxREAL);
55                mat2mxArray(m, result);
56                delete &m;
57                delete [] elements;
58                return result;
59        }
60
61        mxArray* group2mxstruct(const Setting &setting) {
62                if (!setting.isGroup()) mexErrMsgTxt("Given setting is not a group.");
63                const char ** keys = new const char*[setting.getLength()];
64                for (int i=0; i < setting.getLength(); i++) {
65                        keys[i] = setting[i].getName();
66                }
67                mxArray *result = mxCreateStructMatrix(1, 1, setting.getLength(), keys);
68                delete keys;
69                for (int i=0; i < setting.getLength(); i++) {
70                        Setting &value = setting[i];
71                        mxArray *old = mxGetFieldByNumber(result, 0, i);
72                        if (old) mxDestroyArray(old);
73                        switch (value.getType()) {
74                        case Setting::TypeString:
75                                mxSetFieldByNumber(result, 0, i, mxCreateString(value));
76                                break;
77                        case Setting::TypeBoolean:
78                                mxSetFieldByNumber(result, 0, i, mxCreateLogicalScalar(value));
79                                break;
80                        case Setting::TypeGroup:
81                                mxSetFieldByNumber(result, 0, i, group2mxstruct(value));
82                                break;
83                        case Setting::TypeList:
84                                mxSetFieldByNumber(result, 0, i, list2mxcell(value));
85                                break;
86                        case Setting::TypeArray:
87                                mxSetFieldByNumber(result, 0, i, array2mxvector(value));
88                                break;
89                        case Setting::TypeInt:
90                        case Setting::TypeInt64:
91                                mxSetFieldByNumber(result, 0, i, mxCreateDoubleScalar((int) value));
92                                break;
93                        case Setting::TypeFloat:
94                                mxSetFieldByNumber(result, 0, i, mxCreateDoubleScalar(value));
95                                break;
96                        default:
97                                //this should never happen
98                                mexErrMsgTxt("Unknown type of a setting.");
99                        }
100                }
101                return result;
102
103        }
104       
105        mxArray* list2mxcell(const Setting &setting)  {
106                if (!setting.isList()) mexErrMsgTxt("Given setting is not a list.");
107                if (setting.getLength() == 0) {
108                        mxArray *result = mxCreateCellMatrix(1, 0);
109                        return result;
110                }
111                if ((setting[0].getType() == Setting::TypeString) && ("matrix" == setting[0])) {
112                        return list2mxmatrix(setting);
113                }
114                mxArray *result = mxCreateCellMatrix(1, setting.getLength());
115                for (int i=0; i < setting.getLength(); i++) {
116                        Setting &value = setting[i];
117                        mxArray *old = mxGetCell(result, i);
118                        if (old) mxDestroyArray(old);
119                        switch (value.getType()) {
120                        case Setting::TypeString:
121                                mxSetCell(result, i, mxCreateString(value));
122                                break;
123                        case Setting::TypeBoolean:
124                                mxSetCell(result, i, mxCreateLogicalScalar(value));
125                                break;
126                        case Setting::TypeGroup:
127                                mxSetCell(result, i, group2mxstruct(value));
128                                break;
129                        case Setting::TypeList:
130                                mxSetCell(result, i, list2mxcell(value));
131                                break;
132                        case Setting::TypeArray:
133                                mxSetCell(result, i, array2mxvector(value));
134                                break;
135                        case Setting::TypeInt:
136                        case Setting::TypeInt64:
137                                mxSetCell(result, i, mxCreateDoubleScalar((int) value));
138                                break;
139                        case Setting::TypeFloat:
140                                mxSetCell(result, i, mxCreateDoubleScalar(value));
141                                break;
142                        default:
143                                //this should never happen
144                                mexErrMsgTxt("Unknown type of a setting.");
145                        }
146                }
147                return result;
148        }
149};
Note: See TracBrowser for help on using the browser.