00001
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
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
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 ;
00143 std::ostream* _os ;
00144 unsigned _level ;
00145 bool _active ;
00146 logbuffer* _lb ;
00147 prefix_base* _prefix ;
00148 LevelMap _map ;
00149
00150 } ;
00151
00152 extern logstream out ;
00153
00154 }
00155 #endif