Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | Related Pages

logstream.h

00001 // -*- mode: c++;
00002 #ifndef logstream_h
00003 #define logstream_h
00004 
00005 #include "streamlog/prefix.h"
00006 
00007 #include <iostream>
00008 #include <map>
00009 
00010 namespace streamlog{
00011 
00012   class prefix_base ;
00013   class logbuffer ;
00014   class logscope ;
00015 
00016 
00052   class logstream {
00053 
00054     friend class logscope ;
00055     friend class logbuffer ;
00056 
00057 
00058     typedef std::map< std::string,  unsigned > LevelMap ;
00059 
00060   public :
00061 
00062     logstream() ; 
00063 
00064     ~logstream() ;
00065 
00071     void init( std::ostream& os , const std::string name ) ;
00072 
00077     template<class T>
00078     inline bool write() {
00079       
00080       // dont' call chek_level if T::active == false
00081       return (  T::active   &&    check_level<T>()  ) ;
00082     }
00083 
00087     std::ostream& operator()() ;
00088 
00097     template <class T>
00098     void addLevelName() {
00099 
00100       _map[ T::name() ] = T::level ;
00101     }
00102 
00103 
00104     // interface for friend classes: scope and logbuffer
00105 
00106   protected:
00107 
00111     void setLevel( unsigned level ) { _level = level ; } 
00112 
00116     unsigned setLevel( const std::string& levelName )  ; 
00117 
00119     prefix_base* prefix() { return _prefix ; }
00120 
00122     template<class T>
00123     bool check_level() {
00124       
00125       if( T::level >= _level ){
00126         _active = true ;
00127         _prefix->_levelName = T::name() ;
00128       }
00129       return _active ;
00130     }
00131 
00132 
00133   private:
00134 
00136     class nullstream :  public std::ostream {
00137     public:
00138       nullstream() : std::ios( 0 ), std::ostream( 0 ) {} ;
00139     } ;
00140   
00141 
00142     nullstream* _ns ;    // the nullstream
00143     std::ostream* _os ; // wrapper for actual ostream
00144     unsigned _level ;   // current log level 
00145     bool _active ;      // boolean helper 
00146     logbuffer* _lb ;        // log buffer adds prefix to everu log message
00147     prefix_base* _prefix ;  // prefix formatter
00148     LevelMap _map ;         // string map of level names
00149     
00150   } ;
00151 
00152   extern logstream out ;
00153 
00154 }
00155 #endif

Generated on Mon Jan 12 09:48:51 2009 for Marlin by doxygen 1.3.5