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

Revision 477, 3.9 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 UImxArray : public Config {
11public:
12        UImxArray ( const mxArray *mxarray ) : Config() {
13                Setting & setting = this->getRoot(); //setting is a group
14                if ( !mxIsStruct ( mxarray ) ) {
15                        mexErrMsgTxt ( "Given mxArray is not a struct." );
16                };
17                //mexCallMATLAB(0, NULL, 1, (mxArray **) &mxarray, "dump");
18                fillGroup ( setting, mxarray );
19                setAutoConvert ( true );
20        }
21        UImxArray() : Config() {
22                setAutoConvert ( true );
23        }
24        void addList ( const mxArray *mxarray, const char* name ) {
25                Setting & setting = this->getRoot(); //setting is a group
26                Setting & child = setting.add ( name, Setting::TypeList );
27                fillList ( child, mxarray );
28        }
29        void addGroup ( const mxArray *mxarray, const char* name ) {
30                Setting & setting = this->getRoot(); //setting is a group
31                Setting & child = setting.add ( name, Setting::TypeGroup );
32                fillGroup ( child, mxarray );
33        }
34        operator Setting&() {
35                return getRoot();
36        }
37private:
38        void storeNumeric ( Setting &setting, const mxArray *value, string key = "" ) {
39                //TODO: integer matrices
40                if ( !mxIsNumeric ( value ) ) {
41                        mexErrMsgTxt ( "Given mxArray is not numeric." );
42                };
43                mat val = mxArray2mat ( value );
44                if ( ( val.rows() == 1 ) && ( val.cols() == 1 ) ) {
45                        Setting &child = ( key == "" ) ? setting.add ( Setting::TypeFloat )
46                                         : setting.add ( key, Setting::TypeFloat );
47                        child = val ( 0, 0 );
48                } else {
49                        Setting &child = ( key == "" ) ? setting.add ( Setting::TypeList )
50                                         : setting.add ( key, Setting::TypeList );
51                        Setting &label = child.add ( Setting::TypeString );
52                        label = "matrix";
53                        Setting &rows = child.add ( Setting::TypeInt );
54                        Setting &cols = child.add ( Setting::TypeInt );
55                        Setting &elements = child.add ( Setting::TypeArray );
56                        cols = val.cols();
57                        rows = val.rows();
58                        for ( int i = 0; i < val.rows(); i++ ) {
59                                for ( int j = 0; j < val.cols(); j++ ) {
60                                        Setting &el = elements.add ( Setting::TypeFloat );
61                                        el = val ( i, j );
62                                }
63                        }
64                }
65        }
66
67        void fillGroup ( Setting &setting, const mxArray *mxarray ) {
68                if ( !mxIsStruct ( mxarray ) ) {
69                        mexErrMsgTxt ( "Given mxArray is not a struct." );
70                };
71                for ( int i = 0; i < mxGetNumberOfFields ( mxarray ); i++ ) {
72                        const char *key = mxGetFieldNameByNumber ( mxarray, i );
73                        mxArray *value = mxGetField ( mxarray, 0, key );
74                        if ( mxIsChar ( value ) ) {
75                                Setting &child = setting.add ( key, Setting::TypeString );
76                                child = mxArray2string ( value );
77                        }
78                        if ( mxIsLogical ( value ) ) {
79                                Setting &child = setting.add ( key, Setting::TypeBoolean );
80                                child = ( bool ) mxArray2bin ( value );
81                        }
82                        if ( mxIsStruct ( value ) ) {
83                                Setting &child = setting.add ( key, Setting::TypeGroup );
84                                fillGroup ( child, value );
85                        }
86                        if ( mxIsCell ( value ) ) {
87                                Setting &child = setting.add ( key, Setting::TypeList );
88                                fillList ( child, value );
89                        }
90                        if ( mxIsNumeric ( value ) ) {
91                                storeNumeric ( setting, value, ( string ) key );
92                        }
93                }
94        }
95
96        void fillList ( Setting &setting, const mxArray *mxarray ) {
97                if ( !mxIsCell ( mxarray ) ) {
98                        mexErrMsgTxt ( "Given mxArray is not a cell." );
99                };
100                for ( uint i = 0; i < mxGetNumberOfElements ( mxarray ); i++ ) {
101                        mxArray *value = mxGetCell ( mxarray, i );
102                        if ( mxIsChar ( value ) ) {
103                                Setting &child = setting.add ( Setting::TypeString );
104                                child = mxArray2string ( value );
105                        }
106                        if ( mxIsLogical ( value ) ) {
107                                Setting &child = setting.add ( Setting::TypeBoolean );
108                                child = ( bool ) mxArray2bin ( value );
109                        }
110                        if ( mxIsStruct ( value ) ) {
111                                Setting &child = setting.add ( Setting::TypeGroup );
112                                fillGroup ( child, value );
113                        }
114                        if ( mxIsCell ( value ) ) {
115                                Setting &child = setting.add ( Setting::TypeList );
116                                fillList ( child, value );
117                        }
118                        if ( mxIsNumeric ( value ) ) {
119                                storeNumeric ( setting, value );
120                        }
121                }
122        }
123};
Note: See TracBrowser for help on using the browser.