Gaudi Framework, version v21r9

Home   Generated: 3 May 2010

MsgStream.h

Go to the documentation of this file.
00001 // $Id: MsgStream.h,v 1.43 2008/10/30 23:38:46 marcocle Exp $
00002 #ifndef GAUDIKERNEL_MSGSTREAM_H
00003 #define GAUDIKERNEL_MSGSTREAM_H
00004 
00005 // Include files
00006 #include "GaudiKernel/IMessageSvc.h"
00007 #include "GaudiKernel/SerializeSTL.h"
00008 // Standard C++ classes
00009 #include <cstdio>
00010 #include <string>
00011 #include <iomanip>
00012 #include <vector>
00013 #include <sstream>
00014 
00025 class MsgStream {
00026 private:
00030   typedef std::ios_base::fmtflags FLAG_TYPE;
00031   typedef std::ios_base::iostate  STATE_TYPE;
00032 protected:
00034   IMessageSvc*    m_service;
00036   std::string     m_buffer;
00038   std::string     m_source;
00040   std::ostringstream m_stream;
00042   bool            m_active;
00044   MSG::Level      m_level;
00046   MSG::Level      m_currLevel;
00048   bool m_useColors;
00049 public:
00051   GAUDI_API MsgStream(IMessageSvc* svc, int buffer_length=128);
00053   GAUDI_API MsgStream(IMessageSvc* svc, const std::string& source, int buffer_length=128);
00055   MsgStream(const MsgStream& msg)
00056     : m_service(msg.m_service),
00057       m_active(msg.m_active),
00058       m_level(msg.m_level),
00059       m_useColors(msg.m_useColors)
00060   {
00061     try { // ignore exception if we cannot copy the string
00062       m_source = msg.m_source;
00063     }
00064     catch (...) {}
00065   }
00067   GAUDI_API virtual ~MsgStream();
00069   MsgStream& report(int lvl)   {
00070     lvl = (lvl >= MSG::NUM_LEVELS) ?
00071       MSG::ALWAYS : (lvl<MSG::NIL) ? MSG::NIL : lvl;
00072     ((m_currLevel=MSG::Level(lvl)) >= level()) ? activate() : deactivate();
00073     return *this;
00074   }
00076   virtual GAUDI_API MsgStream& doOutput();
00078   const std::string& buffer() const {
00079     return m_buffer;
00080   }
00082   std::ostringstream& stream()   {
00083     return m_stream;
00084   }
00086   void setMsgSvc( IMessageSvc* svc ) {
00087     m_service = svc;
00088   }
00090   void setLevel(int level)    {
00091     level = (level >= MSG::NUM_LEVELS) ?
00092       MSG::ALWAYS : (level<MSG::NIL) ? MSG::NIL : level;
00093     m_level = MSG::Level(level);
00094   }
00096   MSG::Level level()   {
00097     return m_level;
00098   }
00100   MSG::Level currentLevel()   {
00101     return m_currLevel;
00102   }
00104   void activate()     {
00105     m_active = true;
00106   }
00108   void deactivate()     {
00109     m_active = false;
00110   }
00112   bool isActive()  const   {
00113     return m_active;
00114   }
00115   // oMsgStream flush emulation
00116   MsgStream& flush()    {
00117     if ( isActive() ) m_stream.flush();
00118     return *this;
00119   }
00120   // oMsgStream write emulation
00121   MsgStream& write(const char* buff,int len)  {
00122     if ( isActive() ) m_stream.write(buff, len);
00123     return *this;
00124   }
00126   MsgStream& operator<<(MsgStream& (*_f)(MsgStream&))    {
00127     if ( isActive() ) _f(*this);
00128     return *this;
00129   }
00131   MsgStream& operator<<(std::ostream& (*_f)(std::ostream&))    {
00132     if ( isActive() ) _f(m_stream);
00133     return *this;
00134   }
00136   MsgStream& operator<<(std::ios& (*_f)(std::ios&))    {
00137     if ( isActive() ) _f(m_stream);
00138     return *this;
00139   }
00141   MsgStream& operator<< (MSG::Level level)  {
00142     return report(level);
00143   }
00144   MsgStream& operator<<(longlong arg) {
00145     try {
00146       // this may throw, and we cannot afford it if the stream is used in a catch block
00147       if(isActive()) {
00148 #ifdef _WIN32
00149         int flg = m_stream.flags();
00150         char buf[128];
00151         (flg & std::ios::hex) ?
00152           ::sprintf(buf,"%I64x",arg) : ::sprintf(buf,"%I64d",arg);
00153         m_stream << buf;
00154 #else
00155         m_stream << arg;
00156 #endif
00157       }
00158     } catch (...) {}
00159     return *this;
00160   }
00161 
00163   MsgStream& operator<<(std::ios_base& (*_f)(std::ios_base&))    {
00164     if ( isActive() ) _f(m_stream);
00165     return *this;
00166   }
00167 
00169   long flags() const {
00170     return isActive() ? m_stream.flags()    : 0;
00171   }
00172   long flags(FLAG_TYPE v) {
00173     return isActive() ? m_stream.flags(v)  :  0;
00174   }
00175   long setf(FLAG_TYPE v) {
00176     return isActive() ? m_stream.setf(v)  :  0;
00177   }
00178   int width() const {
00179     return isActive() ? m_stream.width()    : 0;
00180   }
00181   int width(int v) {
00182     return isActive() ? m_stream.width(v)    : 0;
00183   }
00184   char fill() const {
00185     return isActive() ? m_stream.fill()     : (char)-1;
00186   }
00187   char fill(char v) {
00188     return isActive() ? m_stream.fill(v)     : (char)-1;
00189   }
00190   int precision() const  {
00191     return isActive() ? m_stream.precision(): 0;
00192   }
00193   int precision(int v) {
00194     return isActive() ? m_stream.precision(v): 0;
00195   }
00196   int rdstate() const  {
00197     return isActive() ? m_stream.rdstate () : std::ios_base::failbit;
00198   }
00199   int good() const  {
00200     return isActive() ? m_stream.good ()    : 0;
00201   }
00202   int eof() const  {
00203     return isActive() ? m_stream.eof ()     : 0;
00204   }
00205   int bad() const  {
00206     return isActive() ? m_stream.bad()      : 0;
00207   }
00208   long setf(FLAG_TYPE _f, FLAG_TYPE _m) {
00209     return isActive() ? m_stream.setf(_f, _m)   : 0;
00210   }
00211   void unsetf(FLAG_TYPE _l)    {
00212     if ( isActive() ) m_stream.unsetf(_l);
00213   }
00214   void clear(STATE_TYPE _i = std::ios_base::failbit)  {
00215     if ( isActive() ) m_stream.clear(_i);
00216   }
00217 
00219   GAUDI_API void setColor(MSG::Color col);
00221   GAUDI_API void setColor(MSG::Color fg, MSG::Color bg);
00222 
00224   GAUDI_API void resetColor();
00225 
00226 };
00227 
00229 inline MsgStream& endmsg(MsgStream& s) {
00230   return s.doOutput();
00231 }
00232 #if defined(GAUDI_V20_COMPAT) && !defined(G21_NO_ENDREQ)
00234 #define endreq endmsg
00235 #endif
00236 
00238 GAUDI_API std::string format(const char*, ... );
00239 
00240 #ifdef _WIN32
00241 template<class _E> inline
00242 MsgStream& operator<<( MsgStream& s, const std::_Fillobj<_E>& obj)    {
00243 #if _MSC_VER > 1300
00244   if ( s.isActive() ) s.stream().fill(obj._Fill);
00245 #else
00246   if ( s.isActive() ) s.stream().fill(obj._Ch);
00247 #endif
00248   return s;
00249 }
00250 template<class _Tm> inline
00251 MsgStream& operator << (MsgStream& s, const std::_Smanip<_Tm>& manip) {
00252 #if _MSC_VER > 1300
00253   if ( s.isActive() ) (*manip._Pfun)(s.stream(), manip._Manarg);
00254 #else
00255   if ( s.isActive() ) (*manip._Pf)(s.stream(), manip._Manarg);
00256 #endif
00257   return s;
00258 }
00259 #elif defined (__GNUC__)
00260 inline MsgStream& operator << (MsgStream& s,
00261                                const std::_Setiosflags &manip) {
00262   try {
00263     // this may throw, and we cannot afford it if the stream is used in a catch block
00264     if ( s.isActive() ) s.stream() << manip;
00265   } catch(...) {}
00266   return s;
00267 }
00268 inline MsgStream& operator << (MsgStream& s,
00269                                const std::_Resetiosflags &manip)      {
00270   try {
00271     // this may throw, and we cannot afford it if the stream is used in a catch block
00272     if ( s.isActive() ) s.stream() << manip;
00273   } catch (...) {}
00274   return s;
00275 }
00276 inline MsgStream& operator << (MsgStream& s,
00277                                const std::_Setbase &manip)    {
00278   try {
00279     // this may throw, and we cannot afford it if the stream is used in a catch block
00280     if ( s.isActive() ) s.stream() << manip;
00281   } catch (...) {}
00282   return s;
00283 }
00284 inline MsgStream& operator << (MsgStream& s,
00285                                const std::_Setprecision &manip)       {
00286   try {
00287     // this may throw, and we cannot afford it if the stream is used in a catch block
00288     if ( s.isActive() ) s.stream() << manip;
00289   } catch (...) {}
00290   return s;
00291 }
00292 inline MsgStream& operator << (MsgStream& s,
00293                                const std::_Setw &manip)       {
00294   try {
00295     // this may throw, and we cannot afford it if the stream is used in a catch block
00296     if ( s.isActive() ) s.stream() << manip;
00297   } catch (...) {}
00298   return s;
00299 }
00300 
00301 namespace MSG {
00302   inline
00303   MsgStream& dec(MsgStream& log) {
00304     log.setf(std::ios_base::dec, std::ios_base::basefield);
00305     return log;
00306   }
00307   inline
00308   MsgStream& hex(MsgStream& log) {
00309     log.setf(std::ios_base::hex, std::ios_base::basefield);
00310     return log;
00311   }
00312 }
00313 
00314 #else // GCC, version << 3
00316 template<class _Tm> inline
00317 MsgStream& operator << (MsgStream& s, const std::smanip<_Tm>& manip)  {
00318   try {
00319     // this may throw, and we cannot afford it if the stream is used in a catch block
00320     if ( s.isActive() ) s.stream() << manip;
00321   } catch (...) {}
00322   return s;
00323 }
00324 #endif    // WIN32 or (__GNUC__)
00325 
00327 template <typename T>
00328 MsgStream& operator<< (MsgStream& lhs, const T& arg)  {
00329   using namespace GaudiUtils;
00330   if(lhs.isActive())
00331     try {
00332       // this may throw, and we cannot afford it if the stream is used in a catch block
00333       lhs.stream() << arg;
00334     }
00335     catch (...) {}
00336   return lhs;
00337 }
00338 
00339 #ifdef __GNUC__
00341 template<typename T>
00342 MsgStream& operator << (MsgStream& lhs, const std::_Setfill<T> &manip) {
00343   if ( lhs.isActive() )
00344     try {
00345       // this may throw, and we cannot afford it if the stream is used in a catch block
00346       lhs.stream() << manip;
00347     } catch(...) {}
00348   return lhs;
00349 }
00350 #endif
00351 
00352 #endif    // GAUDIKERNEL_MSGSTREAM_H
00353 

Generated at Mon May 3 12:14:20 2010 for Gaudi Framework, version v21r9 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004