Go to the documentation of this file.00001 #ifndef GAUDIKERNEL_MSGSTREAM_H
00002 #define GAUDIKERNEL_MSGSTREAM_H
00003
00004
00005 #include "GaudiKernel/IMessageSvc.h"
00006 #include "GaudiKernel/SerializeSTL.h"
00007
00008 #include <cstdio>
00009 #include <string>
00010 #include <iomanip>
00011 #include <vector>
00012 #include <sstream>
00013
00024 class MsgStream {
00025 private:
00029 typedef std::ios_base::fmtflags FLAG_TYPE;
00030 typedef std::ios_base::iostate STATE_TYPE;
00031 protected:
00033 IMessageSvc* m_service;
00035 std::string m_buffer;
00037 std::string m_source;
00039 std::ostringstream m_stream;
00041 bool m_active;
00043 MSG::Level m_level;
00045 MSG::Level m_currLevel;
00047 bool m_useColors;
00050 IInactiveMessageCounter* m_inactCounter;
00052 static bool m_countInactive;
00053
00054 public:
00056 GAUDI_API MsgStream(IMessageSvc* svc, int buffer_length=128);
00058 GAUDI_API MsgStream(IMessageSvc* svc, const std::string& source, int buffer_length=128);
00060 MsgStream(const MsgStream& msg)
00061 : m_service(msg.m_service),
00062 m_active(msg.m_active),
00063 m_level(msg.m_level),
00064 m_useColors(msg.m_useColors),
00065 m_inactCounter(msg.m_inactCounter)
00066 {
00067 try {
00068 m_source = msg.m_source;
00069 }
00070 catch (...) {}
00071 }
00073 GAUDI_API virtual ~MsgStream();
00075 MsgStream& report(int lvl) {
00076 lvl = (lvl >= MSG::NUM_LEVELS) ?
00077 MSG::ALWAYS : (lvl<MSG::NIL) ? MSG::NIL : lvl;
00078 if ((m_currLevel=MSG::Level(lvl)) >= level()) {
00079 activate();
00080 } else {
00081 deactivate();
00082 #ifndef NDEBUG
00083 if (MsgStream::countInactive() && m_inactCounter) {
00084 m_inactCounter->incrInactiveCount(MSG::Level(lvl),m_source);
00085 }
00086 #endif
00087 }
00088 return *this;
00089 }
00091 virtual GAUDI_API MsgStream& doOutput();
00093 const std::string& buffer() const {
00094 return m_buffer;
00095 }
00097 std::ostringstream& stream() {
00098 return m_stream;
00099 }
00101 void setMsgSvc( IMessageSvc* svc ) {
00102 m_service = svc;
00103 }
00105 void setLevel(int level) {
00106 level = (level >= MSG::NUM_LEVELS) ?
00107 MSG::ALWAYS : (level<MSG::NIL) ? MSG::NIL : level;
00108 m_level = MSG::Level(level);
00109 }
00111 MSG::Level level() {
00112 return m_level;
00113 }
00115 MSG::Level currentLevel() {
00116 return m_currLevel;
00117 }
00119 void activate() {
00120 m_active = true;
00121 }
00123 void deactivate() {
00124 m_active = false;
00125 }
00127 bool isActive() const {
00128 return m_active;
00129 }
00130
00131 MsgStream& flush() {
00132 if ( isActive() ) m_stream.flush();
00133 return *this;
00134 }
00135
00136 MsgStream& write(const char* buff,int len) {
00137 if ( isActive() ) m_stream.write(buff, len);
00138 return *this;
00139 }
00141 MsgStream& operator<<(MsgStream& (*_f)(MsgStream&)) {
00142 if ( isActive() ) _f(*this);
00143 return *this;
00144 }
00146 MsgStream& operator<<(std::ostream& (*_f)(std::ostream&)) {
00147 if ( isActive() ) _f(m_stream);
00148 return *this;
00149 }
00151 MsgStream& operator<<(std::ios& (*_f)(std::ios&)) {
00152 if ( isActive() ) _f(m_stream);
00153 return *this;
00154 }
00156 MsgStream& operator<< (MSG::Level level) {
00157 return report(level);
00158 }
00159 MsgStream& operator<<(longlong arg) {
00160 try {
00161
00162 if(isActive()) {
00163 m_stream << arg;
00164 }
00165 } catch (...) {}
00166 return *this;
00167 }
00168
00170 MsgStream& operator<<(std::ios_base& (*_f)(std::ios_base&)) {
00171 if ( isActive() ) _f(m_stream);
00172 return *this;
00173 }
00174
00176 long flags() const {
00177 return isActive() ? m_stream.flags() : 0;
00178 }
00179 long flags(FLAG_TYPE v) {
00180 return isActive() ? m_stream.flags(v) : 0;
00181 }
00182 long setf(FLAG_TYPE v) {
00183 return isActive() ? m_stream.setf(v) : 0;
00184 }
00185 int width() const {
00186 return isActive() ? m_stream.width() : 0;
00187 }
00188 int width(int v) {
00189 return isActive() ? m_stream.width(v) : 0;
00190 }
00191 char fill() const {
00192 return isActive() ? m_stream.fill() : (char)-1;
00193 }
00194 char fill(char v) {
00195 return isActive() ? m_stream.fill(v) : (char)-1;
00196 }
00197 int precision() const {
00198 return isActive() ? m_stream.precision(): 0;
00199 }
00200 int precision(int v) {
00201 return isActive() ? m_stream.precision(v): 0;
00202 }
00203 int rdstate() const {
00204 return isActive() ? m_stream.rdstate () : std::ios_base::failbit;
00205 }
00206 int good() const {
00207 return isActive() ? m_stream.good () : 0;
00208 }
00209 int eof() const {
00210 return isActive() ? m_stream.eof () : 0;
00211 }
00212 int bad() const {
00213 return isActive() ? m_stream.bad() : 0;
00214 }
00215 long setf(FLAG_TYPE _f, FLAG_TYPE _m) {
00216 return isActive() ? m_stream.setf(_f, _m) : 0;
00217 }
00218 void unsetf(FLAG_TYPE _l) {
00219 if ( isActive() ) m_stream.unsetf(_l);
00220 }
00221 void clear(STATE_TYPE _i = std::ios_base::failbit) {
00222 if ( isActive() ) m_stream.clear(_i);
00223 }
00224
00226 GAUDI_API void setColor(MSG::Color col);
00228 GAUDI_API void setColor(MSG::Color fg, MSG::Color bg);
00229
00231 GAUDI_API void resetColor();
00232
00235 static GAUDI_API bool enableCountInactive(bool value = true);
00236
00238 static GAUDI_API bool countInactive();
00239
00240 };
00241
00243 inline MsgStream& endmsg(MsgStream& s) {
00244 return s.doOutput();
00245 }
00246 #if defined(GAUDI_V20_COMPAT) && !defined(G21_NO_ENDREQ)
00247
00248 #define endreq endmsg
00249 #endif
00250
00252 GAUDI_API std::string format(const char*, ... );
00253
00254 #ifdef _WIN32
00255 template<class _E> inline
00256 MsgStream& operator<<( MsgStream& s, const std::_Fillobj<_E>& obj) {
00257 #if _MSC_VER > 1300
00258 if ( s.isActive() ) s.stream().fill(obj._Fill);
00259 #else
00260 if ( s.isActive() ) s.stream().fill(obj._Ch);
00261 #endif
00262 return s;
00263 }
00264 template<class _Tm> inline
00265 MsgStream& operator << (MsgStream& s, const std::_Smanip<_Tm>& manip) {
00266 #if _MSC_VER > 1300
00267 if ( s.isActive() ) (*manip._Pfun)(s.stream(), manip._Manarg);
00268 #else
00269 if ( s.isActive() ) (*manip._Pf)(s.stream(), manip._Manarg);
00270 #endif
00271 return s;
00272 }
00273 #elif defined (__GNUC__)
00274 inline MsgStream& operator << (MsgStream& s,
00275 const std::_Setiosflags &manip) {
00276 try {
00277
00278 if ( s.isActive() ) s.stream() << manip;
00279 } catch(...) {}
00280 return s;
00281 }
00282 inline MsgStream& operator << (MsgStream& s,
00283 const std::_Resetiosflags &manip) {
00284 try {
00285
00286 if ( s.isActive() ) s.stream() << manip;
00287 } catch (...) {}
00288 return s;
00289 }
00290 inline MsgStream& operator << (MsgStream& s,
00291 const std::_Setbase &manip) {
00292 try {
00293
00294 if ( s.isActive() ) s.stream() << manip;
00295 } catch (...) {}
00296 return s;
00297 }
00298 inline MsgStream& operator << (MsgStream& s,
00299 const std::_Setprecision &manip) {
00300 try {
00301
00302 if ( s.isActive() ) s.stream() << manip;
00303 } catch (...) {}
00304 return s;
00305 }
00306 inline MsgStream& operator << (MsgStream& s,
00307 const std::_Setw &manip) {
00308 try {
00309
00310 if ( s.isActive() ) s.stream() << manip;
00311 } catch (...) {}
00312 return s;
00313 }
00314
00315 namespace MSG {
00316 inline
00317 MsgStream& dec(MsgStream& log) {
00318 log.setf(std::ios_base::dec, std::ios_base::basefield);
00319 return log;
00320 }
00321 inline
00322 MsgStream& hex(MsgStream& log) {
00323 log.setf(std::ios_base::hex, std::ios_base::basefield);
00324 return log;
00325 }
00326 }
00327
00328 #else // GCC, version << 3
00329
00330 template<class _Tm> inline
00331 MsgStream& operator << (MsgStream& s, const std::smanip<_Tm>& manip) {
00332 try {
00333
00334 if ( s.isActive() ) s.stream() << manip;
00335 } catch (...) {}
00336 return s;
00337 }
00338 #endif // WIN32 or (__GNUC__)
00339
00342 inline MsgStream& operator<< (MsgStream& s, const char *arg){
00343 try {
00344
00345 if ( s.isActive() ) s.stream() << arg;
00346 } catch (...) {}
00347 return s;
00348 }
00349
00351 template <typename T>
00352 MsgStream& operator<< (MsgStream& lhs, const T& arg) {
00353 using namespace GaudiUtils;
00354 if(lhs.isActive())
00355 try {
00356
00357 lhs.stream() << arg;
00358 }
00359 catch (...) {}
00360 return lhs;
00361 }
00362
00363 #ifdef __GNUC__
00364
00365 template<typename T>
00366 MsgStream& operator << (MsgStream& lhs, const std::_Setfill<T> &manip) {
00367 if ( lhs.isActive() )
00368 try {
00369
00370 lhs.stream() << manip;
00371 } catch(...) {}
00372 return lhs;
00373 }
00374 #endif
00375
00376 #endif // GAUDIKERNEL_MSGSTREAM_H
00377