root/library/mex/config2mxstruct.h @ 371

Revision 371, 3.9 kB (checked in by miro, 15 years ago)

conversion from config to matlab structure
changed expected interpretation of matrix in mexparse.h

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