Changeset 260 for bdm

Show
Ignore:
Timestamp:
02/02/09 14:47:34 (15 years ago)
Author:
smidl
Message:

working UI example

Location:
bdm
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • bdm/stat/loggers.h

    r257 r260  
    1414#define LGR_H 
    1515 
    16 #include <itpp/itbase.h> 
    1716#include "libBM.h" 
    18 #include "../itpp_ext.h" 
    1917 
    2018namespace bdm{ 
  • bdm/uibuilder.cpp

    r257 r260  
    3737UIREGISTER(UIinternal); 
    3838 
     39        void UI_DBG ( Setting &S, const string &spc ) { 
     40                const char *Name=S.getName(); 
     41                if ( Name!=NULL ) {cout << spc << std::string ( Name );}; 
     42                Setting::Type T=S.getType(); 
     43                switch ( T ) { 
     44                        case Setting::TypeArray: 
     45                                cout << endl; 
     46                                for ( int i=0;i<S.getLength();i++ ) {UI_DBG ( S[i], spc+" " );}; 
     47                                break; 
     48                        case Setting::TypeList: 
     49                                cout << endl; 
     50                                for ( int i=0;i<S.getLength();i++ ) {UI_DBG ( S[i], spc+" " );}; 
     51                                break; 
     52                        case Setting::TypeGroup: 
     53                                cout << endl; 
     54                                for ( int i=0;i<S.getLength();i++ ) {UI_DBG ( S[i], spc+" " );} 
     55                                break; 
     56                        case Setting::TypeInt: 
     57                                cout << " = "; 
     58                                cout << int ( S ) <<endl; 
     59                                break; 
     60                        case Setting::TypeFloat: 
     61                                cout << " = "; 
     62                                cout << double ( S ) <<endl; 
     63                                break; 
     64                        case Setting::TypeString: 
     65                                cout << " = "; 
     66                                cout << ( const char* ) ( S ) <<endl; 
     67                                break; 
     68                        case Setting::TypeBoolean: 
     69                                cout << " = "; 
     70                                cout << bool ( S ) <<endl; 
     71                                break; 
     72                                default: {cout << "?";}; 
     73                } 
     74        } 
     75 
    3976} 
    4077//UIexternal* UIexternal_instance =new UIexternal(); 
  • bdm/uibuilder.h

    r257 r260  
    66#include "libconfig/libconfig.h++" 
    77 
    8 namespace bdm{ 
     8namespace bdm { 
    99 
    10 using namespace libconfig; 
    11 using namespace std; 
     10        using namespace libconfig; 
     11        using namespace std; 
    1212 
    1313#define CHECK_UITYPE(S,Type) it_assert_debug(S.getType()==Setting::Type, string("Wrong input path \"")+string(S.getPath())+string("\"")); 
     
    1616////////// GLOBAL VAriables 
    1717 
    18 class UIbuilder; 
     18        class UIbuilder; 
    1919//! Internal structure mapping strings to UIBuilder objects 
    20 typedef map<const string, const UIbuilder*> UImap; 
    21 extern UImap __uimap__; 
     20        typedef map<const string, const UIbuilder*> UImap; 
     21        extern UImap __uimap__; 
    2222 
    23 class UIFile : public Config{ 
     23        class UIFile : public Config { 
    2424        public: 
    25         UIFile(const char * fname):Config(){ 
    26                 try{Config::readFile(fname);}  
    27                 catch (ParseException& P) { 
    28                         char msg[200]; 
    29                         sprintf(msg,"Error in file %s  on line %d.", fname, P.getLine()); 
    30                         it_error(msg); 
    31                 }  
    32                 catch (FileIOException f) {it_error("File " + string(fname) + " not found");}  
    33         } 
    34 }; 
     25                UIFile ( const char * fname ) :Config() { 
     26                        try{Config::readFile ( fname );} 
     27                        catch ( ParseException& P ) { 
     28                                char msg[200]; 
     29                                sprintf ( msg,"Error in file %s  on line %d.", fname, P.getLine() ); 
     30                                it_error ( msg ); 
     31                        } 
     32                        catch ( FileIOException f ) {it_error ( "File " + string ( fname ) + " not found" );} 
     33                } 
     34        }; 
    3535 
    36 /*!\brief Builds computational object from a UserInfo structure 
     36        /*!\brief Builds computational object from a UserInfo structure 
    3737 
    38 Return value is a pointer to the created object (memory management issue?) 
    39 */ 
    40 class UIbuilder { 
     38        Return value is a pointer to the created object (memory management issue?) 
     39        */ 
     40        class UIbuilder { 
    4141        protected: 
    42                 static const UIbuilder* theinstance; 
    43         vec getvec ( Setting& S ) { 
    44                 CHECK_UITYPE(S,TypeArray); 
    45                 vec tmp; 
    46                 tmp.set_size ( S.getLength() ); 
    47                 for ( int i=0;i<S.getLength();i++ ) { 
    48                         switch (S[i].getType()) { 
    49                                 case Setting::TypeFloat : 
    50                                         tmp[i]=double(S[i]);break; 
    51                                 case Setting::TypeInt : 
    52                                         tmp[i]=int(S[i]);break; 
    53                                 case Setting::TypeBoolean : 
    54                                         tmp[i]=bool(S[i]);break; 
    55                                 default: it_error("libconfig error?"); 
    56                         }  
    57                 } 
    58                 return tmp; 
    59         }; 
    60         vec getivec ( Setting& S ) { 
    61                 CHECK_UITYPE(S,TypeArray); 
    62                 vec tmp; 
    63                 tmp.set_size ( S.getLength() ); 
    64                 for ( int i=0;i<S.getLength();i++ ) { 
    65                         switch (S[i].getType()) { 
    66                                 case Setting::TypeFloat : 
    67                                         tmp[i]=double(S[i]);break; 
    68                                 case Setting::TypeInt : 
    69                                         tmp[i]=int(S[i]);break; 
    70                                 case Setting::TypeBoolean : 
    71                                         tmp[i]=bool(S[i]);break; 
    72                                         default: it_error("libconfig error?"); 
    73                         }  
    74                 } 
    75                 return tmp; 
    76         }; 
     42                const vec getvec ( Setting& S ) const { 
     43                        CHECK_UITYPE ( S,TypeArray ); 
     44                        vec tmp; 
     45                        tmp.set_size ( S.getLength() ); 
     46                        for ( int i=0;i<S.getLength();i++ ) { 
     47                                switch ( S[i].getType() ) { 
     48                                        case Setting::TypeFloat : 
     49                                                tmp[i]=double ( S[i] );break; 
     50                                        case Setting::TypeInt : 
     51                                                tmp[i]=int ( S[i] );break; 
     52                                        case Setting::TypeBoolean : 
     53                                                tmp[i]=bool ( S[i] );break; 
     54                                        default: it_error ( "libconfig error?" ); 
     55                                } 
     56                        } 
     57                        return tmp; 
     58                }; 
     59                const vec getivec ( Setting& S ) const { 
     60                        CHECK_UITYPE ( S,TypeArray ); 
     61                        vec tmp; 
     62                        tmp.set_size ( S.getLength() ); 
     63                        for ( int i=0;i<S.getLength();i++ ) { 
     64                                switch ( S[i].getType() ) { 
     65                                        case Setting::TypeFloat : 
     66                                                tmp[i]=double ( S[i] );break; 
     67                                        case Setting::TypeInt : 
     68                                                tmp[i]=int ( S[i] );break; 
     69                                        case Setting::TypeBoolean : 
     70                                                tmp[i]=bool ( S[i] );break; 
     71                                        default: it_error ( "libconfig error?" ); 
     72                                } 
     73                        } 
     74                        return tmp; 
     75                }; 
    7776        public: 
    7877                //!Constructor needs to be run only once macro UIREGISTER 
    79                 UIbuilder(const string &typ){__uimap__.insert(make_pair(typ,this));} 
     78                UIbuilder ( const string &typ ) {__uimap__.insert ( make_pair ( typ,this ) );} 
    8079                //! Function building the computational object 
    81                 virtual bdmroot* build(Setting &S) const =0; 
    82 }; 
     80                virtual bdmroot* build ( Setting &S ) const =0; 
     81        }; 
    8382 
    84 class UIexternal:public UIbuilder{ 
     83        class UIexternal:public UIbuilder { 
    8584        public: 
    86                 UIexternal():UIbuilder("external"){} 
    87                 bdmroot* build(Setting &S) const; 
    88 }; 
     85                UIexternal() :UIbuilder ( "external" ) {} 
     86                bdmroot* build ( Setting &S ) const; 
     87        }; 
    8988 
    90 class UIinternal:public UIbuilder{ 
     89        class UIinternal:public UIbuilder { 
    9190        public: 
    92                 UIinternal():UIbuilder("internal"){} 
    93                 bdmroot* build(Setting &S) const; 
    94 }; 
     91                UIinternal() :UIbuilder ( "internal" ) {} 
     92                bdmroot* build ( Setting &S ) const; 
     93        }; 
     94 
     95        //! [Debugging] Print values in current S to cout 
     96        void UI_DBG ( Setting &S, const string &spc ); 
    9597 
    9698//! Prototype of a UI builder. Return value is by the second argument since it type checking via \c dynamic_cast. 
    97 template<class T> 
    98 void UIbuild(Setting &S, T* &ret){ 
    99         CHECK_UITYPE(S,TypeGroup); 
    100         // Check if field "type" is present, if not it is not a valid UI 
    101         it_assert_debug(S.exists("type"), string(S.getPath())+" is not a valid UI!"); 
    102                  
    103         const string typ=S["type"];      
    104         // Find "type" in list of registred UI builders 
    105         UImap::const_iterator iter = __uimap__.find( typ ); 
    106         if( iter == __uimap__.end()) { 
    107                 it_error("UI of type \"" + typ + "\" is not registered!"); 
    108         } 
    109          
    110         //BUILD the result 
    111         ret = dynamic_cast<T*>(iter->second->build(S)); 
    112 }; 
     99        template<class T> 
     100        void UIbuild ( Setting &S, T* &ret ) { 
     101                CHECK_UITYPE ( S,TypeGroup ); 
     102                // Check if field "type" is present, if not it is not a valid UI 
     103                it_assert_debug ( S.exists ( "type" ), string ( S.getPath() ) +" is not a valid UI!" ); 
    113104 
    114 //! Auxiliary function allowing recursivity in S 
    115 template<class T> 
    116 void UIcall(Setting &S, void (*func)(Setting&, T), T Tmp ){ 
    117         CHECK_UITYPE(S,TypeGroup); 
    118         // Check if field "type" is present, if not it is not a valid UI 
    119         it_assert_debug(S.exists("type"), string(S.getPath())+" is not a valid UI!"); 
    120                  
    121         const string typ=S["type"];      
    122         if(typ=="internal"){ 
    123                 try {    
    124                         Setting* Stmp = &S; 
    125                         do {Stmp=&(Stmp->getParent());} while (!Stmp->isRoot()); 
    126                         Setting& intS=Stmp->lookup((const char*)S["path"]); 
    127                         func(intS, Tmp); // <======== calling UIset 
     105                const string typ=S["type"]; 
     106                // Find "type" in list of registred UI builders 
     107                UImap::const_iterator iter = __uimap__.find ( typ ); 
     108                if ( iter == __uimap__.end() ) { 
     109                        it_error ( "UI of type \"" + typ + "\" is not registered!" ); 
     110                } 
     111 
     112                //BUILD the result 
     113                try { 
     114                        ret = dynamic_cast<T*> ( iter->second->build ( S ) ); 
     115                } 
     116                catch ( SettingTypeException e ) { 
     117                        UI_DBG(S,"");  
     118                        it_error ( "Setting " +string ( e.getPath() ) +" is of incorrect Type" );} 
     119                catch ( SettingNotFoundException e ) { 
     120                        UI_DBG(S,""); 
     121                        it_error ( "Setting " + string ( e.getPath() ) +" was not found" );} 
     122        }; 
     123 
     124//! Auxiliary function allowing recursivity in S (too complex, remove?) 
     125        template<class T> 
     126        void UIcall ( Setting &S, void ( *func ) ( Setting&, T ), T Tmp ) { 
     127                CHECK_UITYPE ( S,TypeGroup ); 
     128                // Check if field "type" is present, if not it is not a valid UI 
     129                it_assert_debug ( S.exists ( "type" ), string ( S.getPath() ) +" is not a valid UI!" ); 
     130 
     131                const string typ=S["type"]; 
     132                if ( typ=="internal" ) { 
     133                        try { 
     134                                Setting* Stmp = &S; 
     135                                do {Stmp=& ( Stmp->getParent() );} 
     136                                while ( !Stmp->isRoot() ); 
     137                                Setting& intS=Stmp->lookup ( ( const char* ) S["path"] ); 
     138                                func ( intS, Tmp ); // <======== calling func 
     139                                return; 
     140                        } 
     141                        catch ( ... ) { 
     142                                it_error ( "Internal field " + string ( S.getPath() ) + " not valid" ); 
     143                        } 
     144                } 
     145                if ( typ=="external" ) { 
     146                        UIFile C(S["filename"]); 
     147                        try { 
     148                                func ( C.lookup ( ( const char* ) S["path"] ), Tmp ); 
     149                        } 
     150                        catch ( ... ) { 
     151                                it_error ( "External field " + string ( S.getPath() ) + " not valid" ); 
     152                        } 
    128153                        return; 
    129154                } 
    130                 catch (...) { it_error("Internal field " + string(S.getPath()) + " not valid"); 
    131                 } 
    132         } 
    133         if(typ=="extern"){ 
    134                 Config C; 
    135                 bdmroot* tmp; 
    136                 try{C.readFile((const char*)S["filename"]);} catch (...){ 
    137                         it_error("File " + string((const char*)S["filename"]) + " not found or broken"); 
    138                 } 
    139                 try {func(C.lookup((const char*)S["path"]), Tmp);} catch (...) { //<=========== calling UIset 
    140                         it_error("External field " + string(S.getPath()) + " not valid"); 
    141                 } 
    142                 return; 
    143         } 
    144          
    145         // v======================= calling final set 
    146         func(S, Tmp); 
    147 }; 
     155 
     156                // v======================= calling final func 
     157                func ( S, Tmp ); 
     158        }; 
    148159 
    149160} 
    150 #endif UIBUILD 
     161#endif //UIBUILD