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

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

removal of unused functions _e() and samplecond(,) and added documentation lines

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