Changeset 477 for library/bdm/mex/config2mxstruct.h
- Timestamp:
- 08/05/09 14:40:03 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/mex/config2mxstruct.h
r413 r477 11 11 public: 12 12 mxArray *mxconfig; 13 UImxConfig (const char * filename) {13 UImxConfig ( const char * filename ) { 14 14 Config config; 15 config.readFile (filename);16 mxconfig = group2mxstruct (config.getRoot());15 config.readFile ( filename ); 16 mxconfig = group2mxstruct ( config.getRoot() ); 17 17 } 18 UImxConfig (const Setting &setting) {19 mxconfig = group2mxstruct (setting);18 UImxConfig ( const Setting &setting ) { 19 mxconfig = group2mxstruct ( setting ); 20 20 } 21 21 22 22 private: 23 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 TypeInt24 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 29 elements[i] = setting[i]; 30 30 } else { 31 elements[i] = ( int) setting[i];31 elements[i] = ( int ) setting[i]; 32 32 } 33 33 } 34 vec &v = * (new vec(elements, setting.getLength()));35 mxArray *result = mxCreateDoubleMatrix (1, setting.getLength(), mxREAL);36 vec2mxArray (v, result);34 vec &v = * ( new vec ( elements, setting.getLength() ) ); 35 mxArray *result = mxCreateDoubleMatrix ( 1, setting.getLength(), mxREAL ); 36 vec2mxArray ( v, result ); 37 37 delete &v; 38 38 delete [] elements; … … 40 40 } 41 41 42 mxArray* list2mxmatrix (const Setting &setting) {43 if ( !setting.isList() || ("matrix" != setting[0]))44 mexErrMsgTxt ("Given setting is not a matrix");42 mxArray* list2mxmatrix ( const Setting &setting ) { 43 if ( !setting.isList() || ( "matrix" != setting[0] ) ) 44 mexErrMsgTxt ( "Given setting is not a matrix" ); 45 45 int rows = setting[1]; 46 46 int cols = setting[2]; 47 if ( setting[3].getLength() != rows*cols)48 mexErrMsgTxt ("Matrix elements do not fit to rows*cols");47 if ( setting[3].getLength() != rows*cols ) 48 mexErrMsgTxt ( "Matrix elements do not fit to rows*cols" ); 49 49 double *elements = new double[rows*cols]; 50 for ( int i=0; i<rows*cols; i++) {50 for ( int i = 0; i < rows*cols; i++ ) { 51 51 elements[i] = setting[3][i]; 52 52 } 53 mat &m = * (new mat(elements, rows, cols));54 mxArray *result = mxCreateDoubleMatrix (rows, cols, mxREAL);55 mat2mxArray (m, result);53 mat &m = * ( new mat ( elements, rows, cols ) ); 54 mxArray *result = mxCreateDoubleMatrix ( rows, cols, mxREAL ); 55 mat2mxArray ( m, result ); 56 56 delete &m; 57 57 delete [] elements; … … 59 59 } 60 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++) {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 65 keys[i] = setting[i].getName(); 66 66 } 67 mxArray *result = mxCreateStructMatrix (1, 1, setting.getLength(), keys);67 mxArray *result = mxCreateStructMatrix ( 1, 1, setting.getLength(), keys ); 68 68 delete keys; 69 for ( int i=0; i < setting.getLength(); i++) {69 for ( int i = 0; i < setting.getLength(); i++ ) { 70 70 Setting &value = setting[i]; 71 mxArray *old = mxGetFieldByNumber (result, 0, i);72 if ( old) mxDestroyArray(old);73 switch ( value.getType()) {71 mxArray *old = mxGetFieldByNumber ( result, 0, i ); 72 if ( old ) mxDestroyArray ( old ); 73 switch ( value.getType() ) { 74 74 case Setting::TypeString: 75 mxSetFieldByNumber (result, 0, i, mxCreateString(value));75 mxSetFieldByNumber ( result, 0, i, mxCreateString ( value ) ); 76 76 break; 77 77 case Setting::TypeBoolean: 78 mxSetFieldByNumber (result, 0, i, mxCreateLogicalScalar(value));78 mxSetFieldByNumber ( result, 0, i, mxCreateLogicalScalar ( value ) ); 79 79 break; 80 80 case Setting::TypeGroup: 81 mxSetFieldByNumber (result, 0, i, group2mxstruct(value));81 mxSetFieldByNumber ( result, 0, i, group2mxstruct ( value ) ); 82 82 break; 83 83 case Setting::TypeList: 84 mxSetFieldByNumber (result, 0, i, list2mxcell(value));84 mxSetFieldByNumber ( result, 0, i, list2mxcell ( value ) ); 85 85 break; 86 86 case Setting::TypeArray: 87 mxSetFieldByNumber (result, 0, i, array2mxvector(value));87 mxSetFieldByNumber ( result, 0, i, array2mxvector ( value ) ); 88 88 break; 89 89 case Setting::TypeInt: 90 90 case Setting::TypeInt64: 91 mxSetFieldByNumber (result, 0, i, mxCreateDoubleScalar((int) value));91 mxSetFieldByNumber ( result, 0, i, mxCreateDoubleScalar ( ( int ) value ) ); 92 92 break; 93 93 case Setting::TypeFloat: 94 mxSetFieldByNumber (result, 0, i, mxCreateDoubleScalar(value));94 mxSetFieldByNumber ( result, 0, i, mxCreateDoubleScalar ( value ) ); 95 95 break; 96 96 default: 97 97 //this should never happen 98 mexErrMsgTxt ("Unknown type of a setting.");98 mexErrMsgTxt ( "Unknown type of a setting." ); 99 99 } 100 100 } … … 102 102 103 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);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 109 return result; 110 110 } 111 if ( (setting[0].getType() == Setting::TypeString) && ("matrix" == setting[0])) {112 return list2mxmatrix (setting);111 if ( ( setting[0].getType() == Setting::TypeString ) && ( "matrix" == setting[0] ) ) { 112 return list2mxmatrix ( setting ); 113 113 } 114 mxArray *result = mxCreateCellMatrix (1, setting.getLength());115 for ( int i=0; i < setting.getLength(); i++) {114 mxArray *result = mxCreateCellMatrix ( 1, setting.getLength() ); 115 for ( int i = 0; i < setting.getLength(); i++ ) { 116 116 Setting &value = setting[i]; 117 mxArray *old = mxGetCell (result, i);118 if ( old) mxDestroyArray(old);119 switch ( value.getType()) {117 mxArray *old = mxGetCell ( result, i ); 118 if ( old ) mxDestroyArray ( old ); 119 switch ( value.getType() ) { 120 120 case Setting::TypeString: 121 mxSetCell (result, i, mxCreateString(value));121 mxSetCell ( result, i, mxCreateString ( value ) ); 122 122 break; 123 123 case Setting::TypeBoolean: 124 mxSetCell (result, i, mxCreateLogicalScalar(value));124 mxSetCell ( result, i, mxCreateLogicalScalar ( value ) ); 125 125 break; 126 126 case Setting::TypeGroup: 127 mxSetCell (result, i, group2mxstruct(value));127 mxSetCell ( result, i, group2mxstruct ( value ) ); 128 128 break; 129 129 case Setting::TypeList: 130 mxSetCell (result, i, list2mxcell(value));130 mxSetCell ( result, i, list2mxcell ( value ) ); 131 131 break; 132 132 case Setting::TypeArray: 133 mxSetCell (result, i, array2mxvector(value));133 mxSetCell ( result, i, array2mxvector ( value ) ); 134 134 break; 135 135 case Setting::TypeInt: 136 136 case Setting::TypeInt64: 137 mxSetCell (result, i, mxCreateDoubleScalar((int) value));137 mxSetCell ( result, i, mxCreateDoubleScalar ( ( int ) value ) ); 138 138 break; 139 139 case Setting::TypeFloat: 140 mxSetCell (result, i, mxCreateDoubleScalar(value));140 mxSetCell ( result, i, mxCreateDoubleScalar ( value ) ); 141 141 break; 142 142 default: 143 143 //this should never happen 144 mexErrMsgTxt ("Unknown type of a setting.");144 mexErrMsgTxt ( "Unknown type of a setting." ); 145 145 } 146 146 }