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

RevLine 
[391]1#include "../base/libconfig/libconfig.h++"
[331]2#include <itpp/itbase.h>
[327]3#include <itpp/itmex.h>
4#include <stdlib.h>
5
[331]6using namespace itpp;
[327]7using namespace std;
8using namespace libconfig;
9
10class UImxArray : public Config {
11public:
[477]12        UImxArray ( const mxArray *mxarray ) : Config() {
[327]13                Setting & setting = this->getRoot(); //setting is a group
[477]14                if ( !mxIsStruct ( mxarray ) ) {
15                        mexErrMsgTxt ( "Given mxArray is not a struct." );
16                };
[327]17                //mexCallMATLAB(0, NULL, 1, (mxArray **) &mxarray, "dump");
[477]18                fillGroup ( setting, mxarray );
19                setAutoConvert ( true );
[327]20        }
[477]21        UImxArray() : Config() {
22                setAutoConvert ( true );
23        }
24        void addList ( const mxArray *mxarray, const char* name ) {
[388]25                Setting & setting = this->getRoot(); //setting is a group
[477]26                Setting & child = setting.add ( name, Setting::TypeList );
27                fillList ( child, mxarray );
[388]28        }
[477]29        void addGroup ( const mxArray *mxarray, const char* name ) {
[392]30                Setting & setting = this->getRoot(); //setting is a group
[477]31                Setting & child = setting.add ( name, Setting::TypeGroup );
32                fillGroup ( child, mxarray );
[392]33        }
[477]34        operator Setting&() {
35                return getRoot();
[392]36        }
[327]37private:
[477]38        void storeNumeric ( Setting &setting, const mxArray *value, string key = "" ) {
[327]39                //TODO: integer matrices
[477]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 );
[327]48                } else {
[477]49                        Setting &child = ( key == "" ) ? setting.add ( Setting::TypeList )
50                                         : setting.add ( key, Setting::TypeList );
51                        Setting &label = child.add ( Setting::TypeString );
[371]52                        label = "matrix";
[477]53                        Setting &rows = child.add ( Setting::TypeInt );
54                        Setting &cols = child.add ( Setting::TypeInt );
55                        Setting &elements = child.add ( Setting::TypeArray );
[327]56                        cols = val.cols();
[345]57                        rows = val.rows();
[477]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 );
[327]62                                }
63                        }
64                }
65        }
66
[477]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 );
[327]77                        }
[477]78                        if ( mxIsLogical ( value ) ) {
79                                Setting &child = setting.add ( key, Setting::TypeBoolean );
80                                child = ( bool ) mxArray2bin ( value );
[327]81                        }
[477]82                        if ( mxIsStruct ( value ) ) {
83                                Setting &child = setting.add ( key, Setting::TypeGroup );
84                                fillGroup ( child, value );
[327]85                        }
[477]86                        if ( mxIsCell ( value ) ) {
87                                Setting &child = setting.add ( key, Setting::TypeList );
88                                fillList ( child, value );
[327]89                        }
[477]90                        if ( mxIsNumeric ( value ) ) {
91                                storeNumeric ( setting, value, ( string ) key );
[327]92                        }
93                }
94        }
[477]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 );
[327]105                        }
[477]106                        if ( mxIsLogical ( value ) ) {
107                                Setting &child = setting.add ( Setting::TypeBoolean );
108                                child = ( bool ) mxArray2bin ( value );
[327]109                        }
[477]110                        if ( mxIsStruct ( value ) ) {
111                                Setting &child = setting.add ( Setting::TypeGroup );
112                                fillGroup ( child, value );
[327]113                        }
[477]114                        if ( mxIsCell ( value ) ) {
115                                Setting &child = setting.add ( Setting::TypeList );
116                                fillList ( child, value );
[327]117                        }
[477]118                        if ( mxIsNumeric ( value ) ) {
119                                storeNumeric ( setting, value );
[327]120                        }
121                }
122        }
123};
Note: See TracBrowser for help on using the browser.