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

Revision 477, 4.6 kB (checked in by mido, 15 years ago)

panove, vite, jak jsem peclivej na upravu kodu.. snad se vam bude libit:) konfigurace je v souboru /system/astylerc

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.