| 300 |   | template<class T> class log_level_template : public log_level_base {  | 
                      
                        | 301 |   |         //! this is necessary to allow logger to set ids vector appropriately and also to set registered_logger  | 
                      
                        | 302 |   |         friend class logger;   | 
                      
                        | 303 |   |   | 
                      
                        | 304 |   |         //! vector of log IDs - one element for each entry  | 
                      
                        | 305 |   |         ivec ids;  | 
                      
                        | 306 |   |   | 
                      
                        | 307 |   |         //! internal pointer to the logger to which this log_level is registered  | 
                      
                        | 308 |   |         //!   | 
                      
                        | 309 |   |         //! it is set to NULL at the beginning  | 
                      
                        | 310 |   |         logger * registered_logger;  | 
                      
                        | 311 |   |   | 
                      
                        | 312 |   | public:  | 
                      
                        | 313 |   |         //! default constructor  | 
                      
                        | 314 |   |         log_level_template() {  | 
                      
                        | 315 |   |                 registered_logger = NULL;  | 
                      
                        | 316 |   |                 ids.set_size(  T::log_level_names().length() );  | 
                      
                      
                        |   | 300 | //!  | 
                      
                        |   | 301 | //! This is only the first part of the whole declaration, which has to be however separated into  | 
                      
                        |   | 302 | //! two different classes for allowing the compilation of source code. For more details  | 
                      
                        |   | 303 | //! see logger::add_setting(...) method and mainly log_level_template<T>::template<class U> void store( const enum T::log_level_enums log_level_enum, const U data ) const  | 
                      
                        |   | 304 | //! method. For the reason the second one is templated, it was necessary to declare this whole class.   | 
                      
                        |   | 305 | template<class T> class log_level_intermediate : public log_level_base {  | 
                      
                        |   | 306 | public:  | 
                      
                        |   | 307 |         log_level_intermediate( ) {  | 
                      
                        |   | 308 |                 ids.set_size( names().length() );  | 
                      
            
                  
                          | 319 |   |   | 
                  
                          | 320 |   |         //! This method stores a vector to the proper place in registered logger   | 
                  
                          | 321 |   |         void store( const enum T::log_level_enums log_level_enum, const vec &vect ) const  | 
                  
                          | 322 |   |         {  | 
                  
                          | 323 |   |                 bdm_assert_debug( registered_logger != NULL, "You have to register instance to a logger first! Use root::log_register(...) method.");  | 
                  
                          | 324 |   |                 bdm_assert_debug( ids( log_level_enum ) >= 0, "This particular vector was not added to logger! Use logger::add_vector(...) method.");  | 
                  
                          | 325 |   |                 registered_logger->log_vector( ids( log_level_enum ), vect );  | 
                  
                          | 326 |   |         }  | 
                  
                          | 327 |   |   | 
                  
                          | 328 |   |         //! This method stores a double to the proper place in registered logger   | 
                  
                          | 329 |   |         void store( const enum T::log_level_enums log_level_enum, const double &dbl ) const  | 
                  
                          | 330 |   |         {  | 
                  
                          | 331 |   |                 bdm_assert_debug( registered_logger != NULL, "You have to register instance to a logger first! See root::log_register(...) method.");  | 
                  
                          | 332 |   |                 bdm_assert_debug( ids( log_level_enum ) >= 0, "This particular double was not added to logger! Use logger::add_vector(...) method.");  | 
                  
                          | 333 |   |                 registered_logger->log_double( ids( log_level_enum ), dbl );  | 
                  
                          | 334 |   |         }  | 
                  
                          | 335 |   |   | 
                  
                          | 336 |   |         //! This method stores a Setting obtained by call of UI::save( data, .. ) to the proper place in registered logger   | 
                  
                          | 337 |   |         template<class U> void store( const enum T::log_level_enums log_level_enum, const U data ) const  | 
                  
                          | 338 |   |         {                         | 
                  
                          | 339 |   |                 bdm_assert_debug( registered_logger != NULL, "You have to register instance to a logger first! See root::log_register(...) method.");  | 
                  
                          | 340 |   |                 bdm_assert_debug( ids( log_level_enum ) >= 0, "This particular vector was not added to logger! Use logger::add_setting(...) method.");  | 
                  
                          | 341 |   |                 registered_logger->log_setting( ids( log_level_enum ), data);  | 
                  
                          | 342 |   |         }  | 
                  
                          | 343 |   |   | 
                  
            
                  
                          | 367 |   |   | 
                  
                          | 368 |   | /*!  | 
                  
                          | 369 |   |   \def LOG_LEVEL(classname,...)  | 
                  
                          | 370 |   |   \brief Macro for defining a log_level attribute with a specific set of enumerations related to a specific class   | 
                  
                          | 371 |   |   | 
                  
                          | 372 |   |   This macro has to be called within a class declaration. Its argument \a classname has to correspond to that wrapping class.  | 
                  
                          | 373 |   |   This macro defines a log_level instance which can be modified either directly or by the means of #UI class.  | 
                  
                          | 374 |   |   | 
                  
                          | 375 |   |   One of the main purposes of this macro is to allow variability in using enumerations. By relating them to their names through  | 
                  
                          | 376 |   |   an array of strings, we are no more dependant on their precise ordering. What is more, we can add or remove any without harming   | 
                  
                          | 377 |   |   any applications which are using this library.  | 
                  
                          | 378 |   |   | 
                  
                          | 379 |   |   \todo Write a more detailed explanation including also examples  | 
                  
                          | 380 |   |   | 
                  
                          | 381 |   |   \ref ui  | 
                  
                          | 382 |   | */  | 
                  
                          | 383 |   | #define LOG_LEVEL(classname,...) public: enum log_level_enums { __VA_ARGS__ }; log_level_template<classname> log_level; private: friend class log_level_template<classname>; static const Array<string> &log_level_names() { static const Array<string> log_level_names = log_level_base::string2Array( #__VA_ARGS__ ); return log_level_names; }  | 
                  
            
                  
                          |   | 444 |   | 
                  
                          |   | 445 | //! This class stores a details that will be logged to a logger  | 
                  
                          |   | 446 | template<class T> class log_level_template : public log_level_intermediate<T> {  | 
                  
                          |   | 447 | public:  | 
                  
                          |   | 448 |         //! This method stores a vector to the proper place in registered logger   | 
                  
                          |   | 449 |         void store( const enum T::log_level_enums log_level_enum, const vec &vect ) const  | 
                  
                          |   | 450 |         {  | 
                  
                          |   | 451 |                 bdm_assert_debug( registered_logger != NULL, "You have to register instance to a logger first! Use root::log_register(...) method.");  | 
                  
                          |   | 452 |                 bdm_assert_debug( ids( log_level_enum ) >= 0, "This particular vector was not added to logger! Use logger::add_vector(...) method.");  | 
                  
                          |   | 453 |                 registered_logger->log_vector( ids( log_level_enum ), vect );  | 
                  
                          |   | 454 |         }  | 
                  
                          |   | 455 |   | 
                  
                          |   | 456 |         //! This method stores a double to the proper place in registered logger   | 
                  
                          |   | 457 |         void store( const enum T::log_level_enums log_level_enum, const double &dbl ) const  | 
                  
                          |   | 458 |         {  | 
                  
                          |   | 459 |                 bdm_assert_debug( registered_logger != NULL, "You have to register instance to a logger first! See root::log_register(...) method.");  | 
                  
                          |   | 460 |                 bdm_assert_debug( ids( log_level_enum ) >= 0, "This particular double was not added to logger! Use logger::add_vector(...) method.");  | 
                  
                          |   | 461 |                 registered_logger->log_double( ids( log_level_enum ), dbl );  | 
                  
                          |   | 462 |         }  | 
                  
                          |   | 463 |   | 
                  
                          |   | 464 |         //! This method stores a Setting obtained by call of UI::save( data, .. ) to the proper place in registered logger   | 
                  
                          |   | 465 |         //!  | 
                  
                          |   | 466 |         //! If this method was not templated, we could store whole body of this class in cpp file without explicitly touching registered_logger->log_setting(...) here.  | 
                  
                          |   | 467 |         //! (it would not be straightforward, though, still there are some enums which had to be converted into integers but it could be done without loosing type control)  | 
                  
                          |   | 468 |         //! This way, it would not be necessary to declare log_level_intermediate<T> class and we could declare log_level_template<T>  | 
                  
                          |   | 469 |         //! before the log_level class itself with a mere foroward declaration of log_level. In our case, however, touching of registered_logger->log_setting  | 
                  
                          |   | 470 |         //! implies that friend declaration is not enough and we are lost in a circle. And just by cutting this circle we obtains log_level_intermediate<T> class.   | 
                  
                          |   | 471 |         //! Howg.)  | 
                  
                          |   | 472 |         template<class U> void store( const enum T::log_level_enums log_level_enum, const U data ) const  | 
                  
                          |   | 473 |         {                         | 
                  
                          |   | 474 |                 bdm_assert_debug( registered_logger != NULL, "You have to register instance to a logger first! See root::log_register(...) method.");  | 
                  
                          |   | 475 |                 bdm_assert_debug( ids( log_level_enum ) >= 0, "This particular vector was not added to logger! Use logger::add_setting(...) method.");  | 
                  
                          |   | 476 |                 registered_logger->log_setting( ids( log_level_enum ), data);  | 
                  
                          |   | 477 |         }  | 
                  
                          |   | 478 | };  | 
                  
                          |   | 479 |   | 
                  
                          |   | 480 | /*!  | 
                  
                          |   | 481 |   \def LOG_LEVEL(classname,...)  | 
                  
                          |   | 482 |   \brief Macro for defining a log_level attribute with a specific set of enumerations related to a specific class   | 
                  
                          |   | 483 |   | 
                  
                          |   | 484 |   This macro has to be called within a class declaration. Its argument \a classname has to correspond to that wrapping class.  | 
                  
                          |   | 485 |   This macro defines a log_level instance which can be modified either directly or by the means of #UI class.  | 
                  
                          |   | 486 |   | 
                  
                          |   | 487 |   One of the main purposes of this macro is to allow variability in using enumerations. By relating them to their names through  | 
                  
                          |   | 488 |   an array of strings, we are no more dependant on their precise ordering. What is more, we can add or remove any without harming   | 
                  
                          |   | 489 |   any applications which are using this library.  | 
                  
                          |   | 490 |   | 
                  
                          |   | 491 |   \todo Write a more detailed explanation including also examples  | 
                  
                          |   | 492 |   | 
                  
                          |   | 493 |   \ref ui  | 
                  
                          |   | 494 | */  | 
                  
                          |   | 495 | #define LOG_LEVEL(classname,...) public: enum log_level_enums { __VA_ARGS__ }; log_level_template<classname> log_level; private: friend class log_level_template<classname>; friend class log_level_intermediate<classname>; static const Array<string> &log_level_names() { static const Array<string> log_level_names = log_level_base::string2Array( #__VA_ARGS__ ); return log_level_names; }  | 
                  
                          |   | 496 |   |