// $Id: MsgStream.h,v 1.41 2007/04/05 10:30:47 hmd Exp $ #ifndef GAUDIKERNEL_MSGSTREAM_H #define GAUDIKERNEL_MSGSTREAM_H // Include files #include "GaudiKernel/IMessageSvc.h" // Standard C++ classes #include #include #include #include #include /** * @class MsgStream MsgStream.h GaudiKernel/MsgStream.h * * Definition of the MsgStream class used to transmit messages. * This class is intended to ease the use of error logging to the message * service * * @author M.Frank * @author Sebastien Ponce */ class MsgStream { private: /** Error return code in case ios modification is requested for inactive * streams */ typedef std::ios_base::fmtflags FLAG_TYPE; typedef std::ios_base::iostate STATE_TYPE; protected: /// Pointer to message service if buffer has send IMessageSvc* m_service; /// Use standard string for information buffering std::string m_buffer; /// Use std::string for source information to be passed to the message service std::string m_source; /// String MsgStream associated to buffer std::ostringstream m_stream; /// Flag set to true if formatting engine is active bool m_active; /// Debug level of the message service MSG::Level m_level; /// Current debug level MSG::Level m_currLevel; /// use colors bool m_useColors; public: /// Standard constructor: Connect to message service for output MsgStream(IMessageSvc* svc, int buffer_length=128); /// Standard constructor: Connect to message service for output MsgStream(IMessageSvc* svc, const std::string& source, int buffer_length=128); /// Copy constructor MsgStream(const MsgStream& msg) : m_service(msg.m_service), m_source(msg.m_source), m_active(msg.m_active), m_level(msg.m_level), m_useColors(msg.m_useColors) { } /// Standard destructor virtual ~MsgStream(); /// Initialize report of new message: activate if print level is sufficient. MsgStream& report(int lvl) { lvl = (lvl >= MSG::NUM_LEVELS) ? MSG::ALWAYS : (lvl= level()) ? activate() : deactivate(); return *this; } /// Output method virtual MsgStream& doOutput(); /// Access string buffer const std::string& buffer() const { return m_buffer; } /// Access string MsgStream std::ostringstream& stream() { return m_stream; } /// Update outputlevel void setLevel(int level) { level = (level >= MSG::NUM_LEVELS) ? MSG::ALWAYS : (level inline MsgStream& operator<<( MsgStream& s, const std::_Fillobj<_E>& obj) { #if _MSC_VER > 1300 if ( s.isActive() ) s.stream().fill(obj._Fill); #else if ( s.isActive() ) s.stream().fill(obj._Ch); #endif return s; } template inline MsgStream& operator << (MsgStream& s, const std::_Smanip<_Tm>& manip) { #if _MSC_VER > 1300 if ( s.isActive() ) (*manip._Pfun)(s.stream(), manip._Manarg); #else if ( s.isActive() ) (*manip._Pf)(s.stream(), manip._Manarg); #endif return s; } #elif defined (__GNUC__) inline MsgStream& operator << (MsgStream& s, const std::_Setiosflags &manip) { if ( s.isActive() ) s.stream() << manip; return s; } inline MsgStream& operator << (MsgStream& s, const std::_Resetiosflags &manip) { if ( s.isActive() ) s.stream() << manip; return s; } inline MsgStream& operator << (MsgStream& s, const std::_Setbase &manip) { if ( s.isActive() ) s.stream() << manip; return s; } inline MsgStream& operator << (MsgStream& s, const std::_Setprecision &manip) { if ( s.isActive() ) s.stream() << manip; return s; } inline MsgStream& operator << (MsgStream& s, const std::_Setw &manip) { if ( s.isActive() ) s.stream() << manip; return s; } namespace MSG { inline MsgStream& dec(MsgStream& log) { log.setf(std::ios_base::dec, std::ios_base::basefield); return log; } inline MsgStream& hex(MsgStream& log) { log.setf(std::ios_base::hex, std::ios_base::basefield); return log; } } #else // GCC, version << 3 /// I/O Manipulator for setfill template inline MsgStream& operator << (MsgStream& s, const std::smanip<_Tm>& manip) { if ( s.isActive() ) s.stream() << manip; return s; } #endif // WIN32 or (__GNUC__) /// General templated stream operator template MsgStream& operator<< (MsgStream& lhs, const T& arg) { if(lhs.isActive()) lhs.stream() << arg; return lhs; } /// Specialization stream operator for std::vector template MsgStream& operator<< (MsgStream& lhs, const std::vector& v ) { if(lhs.isActive()) for ( typename std::vector::const_iterator i = v.begin(); i != v.end(); ++i ) { lhs.stream() << *i << " "; } return lhs; } /// Specialization stream operator for std::vector template MsgStream& operator<< (MsgStream& lhs, const std::vector& v ) { if(lhs.isActive()) for ( typename std::vector::const_iterator i = v.begin(); i != v.end(); ++i ) { lhs.stream() << *i << " "; } return lhs; } #ifdef __GNUC__ /// compiler is stupid. Must specialize template MsgStream& operator << (MsgStream& lhs, const std::_Setfill &manip) { if ( lhs.isActive() ) lhs.stream() << manip; return lhs; } #endif #endif // GAUDIKERNEL_MSGSTREAM_H