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

Revision 593, 5.1 kB (checked in by smidl, 15 years ago)

new test for mxArrayDS (former MexDS)

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