MsgStream.h
Go to the documentation of this file.00001
00002 #ifndef GAUDIKERNEL_MSGSTREAM_H
00003 #define GAUDIKERNEL_MSGSTREAM_H
00004
00005
00006 #include "GaudiKernel/IMessageSvc.h"
00007 #include "GaudiKernel/SerializeSTL.h"
00008
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 {
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
00116 MsgStream& flush() {
00117 if ( isActive() ) m_stream.flush();
00118 return *this;
00119 }
00120
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
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
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
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
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
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
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
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
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
00346 lhs.stream() << manip;
00347 } catch(...) {}
00348 return lhs;
00349 }
00350 #endif
00351
00352 #endif // GAUDIKERNEL_MSGSTREAM_H
00353